TI中文支持网
TI专业的中文技术问题搜集分享网站

关于ADS1292的寄存器问题

整理翻译了一些资料

具体请参考datasheet第35-38页

一。首先是SPI的格式:

1.高位在前 低位在后;

2.上升沿置位,下降沿采样,SCK闲置时为0;

3.配置寄存器时sclk最高为1MHz,无信号为低电平;

二。SPI的数据

//唤醒:0x0200
//睡眠:0x0400
//重启:0x0600
//开始:0x0800(高电平芯片工作)
//暂停:0x0A00
//offsetcal:0x1A00

//开始自动读取数据:0x1000
发送数据包格式
8 bit :0x10
8 bit :0x00

//关闭自动读取数据:0x1100

//用命令读取数据: 0x1200
发送数据包格式
8 bit :0x12
8 bit :0x00
接收数据包格式
216 bit :寄存器状态+8通道数据

//发送寄存器指令: 010* **** 000$ $$$$
*位5bit的数据
$为5bit的地址
数据包格式:
8 bit :0x40 | the starting register address
8 bit :0x00 | the number of registers to write – 1
8 bit :数据data1
8 bit :数据data2

//读取寄存器数据: 001* **** 000$ $$$$
*位5bit的数据
$为5bit的地址
发送数据包格式
8 bit :0x20 | the starting register address
8 bit :0x00 | the number of registers to read – 1
接收数据包格式
8 bit :数据data1
8 bit :数据data2

///////////////////////////华丽的分隔符/////////////////////////////////////

我使用的是ARDUINO进行简单的测试

code如下:

#include <SPI.h>
unsigned int dry = 2;
unsigned int rt = 3;
unsigned int start = 4;
unsigned int mclk = 5;
unsigned int clksel = 6;
unsigned int led = 7;
unsigned int ss = 10;
unsigned int mosi = 11;
unsigned int miso = 12;
unsigned int sclk = 13;
unsigned char data[30] = {0};

void SPI_INIT()
{
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV16);
SPI.setDataMode(SPI_MODE1);
digitalWrite(ss,HIGH);
Serial.println("SPI_INIT() is OK!");
}

unsigned int ADS1292R_RegisterWrite(unsigned char reg,unsigned char data)
{
unsigned char package;
ADS1292R_StopDataReadContinuous();
digitalWrite(ss,LOW);
package = 0x40 | reg;
SPI.transfer(package);
package = 0x00;
SPI.transfer(package);
package = data; SPI.transfer(package);
digitalWrite(ss,HIGH);
}

unsigned char ADS1292R_RegisterRead(unsigned int reg)
{
unsigned char package;
unsigned char data = 0x00;
digitalWrite(ss,LOW);
package = 0x20 | reg;
SPI.transfer(package);
package = 0x01;
SPI.transfer(package);
data = SPI.transfer(0);
digitalWrite(ss,HIGH);
return data;
}

void ADS1292R_WakeUp()
{
digitalWrite(ss,LOW);
SPI.transfer(0x02);
digitalWrite(ss,HIGH);
}

void ADS1292R_StartConversions()
{
digitalWrite(ss,LOW);
SPI.transfer(0x08);
digitalWrite(ss,HIGH);
}

void ADS1292R_StartDataReadContinuous()
{
digitalWrite(ss,LOW);
SPI.transfer(0x10);
digitalWrite(ss,HIGH);
}

void ADS1292R_StopDataReadContinuous()
{
digitalWrite(ss,LOW);
SPI.transfer(0x11);
digitalWrite(ss,HIGH);
}

void ADS1292R_Register_INIT()
{
pinMode(dry,INPUT_PULLUP);
pinMode(start,OUTPUT);
pinMode(rt,OUTPUT);
digitalWrite(start,HIGH);
digitalWrite(rt,HIGH);

ADS1292R_WakeUp();
ADS1292R_StartConversions();
ADS1292R_StopDataReadContinuous();
while(ADS1292R_RegisterRead(0x01) != 0x02)
{ADS1292R_RegisterWrite(0x01,0x02);}
while(ADS1292R_RegisterRead(0x02) != 0x83)
{ADS1292R_RegisterWrite(0x02,0x83);}
while(ADS1292R_RegisterRead(0x03) != 0x10)
{ADS1292R_RegisterWrite(0x03,0x10);}
while(ADS1292R_RegisterRead(0x04) != 0x05)
{ADS1292R_RegisterWrite(0x04,0x05);}
while(ADS1292R_RegisterRead(0x05) != 0x05)
{ADS1292R_RegisterWrite(0x05,0x05);}
while(ADS1292R_RegisterRead(0x06) != 0x00)
{ADS1292R_RegisterWrite(0x06,0x00);}
while(ADS1292R_RegisterRead(0x07) != 0x00)
{ADS1292R_RegisterWrite(0x07,0x00);}
while(ADS1292R_RegisterRead(0x08) != 0x40)
{ADS1292R_RegisterWrite(0x08,0x40);}
while(ADS1292R_RegisterRead(0x09) != 0xC3)
{ADS1292R_RegisterWrite(0x09,0xC3);}
while(ADS1292R_RegisterRead(0x0A) != 0x00)
{ADS1292R_RegisterWrite(0x0A,0x00);}
while(ADS1292R_RegisterRead(0x0B) != 0x03)
{ADS1292R_RegisterWrite(0x0B,0x03);}
Serial.println("ADS1292R_DataReadContinuous_Register_INIT() is OK!");
}

void setup()
{
pinMode(ss,OUTPUT);
pinMode(dry,INPUT);
digitalWrite(ss,HIGH);
Serial.begin(115200);
SPI.begin();

SPI_INIT();
ADS1292R_Register_INIT();

unsigned char kk;
kk = ADS1292R_RegisterRead(0x00); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x01); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x02); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x03); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x04); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x05); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x06); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x07); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x08); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x09); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x0A); Serial.println(kk,HEX);
kk = ADS1292R_RegisterRead(0x0B); Serial.println(kk,HEX); Serial.println("————————————-"); delay(5000);
ADS1292R_StartDataReadContinuous();
digitalWrite(ss,LOW);
}
int flag=1;
void loop()
{
while(flag)
{
if((digitalRead(dry) == 1) && (digitalRead(dry) == 0))
{
Serial.println("——>"); flag=0;
}
} Serial.print(SPI.transfer(0));
Serial.print("\n");
}

//////////////////////////////至此已经能完成读写寄存器了////////////////////////////

user151383853:

整理得很好啊, 支持一下

zhao fang chong zhao:

回复 user151383853:

读不出寄存器的原始状态,写进去的寄存器状态命令也是错的,是不是SPI的SCLK和时钟信号的csk必须满足某种关系啊。我用的是内部时钟,我就有一个疑问了,是不是CLKSEL PIN管脚为高电平,内部晶振就启振了,请帮我分析一下,谢谢您!

jiaqin yue:

回复 zhao fang chong zhao:

csk是指ads1292的时钟么,我使用的是他的内部时钟,另外spi返回值对么,一直是0还是有规律的乱码?

一般先看spi的使能端cs/ss是否对的,然后看sck是不是太快了,然后看spi的三个设置选项是否适合。。

如果spi能读到寄存器,但是写不进去,那是因为你木有认真看datasheet,上有说读和写在数据包格式上的不同。

zhao fang chong zhao:

回复 jiaqin yue:

读出来的寄存器状态是乱码,我现在就是不知道像CS,START,READY脚怎么控制,你的qq是多少,可以加一下吗,方便联系,谢谢

xiangwen fu:

回复 zhao fang chong zhao:

呃,cs和dready在datasheet那几页有时序图,说不清楚,看图比较容易

start是在配置好寄存器以后置高,ads1292就会开始采样了

乱码的话是spi配置的问题,上升沿采样还是下降沿采样设置对了么

zhao fang chong zhao:

回复 xiangwen fu:

我现在读出的寄存器初始状态结果是00 00 73 02 80 10 00 00 00 00 00 00,也就是前两位不对,第三位应该是寄存器的第一位,第四位应该是寄存器的第二位,这是什么情况?

xiangwen fu:

回复 zhao fang chong zhao:

datasheet上说就是这样的,不信去看

zhao fang chong zhao:

回复 xiangwen fu:

你好,我没明白你的意思,能不能具体说怎么回事,返回的原始值应该是不对的吧,第一个应该是0x73,而不是第三个是

zhao fang chong zhao:

回复 xiangwen fu:

这样怎么是对的?应该寄存器的第一位是0x73,而不是第三位

xiangwen fu:

回复 zhao fang chong zhao:

//读取寄存器数据: 001* **** 000$ $$$$*位5bit的数据$为5bit的地址发送数据包格式8 bit :0x20 | the starting register address8 bit :0x00 | the number of registers to read – 1接收数据包格式8 bit :数据data18 bit :数据data2

你发出指令后,返回的是2字节.是不是spi设置或者发送的指令的问题,另外,ads1291/1292和1293是不通用的

赞(0)
未经允许不得转载:TI中文支持网 » 关于ADS1292的寄存器问题
分享到: 更多 (0)