This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
你好
我正在尝试使用 ADS124s08读取电池的电压
AVDD = 5V
DVDD = 3.3V
我正在尝试检查从微控制器到 ADC 的 SPI 通信
正在使用 WREG 命令编写04h 的数据寄存器,并尝试使用 RREG 命令重新读取数据。 但是,当我使用 RREG 命令并传输 NOP 以获取寄存器值时,错误行上不会反映任何内容。 相反,即使 NOP (00h)也在 MOSI 行中得到反映
请帮我解决这个问题。
我已经附加了代码和逻辑分析器文件
#include <SPI.h>
内部 Cs = 10;
Int miso = 12;
内部模式=11;
内部 SCLK = 13;
UINT8_t 虚拟;
国际一级;
UINT8_t ulDataTx[3];
UINT8_t ulDataRx[3];
SPISettings mySPISettings (4000000,MSFIRST,SPI_MODE1);
void setup(){
//将您的设置代码放在此处,运行一次:
PinMode (SCLK,输出);
PinMode (mosi,输出);
PinMode (输入错误);
PintMode (cs,输出);
SPI.begin();
SPI.beginTransaction(mySPISettings);
DigitalWrite (CS,低);
延迟(10);
SPI.TRANSFER (0x06);//重置命令
延迟(10);
DigitalWrite (cs,高);
SPI.endTransaction ();
Serial.begin(9600);
延迟(1000);
}
void loo(){
//将主代码放在此处重复运行:
DigitalWrite (CS,低);
延迟(10);
SPI.begin();
SPI.beginTransaction(mySPISettings);
//延迟(10);
//SPI.transfer (0x06);
//延迟(10);
//SPI.endTransaction();
//SPI.beginTransaction(mySPISettings);
延迟(10);
//SPI.transfer (0xAA);
//延迟(10);
//SPI.transfer (0x55);
//延迟(10);
//dummy = SPI.transfer (0x00);
UINT8_t ulDataTx[3];
ulDataTx[0]= 0x40 +(0x04和0x1f);/WREG 命令,用于4小时
ulDataTx[1]= 0x00;
ulDataTx[2]= 0x18;
//selectDeviceCSLow();
SPI.transfer (ulDataTx[0]);
delayMicroseconds (100);
SPI.transfer (ulDataTx[1]);
delayMicroseconds (100);
SPI.transfer (ulDataTx[2]);
//releaseChipSelect();
延迟(10);
//SPI.endTransaction();
//digitalWrite (cs,高);
//延迟(10);
字节 temp2;
字节 temp1;
字节 temp0;
serial.println(temp2);
serial.println(temp1);
serial.println(temp0);
//SPI.beginTransaction(mySPISettings);
//将 CS 设置为低以选择设备:
//digitalWrite (cs,低);
延迟(10);
//向设备发送读取命令以开始读取:
SPI.TRANSFER (0x24);/RREG 命令,用于4小时
SPI.transfer (0x00);
TEMP1 = SPI.TRANSFER (0x00);
serial.println (temp1,十六进制);
//temp0 = SPI.TRANSFER (0x00);
延迟(10);
DigitalWrite (cs,高);
延迟(10);
SPI.endTransaction ();
}
您好,Amugh,
逻辑分析器镜头和代码非常有用,但您还可以向我发送原理图吗? 有几个注意事项:
此致,
鲍勃·B
嗨,Bob,
感谢您的建议。 我已经实施了所有这些措施。
现在,我可以写信给寄存器并读回它们的值。 但我在使用 RDATA 命令检索转换数据时遇到问题。
我已附上逻辑分析器的原理图,代码和剪刀。 请帮助我解决此问题
代码:
#include <SPI.h>
内部 Cs = 10;
Int miso = 12;
内部模式=11;
内部 SCLK = 13;
UINT8_t 虚拟,temp1;
UINT8_t i;
UINT8_t ulDataTx[3];
UINT8_t ulDataRx[3];
SPISettings mySPISettings (4000000,MSFIRST,SPI_MODE1);
void setup(){
//将您的设置代码放在此处,运行一次:
PinMode (SCLK,输出);
PinMode (mosi,输出);
PinMode (输入错误);
PintMode (cs,输出);
SPI.begin();
SPI.beginTransaction(mySPISettings);
Serial.begin(9600);
写入注册(0x01,0x80);
延迟(10);
写入注册(0x02,0x01);
延迟(10);
写入注册(0x03, 0x00);
延迟(10);
写入注册(0x04,0x5D);
延迟(10);
写入注册(0x05,0x10);
延迟(1000);
}
void loo(){
/*writeReg (0x01,0x80);
延迟(10);
写入注册(0x02,0x01);
延迟(10);
写入注册(0x03, 0x00);
延迟(10);
写入注册(0x04,0x5D);
延迟(10);
写入注册(0x05,0x10);*/
/*延迟(10);
UINT8_t ManC0 =读数注册(0x00);
serial.print (“第0个 Val”);
serial.println (ManC0,十六进制);
延迟(1);
UINT8_t val =读数注册(0x05);
serial.print (“第五个 Val”);
serial.println (val,hex);
延迟(1);
UINT8_t Manc =读数注册(0x01);
//Serial.println("The value is,Manc);
serial.print (“第一个 Val”);
serial.println (manc,hex);
延迟(1);
UINT8_t ManC1 =读数注册(0x02);
//Serial.println("The value is,ManC1);
serial.print (“第二个 Val”);
serial.println (ManC1,十六进制);
延迟(1);
UINT8_t ManC2 =读数注册(0x03);
//Serial.println("The value is,Manc2);
serial.print (“第三个 Val”);
serial.println (manC2,十六进制);
延迟(1);
UINT8_t ManC3 =读数注册(0x04);
//Serial.println("The value is,Manc3);
serial.print (“第4个 Val”);
serial.println (ManC3,十六进制);
延迟(1);*
/*for (I=0x00;I<=0x0B;I++)
{
serial.println (readReg (i),hex);
serial.println("");
}*/
readData1();
}
UINT8_t 读数注册(uint8_t reg)
{
DigitalWrite (CS,低);
延迟(10);
UINT8_t 编号= 0x20 + REG;
SPI.transfer (number);
SPI.transfer (0x00);
TEMP1 = SPI.TRANSFER (0x00);
延迟(10);
DigitalWrite (cs,高);
延迟(10);
返回(temp1);
}
无效写入注册(uint8_t Regnum, uint8_t data)
{
DigitalWrite (CS,低);
延迟(10);
UINT8_t ulDataTx[3];
ulDataTx[0]= 0x40 +(RegNum & 0x1f);
ulDataTx[1]= 0x00;
ulDataTx[2]=数据;
SPI.transfer (ulDataTx[0]);
SPI.transfer (ulDataTx[1]);
SPI.transfer (ulDataTx[2]);
延迟(10);
DigitalWrite (cs,高);
延迟(10);
}
无效的 readData1()
{
字节模板;
字节 tempb;
字节 tempe;
//Serial.println(temp2);
//Serial.println (temp1);
//Serial.println(temp0);
//SPI.beginTransaction(SPISettings(SPEED,MSFIRST,SPI_MODE1);
//将 CS 设置为低以选择设备:
DigitalWrite (CS,低);
延迟(10);
//向设备发送读取命令以开始读取:
SPI.transfer (0x12);
tempe = SPI.transfer (0x00);
//delayMicroseconds (10);
tempb = SPI.transfer (0x00);
//delayMicroseconds (10);
Tempa = SPI.transfer (0x00);
延迟(10);
DigitalWrite (cs,高);
延迟(10);
//SPI.endTransaction();
serial.println("after trans");
serial.println(temc);
serial.println(temb);
serial.println(Tema);
字节结果=(tempc<<16)|(tempb<8)|(Tema);
serial.print (“结果:”);
serial.println (结果,十六进制);
}
您好,Amugh,
我看到示意图有几个问题。 一是启动/同步引脚浮动。 当 Low 使用设备命令启动和停止转换时,此引脚将被关闭。 当针脚高时,ADC 将始终处于转换模式。 我建议现在将这根销钉固定到地面上。
我看到的最大问题和最可能导致问题的问题是 CLK 针脚的连接方式。 CLK 引脚是设备的主时钟引脚,需要连续时钟。 目前,此引脚连接到 SCLK,SCLK 是间歇性的,频率错误。 将此引脚设为接地,以便内部振荡器启动并成为 ADC 的主时钟。
此致,
鲍勃·B
嗨,Bob,
感谢您的建议。 我按照您的建议对原理图进行了必要的更改。 使用 RDATA 命令时,我会在串行监视器上看到数据。 但是,当 AIN0和 AINCOM 引脚都接地时, 将出现941EB (随机)等值,当 AIN0和 AINCOM 之间连接了1.5V 电池时,将生成7FFFFF。 可能出现什么错误?
请帮我解决这个问题
代码:
#include <SPI.h>
内部 Cs = 10;
Int miso = 12;
内部模式=11;
内部 SCLK = 13;
UINT8_t 虚拟,temp1;
UINT8_t i;
UINT8_t ulDataTx[3];
UINT8_t ulDataRx[3];
SPISettings mySPISettings (4000000,MSFIRST,SPI_MODE1);
void setup(){
//将您的设置代码放在此处,运行一次:
PinMode (SCLK,输出);
PinMode (mosi,输出);
PinMode (输入错误);
PintMode (cs,输出);
SPI.begin();
SPI.beginTransaction(mySPISettings);
Serial.begin(9600);
写入注册(0x01,0x00);
延迟(10);
写入注册(0x02,0x0C);
延迟(10);
/*writeReg (0x03,0x00);
延迟(10);
写入注册(0x04,0x5D);
延迟(10);*
写入注册(0x05,0x0A);
延迟(1000);
DigitalWrite (CS,低);
延迟(10);
SPI.transfer (0x08);
延迟(10);
DigitalWrite (cs,高);
}
void loo(){
对于(I=0x00;I<=0x07;I++)
{
serial.println (readReg (i),hex);
serial.println("");
}
readData1();
}
UINT8_t 读数注册(uint8_t reg)
{
DigitalWrite (CS,低);
延迟(10);
UINT8_t 编号= 0x20 + REG;
SPI.transfer (number);
SPI.transfer (0x00);
TEMP1 = SPI.TRANSFER (0x00);
延迟(10);
DigitalWrite (cs,高);
延迟(10);
返回(temp1);
}
无效写入注册(uint8_t Regnum, uint8_t data)
{
DigitalWrite (CS,低);
延迟(10);
UINT8_t ulDataTx[3];
ulDataTx[0]= 0x40 +(RegNum & 0x1f);
ulDataTx[1]= 0x00;
ulDataTx[2]=数据;
SPI.transfer (ulDataTx[0]);
SPI.transfer (ulDataTx[1]);
SPI.transfer (ulDataTx[2]);
延迟(10);
DigitalWrite (cs,高);
延迟(10);
}
无效的 readData1()
{
字节模板;
字节 tempb;
字节 tempe,tempd, tempe;
//Serial.println(temp2);
//Serial.println (temp1);
//Serial.println(temp0);
//SPI.beginTransaction(SPISettings(SPEED,MSFIRST,SPI_MODE1);
//将 CS 设置为低以选择设备:
DigitalWrite (CS,低);
延迟(10);
//向设备发送读取命令以开始读取:
SPI.transfer (0x13);
tempe = SPI.transfer(0xff);
//delayMicroseconds (10);
tempb = SPI.transfer (0xff);
//delayMicroseconds (10);
Tempa = SPI.transfer (0xff);
tempd= SPI.transfer(0xff);
Tempe = SPI.transfer (0xff);
延迟(10);
DigitalWrite (cs,高);
延迟(10);
//SPI.endTransaction();
serial.println("after trans");
serial.println (tempe,hex);
serial.println (tempb,hex);
serial.println (Tempa,十六进制);
Word 结果=(tempc<<16)|(tempb<8)|(Tema);
serial.print (“结果:”);
serial.println (结果,十六进制);
}
您好,Amugh,
您是否可以重新向我发送修正后的原理图,以便我验证是否已进行了所有必需的更改? 此外,如果您使用内部参考,则必须在 REFOUT 和 REFCOM 之间设定一个上限,否则参考将不稳定。
您是否已通过读回寄存器数据来验证寄存器写入是否有效? 此外,在寄存器4中,不要写入使用外部时钟的设置,因此请在此处使用默认设置。
收集数据时,NOP 命令为0x00,而不是0xFF。 您能给我发送通信中的 Saleae 图解吗?
此致,
鲍勃·B