Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Programming (http://www.chiefdelphi.com/forums/forumdisplay.php?f=51)
-   -   Help with Arduino and SPI (http://www.chiefdelphi.com/forums/showthread.php?t=95236)

sanddrag 17-05-2011 04:26

Help with Arduino and SPI
 
I'm slowly learning Arduino, and I'd like some help interfacing to an SPI device. The device is connected to the proper pins on an Arduino Uno. I understand in concept how it works. I need to send it 16 bits: 8 bits to specify the register, and 8 to make it do something based on the tables in the reference document. And the most significant bit comes first. However, I'm a little hung up on the exact code to make it start doing something. I've only gotten as far as defining all the registers as constants by their hex values. Is that correct? Can anyone who is familiar with such things perhaps provide a simple code example? I searched and couldn't find anything similar that made sense to me.

StevenB 17-05-2011 09:22

Re: Help with Arduino and SPI
 
Here's some code from my optical mouse project. mDataPin and mClockPin are just integers that refer to the specific pins being manipulated.

Code:

/**
 * Writes an 8-bit value to one of the optical mouse's registers.
 *
 * \param address  The register address to write to.  Valid registers for the ADNS-2610 are 0x00
 * through 0x11.
 * \param value  The value to write.
 */
void Mouse::writeRegister(uint8 address, uint8 value)
{
  address = address | 0x80; // Most significant bit is always 1, since we're doing a write (This only applies to the mouse chip)
  pinMode(mDataPin, OUTPUT); // Only necessary if mDataPin is sometimes used as an input

  // We start by writing the most significant bit first
  for(int i = 0; i < 8; i++)
  {
    digitalWrite(mClockPin, 0); // Set the clock pin low
    digitalWrite(mDataPin, address & 0x80); // Set the data to the next bit
    digitalWrite(mClockPin, 1); // Set the clock pin high
    // Now the chip reads the data pin while we go around the loop
    address = address << 1; // Shift to the next bit
  }

  // Now write the data in exactly the same way
  for(int i = 0; i < 8; i++)
  {
    digitalWrite(mClockPin, 0);
    digitalWrite(mDataPin, value & 0x80);
    digitalWrite(mClockPin, 1);
    value = value << 1;
  }

}


sanddrag 17-05-2011 22:54

Re: Help with Arduino and SPI
 
I sort of understand the above with the exception of exactly what you're doing with the bit shift.

Has anyone here used the SPI library with Arduino?

unclewaldo 17-05-2011 23:27

Re: Help with Arduino and SPI
 
Try getting a copy of "Arduino Cookbook" [O'Reilly Books] by Michael Margolis
[ISBN978-0-596-80247-9] page 418 ..Chap 13 / problem 13.8 Driving Multidigit, 7-segment Displays Using SPI ... this might be helpful to understand and also for code ...

unclewaldo 17-05-2011 23:31

Re: Help with Arduino and SPI
 
FYI - "Arduino Cookbook" chapter 13 has multiple examples of Communicating Using I2C and SPI with multidigit segmented displays

sanddrag 18-05-2011 01:36

Re: Help with Arduino and SPI
 
Quote:

Originally Posted by unclewaldo (Post 1062144)
Try getting a copy of "Arduino Cookbook" [O'Reilly Books] by Michael Margolis
[ISBN978-0-596-80247-9] page 418 ..Chap 13 / problem 13.8 Driving Multidigit, 7-segment Displays Using SPI ... this might be helpful to understand and also for code ...

Got the book. That really helps. I was missing the concept of setting the chip select pin low, writing the two bytes, then setting it high. Got my device working now. Thanks.


All times are GMT -5. The time now is 23:27.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi