工具/软件:
您好、
我尝试 测量 一个力平台在 400SPS 和增益 64 下 4 个负载单元的数据(4 路差分输出;单极电源)。 我为 ADS1261 设计了一个分线板、用于将所有称重传感器连接到它、放大原始数据并进行模数转换。
在原理图(随附的文件)中、您可以看到我将 START、RESET、PWDN 引脚硬接线至 DVDD、将 CS 引脚接至 GND、以使 ADC 始终通电、处于活动状态并选择用于串行通信。 现在、我正在尝试在 ADS1261 和 teensy 4.1 MCU 之间建立 SPI 通信。 TEENCY 的默认 SPI 总线包含引脚 11 (MOSI)、12 (MISO)、13 (SCLK) 和 10 (CS)。 TEENCY 的引脚 11 (MOSI) 连接到 ADS 的 DIN 引脚、引脚 12 (MISO) 连接到 ADS 的 DOUT、引脚 13 (SCLK) 连接到 ADS 的 SCLK、引脚 10 (CS) 连接到 GND、引脚 2 (GPIO) 连接到 ADS 的 DRDY。 我已经定义了所有必要的寄存器分配和转换命令(您可以检查随附的代码文本;它用于一个通道)、但 ADS 仍然没有响应、MCU 正在读取一些垃圾值。 注意:SPI 总线上仅连接了一个 ADS、 多个从 器件之间不共享总线。 未设置内部基准、AVDD 设置为基准。 ADS 芯片 ID 被识别为 0x81。
我无法理解我的错误所在。 如果您能帮助我解决问题、那将会很好。
此致、
Charles
代码:
#include
// teensy 4.1 SPI0 默认引脚
#define DRDY_PIN 2.
SPISettings spiSettings (1000000、MSBFIRST、SPI_MODE1);
#define INTERT_COMMAND_DELAY_US 50
//启用此选项以调试原始数据和状态
#define DEBUG_RAW_BYTES TRUE
void safeDelay (){
delayMicroseconds (inter_command_delay_US);
}
void writeRegister (uint8_t reg、uint8_t val){
safeDelay ();
SPI.beginTransaction(spiSettings);
spi.transfe (0x40 | reg); // WREG 命令
SPI.TRANSFER (0x00); //写入 1 寄存器
spi.transfer (val);
spi.endTransaction();
}
uint8_t readRegister (uint8_t reg){
safeDelay ();
SPI.beginTransaction(spiSettings);
SPI.transfe (0x20 | reg); // RREG 命令
SPI.TRANSFER (0x00); //读取 1 个寄存器
uint8_t val = spi.transfe (0xFF);
spi.endTransaction();
返回值;
}
bool waitForDRDY (unsigned long timeout_ms = 1000){
无符号长启动= millis();
而 (digitalRead (DRDY_PIN)=高电平){
如果 ((millis ()- start)> timeout_ms) 返回 false;
delayMicroseconds (10);
}
返回 true;
}
int32_t readADCData (bool &statusOK){
uint8_t 状态;
uint8_t data[4];
safeDelay ();
SPI.beginTransaction(spiSettings);
SPI.TRANSFER (0x12); // RDATA 命令
STATUS = SPI.TRANSFER (0xFF); //读取 STATUS 字节
对于 (int i = 0;i < 4;++I){
DATA[i]= spi.transfe (0xFF);
}
spi.endTransaction();
//调试打印
if (debug_raw_bytes){
serial.print(“status:0x“);serial.print (status、hex);
serial.print(“|字节:“);
对于 (int i = 0;i < 4;i++){
serial.print(“0x")“);Serial.print (data[i]、hex);Serial.print (“);
}
serial.println();
}
statusOK =!(status 和 0x80); //位 7 = 1 表示 ADC 错误
//合并字节
int32_t =((int32_t) data[0]<< 24)|
((int32_t) data[1]<< 16)|
((int32_t) data[2]<< 8)|
((int32_t) data[3]);
返回值;
}
void setupADS1261 (){
Delay (100); //等待上电
SPI.beginTransaction(spiSettings);
SPI.TRANSFER (0x06); // RESET 命令
spi.endTransaction();
延迟 (10);
writeRegister (0x01、0x02); //电源:内部基准关闭
延迟 (10);
writeRegister (0x02、0x28); // MODE0:SINC3400SPS
writeRegister (0x03、0x00); // MODE1:单次模式
writeRegister (0x04、0x70); // Mode2:4 字节+ SPITIM 开启+ STATUS 开启
延迟 (10);
uint8_t mode2 = readRegister (0x04);
serial.print(“MODE2 寄存器回读= 0x“);
serial.println(mode2,十六进制);
writeRegister (0x10、0x06); // GAIN1:增益= 64
writeRegister (0x11、0x23); // INPMUX:AIN2 - AIN3
delay(50); //让它稳定下来
}
void triggerSingleConversion(){
safeDelay ();
SPI.beginTransaction(spiSettings);
SPI.TRANSFER (0x08); //启动命令
spi.endTransaction();
}
void setup(){
Serial.begin(115200);
延迟 (100);
pinMode(DRDY_PIN,输入);
SPI.begin();
serial.println(“初始化 ADS1261……“);
//读取 ID
uint8_t id = readRegister (0x00);
serial.print(“芯片 ID = 0x“);serial.println (id、hex);
if (id != 0x80 && id != 0x81){
serial.println(“无效的 ID。 检查 SPI 接线。“);
while (1);
}
setupADS1261 ();
serial.println(“ADS1261 initialized.“);
}
void loop(){
triggerSingleConversion();
if(!waitForDRDY (1000)){
serial.println(“DRDY timeout“);
延迟 (500);
返回;
}
bool statusOK = false;
int32_t = readADCData (statusOK);
if (statusOK){
serial.print(“ADC Raw =“);
serial.println (ADC_RAW);
}其他{
serial.println(“检测到 ADC 状态错误!“);
}
延迟 (500);
}