关于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");
}
//////////////////////////////至此已经能完成读写寄存器了////////////////////////////
整理得很好啊, 支持一下
读不出寄存器的原始状态,写进去的寄存器状态命令也是错的,是不是SPI的SCLK和时钟信号的csk必须满足某种关系啊。我用的是内部时钟,我就有一个疑问了,是不是CLKSEL PIN管脚为高电平,内部晶振就启振了,请帮我分析一下,谢谢您! |
csk是指ads1292的时钟么,我使用的是他的内部时钟,另外spi返回值对么,一直是0还是有规律的乱码?
一般先看spi的使能端cs/ss是否对的,然后看sck是不是太快了,然后看spi的三个设置选项是否适合。。
如果spi能读到寄存器,但是写不进去,那是因为你木有认真看datasheet,上有说读和写在数据包格式上的不同。
读出来的寄存器状态是乱码,我现在就是不知道像CS,START,READY脚怎么控制,你的qq是多少,可以加一下吗,方便联系,谢谢
呃,cs和dready在datasheet那几页有时序图,说不清楚,看图比较容易
start是在配置好寄存器以后置高,ads1292就会开始采样了
乱码的话是spi配置的问题,上升沿采样还是下降沿采样设置对了么
我现在读出的寄存器初始状态结果是00 00 73 02 80 10 00 00 00 00 00 00,也就是前两位不对,第三位应该是寄存器的第一位,第四位应该是寄存器的第二位,这是什么情况?
datasheet上说就是这样的,不信去看
你好,我没明白你的意思,能不能具体说怎么回事,返回的原始值应该是不对的吧,第一个应该是0x73,而不是第三个是
这样怎么是对的?应该寄存器的第一位是0x73,而不是第三位
//读取寄存器数据: 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
你发出指令后,返回的是2字节.是不是spi设置或者发送的指令的问题,另外,ads1291/1292和1293是不通用的
发送数据包格式
8 bit :0x20 | the starting register address
8 bit :0x00 | the number of registers to read – 1
你的读取指令和这样和0x20取与么
单步调试问题不大,就是全速不行,这是我的程序,麻烦帮我看一下,或者你有程序吗,我参考一下,谢谢!
现在读出读出的数据前八位是对的后四位是错的。这是为什么
您好,我读寄存器原始状态的到的都是00,是为什么啊?
我的ID读出来总是C9 ,偶尔能写进去,偶尔写不进去
spi通信有问题
您好,你是用ADS1292做脑电么?我曾经也尝试过,但是ADS1292的放大倍率和输入阻抗都不尽如人意,如果在前端加放大器的话,右腿驱动/导联脱落检测等部分电路就不能再使用了,造成浪费?请问你是怎么做的?
此外,单步调试可以,全速不行,请考虑晶振的选择是否正确,看门狗的设置,一般不会是code上的问题。请具体形容出问题的状态。
你心电部分做完了吗?你是不是也打算用ADS1292做脑电采集,目前有进展了吗?
我现在也是想用这个芯片做脑电,可以交流一下QQ:1138579250.