Registered Member #2140
Joined: Tue May 26 2009, 09:16PM
Location:
Posts: 53
|
I have an AD7856 on a breakout board I am trying to get to work for use in my Helicopter autopilot project. The AD7856 is connected to an XC-1A board (centered around the XS1-G4 processor), but uses C (modified into XC for threading purposes).
At this point, I am just trying to read the status register. Using the data sheet, this is what i came up to send to it:
11100101 11010001 Which in Hex, is 0xE5 and 0xD5. The next read should return 16bits for the status register. The read method looks like this
unsigned int spi_in_word(spi_master_interface &i)
{
// big endian byte order
unsigned int data = 0;
data |= (spi_in_byte(i) << 24);
data |= (spi_in_byte(i) << 16);
data |= (spi_in_byte(i) << 8);
data |= spi_in_byte(i);
return data;
} and out method:
void spi_out_word(spi_master_interface &i, unsigned int data)
{
// big endian byte order
spi_out_byte(i, (data >> 24) & 0xFF);
spi_out_byte(i, (data >> 16) & 0xFF);
spi_out_byte(i, (data >> 8) & 0xFF);
spi_out_byte(i, data & 0xFF);
} I am unsure about what these are actually doing. When It is sending, does it send as an 8-bit word? I do:
spi_out_word(spi_if, 0xE5);
spi_out_word(spi_if, 0xD1); And when I read, the ADC should be sending 2 8-bit words (i think). Is this method receiving all 16bits? When i read, this is what i get:
7FCFFFFE
FF9FFFFE Every read after this, without writing, yields the same "FF9FFFFE".
According to the data-sheet, the first bit should always be 0, and this is not. I have also, instead of sending out a word, sending a byte, which gives:
65D1FFFE
FF9FFFFE
This is the main method of the code:
spi_init(spi_if, 4);
delay(250);
spi_select();
spi_out_byte(spi_if, 0xE5);
spi_out_byte(spi_if, 0xD1);
spi_deselect();
delay(10);
spi_select();
word = spi_in_word(spi_if);
word1 = spi_in_word(spi_if);
printhexln(word);
printhexln(word1);
spi_deselect();
spi_shutdown(spi_if); select() pulls the chip select low.
|