主题中讨论的其他器件:ADS124S08
您好、SIR/MAA 是、
实际上、我想将 ADS124S08 ADC 与 Arduino UNO 连接。 首先、我通过短接 JP1跳线禁用了 Tiva 处理器、现在我已将 J3的硬件侧 SPI 引脚连接到 Arduino UNO 、而我的输入侧硬件是 J8配置的应变片
SCLK =13;
MOSI =11;
MISO = 12;
起始= 6;
RESET=7;
CS=4;
代码如下所示
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.
您好、SIR/MAA 是、
实际上、我想将 ADS124S08 ADC 与 Arduino UNO 连接。 首先、我通过短接 JP1跳线禁用了 Tiva 处理器、现在我已将 J3的硬件侧 SPI 引脚连接到 Arduino UNO 、而我的输入侧硬件是 J8配置的应变片
SCLK =13;
MOSI =11;
MISO = 12;
起始= 6;
RESET=7;
CS=4;
代码如下所示
尊敬的 Bob:
感谢您的解释。 实际上、我也更改了代码、正如您说过 的、我错误的循环解压、我也更改了。 我还提供了 RDATA 命令后的延迟。 但是、当我在 Arduino 上载代码时、我在串行监视器上观察到只有3位数据、而我们的 ADC 为24位、因此 其范围应为0至2^23、但数据介于0至255之间。 我的代码如下:
#include
#include
#define start 6.
#define RESET 7
const int CS = 4;
int stat;
int stat1;
int stat2;
SPI 设置设置1 (4000000、MSBFIRST、SPI_MODE1);
void setup(){
SPI.begin();
引脚模式(CS、输出);
引脚模式(RESET、输出);
引脚模式(启动、输出);
digitalWrite (重置,高电平);
延迟(1000);
Serial.begin(9600);
SPI.beginTransaction(settings1);
digitalWrite (CS、low);
digitalWrite (start、low);
}
void loop(){
for (int i=0;i<=5;i++)
{
if (i=0){
SPI.transfer (0x42);// WREG 寄存器地址
SPI.transfer (0x02);// WREG 字节编号-1
SPI.transfer (0x24);// WREG 写入 AIN2-AIN4
SPI.transfer (0x07);128增益
SPI.transfer (0x1E);//数据速率为4000 SPS
SPI.transfer (0x12);//RDATA 命令
delayMicroseconds (1000);
}
其他
{
SPI.transfer (0x08);//开始转换命令
STAT = SPI.transfer (0);//从 MISO 获取数据
serial.println (stat);
}
}
spi.endTransaction();
}
您好、Sushmita、
请参阅下面我的评论。 您似乎交换了 RDATA 和 START 命令。 您还需要确保在读取结果之前等待每次转换完成。
此致、
Bob B
[引用用户="Sushmita Chaudhary"]
尊敬的 Bob:
感谢您的解释。 实际上、我也更改了代码、正如您说过 的、我错误的循环解压、我也更改了。 我还提供了 RDATA 命令后的延迟。 但是、当我在 Arduino 上载代码时、我在串行监视器上观察到只有3位数据、而我们的 ADC 为24位、因此 其范围应为0至2^23、但数据介于0至255之间。 我的代码如下:
#include
#include
#define start 6.
#define RESET 7
const int CS = 4;
int stat;
int stat1;
int stat2;
SPI 设置设置1 (4000000、MSBFIRST、SPI_MODE1);
void setup(){
SPI.begin();
引脚模式(CS、输出);
引脚模式(RESET、输出);
引脚模式(启动、输出);
digitalWrite (重置,高电平);
延迟(1000);//[BOB]此延迟必须足够长、以便器件在开始任何通信之前启动;如果延迟是指每个计数1ms、则延迟将足够。
Serial.begin(9600);
SPI.beginTransaction(settings1);
digitalWrite (CS、low);
digitalWrite (start、low);
}
void loop(){
for (int i=0;i<=5;i++)
{
if (i=0){
SPI.transfer (0x42);// WREG 寄存器地址
SPI.transfer (0x02);// WREG 字节编号-1
SPI.transfer (0x24);// WREG 写入 AIN2-AIN4
SPI.transfer (0x07);128增益
SPI.transfer (0x1E);//数据速率为4000 SPS
SPI.transfer (0x12);//RDATA 命令[BOB]由于两个原因、此命令毫无意义。 一个是尚未进行转换、第二个原因是命令未完成。 RDATA 命令后跟从器件读取的3字节数据。 本应该在此处发送的是用于启动转换的 START 命令(0x08)。 此处的命令应为:
SPI.transfer (0x08);//开始转换命令
delayMicroseconds (1000);
}
其他
{
spi.transfer (0x08);//开始转换命令[BOB]在此处启动转换、但没有时间完成转换、因此此时从器件读取的任何数据都将毫无意义。 在这里、您应该已经发出 RDATA 命令来读取数据、然后发出3个字节的 NOP 来检索数据。 因此、您在代码中交换了 START 和 RDATA 命令。 此外、由于您不使用 CS、因此未完成上一条命令、因此这实际上是 RDATA 命令的第一个检索字节。 当 CS 保持低电平时、应使用 SPI 超时功能、该功能通过将系统控制寄存器(0x09)中的 TIMEOUT 位设置为1来启用。 这将允许在超时周期后取消重置 SPI 接口的不完整命令(ADS124S08数据表第63页的第9.5.1.6节)。
命令应为:
SPI.transfer (0x12);//RDATA 命令
STAT = SPI.transfer (0);//从 MISO [BOB]获取数据原始 RDATA 命令仍然不完整,因此这实际上是 ADS124S08的中间字节3。 命令的其余部分应为:
STAT =(stat<<8)| SPI.transfer (0);//使用 RDATA 命令、第一次保存到 stat 是 MSB、这是中字节
STAT =(stat<<8)| spi.transfer (0);//使用 RDATA 命令、save to stat 包括 LSB、它现在是32...no的24位、需要负值的符号扩展。
//在此处添加符号扩展代码以实现负值
serial.println (stat);//[Bob]由于您在原始代码中只捕获1个字节,因此您只传输一个字节。 当'stat'被声明为整数时、您还必须将24位二进制补码结果符号扩展到32位。
delayMicroseconds (250);// [Bob]您还需要一个额外的延迟、以允许下一个转换周期结束
}
}
spi.endTransaction();
}
[/报价]
尊敬的 Bob:
我的代码如下所示、
#include
#include
#define start 6.
#define RESET 7
#define CS 4.
long signed int stat;
SPI 设置设置1 (4000000、MSBFIRST、SPI_MODE1);
void setup(){
SPI.begin();
引脚模式(CS、输出);
引脚模式(RESET、输出);
引脚模式(启动、输出);
digitalWrite (重置,高电平);
延迟(5);//
Serial.begin(9600);
SPI.beginTransaction(settings1);
digitalWrite (CS、low);
digitalWrite (start、low);
}
void loop(){
for (int i=0;i<10;i++)
{
if (i=0){
SPI.transfer (0x42);// WREG 寄存器地址
SPI.transfer (0x07);// WREG 字节编号-1
SPI.transfer (0x24);// WREG 写入 AIN2-AIN4
SPI.transfer (0x07);//128增益
SPI.transfer (0x1E);//数据速率为4000 SPS
SPI.transfer (0x10);//REF
SPI.transfer (0x00);// IDAC MAG
SPI.transfer (0xFF);// IDAC 多路复用器
SPI.transfer (0x00);// Vbias
SPI.transfer (0x14);//超时位 second =1,默认值为10h
SPI.transfer (0x08);//开始转换命令
延迟(1);
}
其他
{
SPI.transfer (0x12);//RDATA 命令
STAT = SPI.transfer (0);
STAT =(STAT<<8)| SPI.transfer (0);
STAT =(STAT<<8)| SPI.transfer (0);
serial.print(stat);
serial.print ("\n");
delayMicroseconds (250);//需要一个额外的延迟以使下一个转换周期结束
}
//digitalWrite (CS、HIGH);
}
spi.endTransaction();
}
但是 、转换不需要 DRDY 引脚、这就是我未将其包含在代码中的原因。
您好、Sushmita、
您的代码似乎正常、但在某种程度上、您需要验证您的通信以及设备是否正常运行。 使用示波器或逻辑分析仪将帮助您确定通信是否正确。 您不能短切此步骤。 请将您的通信照片发送给我。 使用示波器或分析器检查 DRDY、以确保其以您编程到器件的数据速率进行脉冲。 如果没有、则表示您缺少电源、所需的引脚设置不符合要求(可能存在接线问题)、或者您未正确与器件通信。
此致、
Bob B