Невозможно подключить AD7705 (SPI) к Arduino
Код, как показано ниже. Я не могу получить 16-битные данные. Может ли кто-нибудь помочь мне определить мою ошибку?
byte spiTransfer(volatile byte data) {
SPDR = data;
while (!(SPSR & _BV(SPIF)));
return SPDR;
}
#define DOUT (50)
#define DIN (51)
#define SCLK (52)
#define CS_AD7705 (53)
#define DRDY (4)
void setup() {
Serial.begin(9600);
pinMode(DOUT, OUTPUT);
pinM ode(DIN, INPUT);
pinMode(SCLK,OUTPUT);
pinMode(CS_AD7705,OUTPUT);
pinMode(DRDY,INPUT);
SPCR = _BV(SPE) | _BV(MSTR) | _BV(CPOL) | _BV(CPHA) | _BV(SPI2X) | _BV(SPR1) | _BV(SPR0);
delay(10);
digitalWrite(CS_AD7705, LOW);
spiTransfer(00010000); //настройка регистра
spiTransfer(01100110);
spiTransfer(00100000); //тактовый регистр
spiTransfer(00001000);
digitalWrite(CS_AD7705, HIGH);
}
void loop() {
unsigned int data=0;
digitalWrite(CS_AD7705,LOW); // включить устройство
while(!digitalRead(DRDY));
data = spiTransfer(00111000); // выбираем ch1 и настраиваем чтение 16-битного регистра данных
data = spiTransfer(0)<<8;
// Получить старшие 8 бит
Serial.println("data : "+data);
data |= spiTransfer(0); // Получить 8 младших бит
digitalWrite(CS_AD7705, HIGH); // освободить устройство
delay(1000);
Serial.println(data, HEX);
}
@vignajeth kk, 👍2
2 ответа
Я думаю, что главная проблема в значениях, которые вы передаете в spiTransfer(). По тому, как они написаны, я думаю, вы думаете, что передаете двоичные значения, но это не так, вы передаете десятичные значения. Так что
data = spiTransfer(00111000); // выбираем ch1 и настраиваем чтение 16-битных данных
должно быть
data = spiTransfer(B00111000); // выбираем ch1 и настраиваем чтение 16-битных данных
К номеру необходимо добавить префикс B
Также передача изменчивого параметра в эту функцию кажется мне неправильной, особенно если вы передаете только константы.
Я тоже пытался заставить что-то из этого работать. Я думаю, прежде чем вы сможете прочитать регистр данных, вы должны сообщить регистру COMM о своем намерении сделать это.
// Выберите канал для чтения:
// запись в com reg выбор канала и
// настройка следующей операции на чтение из регистра данных
SPI.transfer( DRDY_DONT_CARE | REG_DATA | STDBY_OFF | COMMS_READ | CHAN_AIN1 );
// Выполняем два 8-битных чтения, сначала MSByte
highByte = SPI.transfer(0xff);
lowByte = SPI.transfer(0xff);
adcValue0 = highByte << 8;
adcValue0 = adcValue0 | lowByte;
Тем не менее, у меня были нестабильные и прерывистые успехи в чтении АЦП. Циклический код, похоже, теряет синхронизацию с АЦП; я предполагал, что чтение ASAP после того, как DRDY становится True, важно.
Вы проверили, что ваш интерфейс SPI работает? Вы можете прочитать 24-битные калибровочные данные, которые должны соответствовать задокументированным значениям. Это подтверждает, что SPI правильно считывает и записывает, если только интерфейс SPI не ведет себя по-разному для разных функций. Вы используете подлинный кремний Analog Devices или одну из широко распространенных подделок (TM7705, как у меня)?
- Как использовать SPI на Arduino?
- Путаница между SPI и I2C для SSD1306 OLED
- Неправильная документация для выводов Mega2560 SPI?
- Взаимодействие с датчиком SSI?
- Ответ нескольких ведомых устройств (Arduino Mega 2560) через SPI
- SPI с преобразователем уровня на другом конце соединения
- Проблема с выводом MISO в SPI
- Можно ли подключить много (20+) датчиков SPI к Arduino Mega?