I am having trouble configuring Arduino Due SPI to an AD7490 ADC.
Here is how I have the pins connected:
- +3.3V > 7490 pin 22 Vin
- +3.3V > 7490 Vref
- DUE CS (8) > 7490 pin 20 SS - slave select)
- DUE SCK > 7490 pin 16 (SCK - clock)
- DUE MOSI > 7490 pin 19 (MOSI - data out)
- Ground > 7490 pin 24 (all ground lines are tied together)
- DUE MISO > 7490 pin 15
Below is my code, I feel like I am writing the correct bits into the register. The problem I think I'm having is getting the timing write. The code is a simple attempt to read a single channel.
#include <SPI.h>
// Set Constants
const int adcChipSelectPin = 8; // set pin 8 as the chip select for the
ADC:
// Start setup function:
void setup() {
pinMode (adcChipSelectPin, OUTPUT);
// set the ChipSelectPins high initially:
digitalWrite(adcChipSelectPin, HIGH);
// initialise SPI:
SPI.begin();
SPI.setBitOrder(MSBFIRST); // Not strictly needed but just to be
sure.
SPI.setDataMode(SPI_MODE0); // Not strictly needed but just to be
sure.
Serial.begin(9600);
//Clock Speed: Master clock/divider
//84Mhz/64 = 1.3 MHz
SPI.setClockDivider(SPI_CLOCK_DIV64);
} // End setup function.
// Start loop function:
void loop() {
float voltage[2];
for (int i = 0; i < 3; i++) {
voltage[i] = readAdc(0, 0);
}
}// End of loop function.
//Function to read the ADC, accepts the channel to be read.
float readAdc(int channel, int slave) {
float value;
if (slave == 0) {
noInterrupts(); // disable interupts to prepare to send address data to the
ADC.
digitalWrite(adcChipSelectPin, LOW); // take the Chip Select pin low to
select the ADC.
byte FirstByte = 0b10000011;
byte SecondByte = 0b00110000;
SPI.transfer(FirstByte);
byte response1 = SPI.transfer(SecondByte);
byte response2 = SPI.transfer(0x00);
digitalWrite(adcChipSelectPin, HIGH); // take the Chip Select pin high to
de-select the ADC.
interrupts(); // Enable interupts.
Serial.println(response1);
Serial.println(response2);
}
The serial.prints output 255 consistently. In my experience this means the SPI is configured incorrectly.
Any pointers are appreciated.
SPI.transfer(FirstByte); SPI.transfer(SecondByte); digitalWrite(adcChipSelectPin, HIGH); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); digitalWrite(adcChipSelectPin, LOW); byte response1 = SPI.transfer(0x00); byte response2 = SPI.transfer(0x00);
. The fivenop
s are for respecting the 50nm "t_quiet" time requested in the datasheetSPI.transfer(read channel 0); CS high, nops, CS low; byte result_ch0 = SPI.transfer(read channel 1); CS high, ..[repeat as many times you need].. , CS low; byte result_chN = SPI.transfer(0x00);