|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
|
|
Thread Tools | Rate Thread | Display Modes |
|
|
|
#1
|
|||
|
|||
|
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.
Last edited by sanddrag : 18-05-2011 at 01:35. |
|
#2
|
|||
|
|||
|
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;
}
}
|
|
#3
|
|||
|
|||
|
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? |
|
#4
|
|||
|
|||
|
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 ... |
|
#5
|
|||
|
|||
|
Re: Help with Arduino and SPI
FYI - "Arduino Cookbook" chapter 13 has multiple examples of Communicating Using I2C and SPI with multidigit segmented displays
|
|
#6
|
|||
|
|||
|
Re: Help with Arduino and SPI
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.
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|