我想通过SPI从arduino Due读取AD7124-8的数据。我找到了几个库,但我没有从我的ADC模块得到任何回报。通过使用示波器,我确保我的Arduino通过MOSI, SCK和CS工作发送数据。仅仅是MISO数据并不能让我得到任何回复。
我第一次使用这个库(https://github.com/NHBSystems/NHB_AD7124),但还是决定使用更简单的代码来确保一切正常。我试图与通信寄存器交谈,以从ID寄存器中获取我的设备的ID。您可以在数据表第39页找到寄存器:https://www.analog.com/en/products/ad7124-8.html。
我发送0x00和0x05来获取0x14,这应该是正确的ID。只有0到达(由Osci显示)。我在论坛上找到了一个解决方案,但我不确定为什么它与数据表不同:https://ez.analog.com/data_converters/precision_adcs/f/q-a/24046/ad7124-8-for-arduino-due当我使用它时,代码在以下行停止运行:value[0] = SPI.transfer(0x00);他们也开始发送0 x40。
下面是我的简单代码:
#include <SPI.h>
// Physical Pins
const int csPin = 10;
int value[7] {0};
void setup() {
Serial.begin (9600);
pinMode(10,OUTPUT);
SPI.begin(10);
SPI.setClockDivider(10, 128);
SPI.setDataMode(SPI_MODE3);
}
void loop() {
digitalWrite(csPin, LOW);
//SPI.transfer(csPin, 0x00);
SPI.transfer(csPin,0x00,SPI_CONTINUE); //Tell Communication Register you are going to read ID register
SPI.transfer(csPin,0x05);
//SPI.transfer(csPin,0x00); //Get data from Communication Register
delay(1);
digitalWrite(csPin, HIGH);
delay(1);
Serial.print(value[0],HEX);
}
我希望有人能帮助我。问候首先,这可能与您的问题无关,但您正在使用自2014年以来已弃用的旧SPI方法setClockDivider()
,setDataMode()
和setBitOrder()
。建议使用事务性SPI api,我在这里有一些解释。
其次,根据数据表第85页,要访问ID寄存器,您需要发送一个字节到您需要与之通信的特定寄存器。您的代码发送两个字节,0x00
和0x05
,这是不正确的。
此外,根据数据表第78页,为了读取寄存器,需要将第6位设置为1进行读操作,将第6位设置为0进行写操作。
尝试以下代码:
#include <SPI.h>
#define READ_REGISTER 0B01000000 // bit 6 set to 1 for read operation
#define ID_REGISTER 0x05
const int csPin = 10;
void setup() {
Serial.begin (9600);
digitalWrite(csPin, HIGH); // set csPin to HIGH to prevent false trigger
pinMode(csPin,OUTPUT);
SPI.begin();
}
void loop() {
SPI.beginTransaction(SPISettings(84000000/128, MSBFIRST, SPI_MODE3));
digitalWrite(csPin, LOW);
SPI.transfer(READ_REGISTER | ID_REGISTER); // read register 5
uint8_t id = SPI.transfer(0x00); // get the id
digitalWrite(csPin, HIGH);
SPI.endTransaction();
Serial.print(id,HEX);
}