你好!
我现在使用ADS1298,当正常上电时可以读取默认状态的数据。而且也可以正常读取ID。但再执行RDATAC后,就不能正常读取数据了,表现为DRDY的中断不能进入了。
而且只要是我发送了任何指令(RREG、START等)后,再想恢复连续读模式,即发送RDATAC后,都不能正常读取数据了。
不知道RDATAC这个命令该操作时该注意哪些呢?
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.
这两个寄存器的值不对,你的硬件POWER-UP SEQUENCING和软件Power-On Reset是否合适?
一、是这样,我觉得CONFIG2的值应该是正确的,因为根据DATAsheet 第25页描述的 内容,其值不可能是0X40;
二、至于GPIO 的值我就不太确定了,因为我发现 DATAsheet 里提到 不用的GPIO 需要接地,但我目前是悬空的,不知道是否是此原因。
三、至于是否是硬件上电时序的问题,我这边还没确定。但我觉得不管上电时序情况如何,只要我做复位处理了,芯片应该就恢复默认工作了。不知道这样理解是否正确。
四、关于复位的问题,烦请帮我看看我的ADS1298初始化程序,个人觉得复位操作应该没问题,但是读取的寄存器值就如上图的内容。
//ADS1298初始化
void ADS1298_Init(void)
{
uchar d[20];
P6DIR |= 0xF8; // P6.0 output
P6OUT |= 0x00; // P6.3 output 0
//下面是复位操作
__delay_cycles(100000); //延时
ADS1298_START1; //
ADS1298_PWDN1; //
ADS1298_RST1;
ADS1298_CS1;
__delay_cycles(100000); //延时
ADS1298_START1; //
ADS1298_PWDN1; //
ADS1298_RST0;
ADS1298_CS1;
__delay_cycles(500); //延时
ADS1298_START1; //
ADS1298_PWDN1; //
ADS1298_RST1; //
ADS1298_CS1; //
__delay_cycles(5000); //延时
ADS1298_CS0; //
//至此复位操作结束,开始读取寄存器默认值
__delay_cycles(50000); //延
ADS1298_Send_CMD_One(SDATAC); //发送停止命令
ADS1298_Read_REG(0x20+ADDR_ID,20,d);
ADS1298_Send_CMD_One(RDATAC); //发送连续读停止命令
__delay_cycles(5000); //延时
}
//接收ADS1298多字节命令
void ADS1298_Read_REG(uchar cmd,uchar len, uchar dat[])
{
uchar i;
ADS1298_Send_CMD_One(cmd); //发送接收命令第一字节+地址
ADS1298_Send_CMD_One(len-1); //发送接收第二字节命令,接收数据长度
for(i=0;i<len;i++)
{
ADS1298_Send_CMD_One(0x55); //发送SPI时钟,DOUT0
if(UCA1IFG&UCRXIFG) // UCB0RXBUF IS EMPTY?
{ dat[i] = UCA1RXBUF; }
}
__delay_cycles(100);
}
//发送ADS1298单字节命令
void ADS1298_Send_CMD_One(uchar cmd)
{
while(!(UCA1IFG&UCTXIFG)); //USCI_B0 TX buffer ready
UCA1TXBUF = cmd; //Transmit data
__delay_cycles(1000);
}
程序看起来是没有错的啊,你试着转换一下数据,看看得到的值和实际测量值一样不
GPIO默认值是设置为输入的,即0x0F,为0x00则为输出了,这个比较奇怪。CONFIG2为0x00是正确的,datasheet上前后有点不一致
GPIO默认为输入的时候引脚不能悬空,而复位后默认为输入,不知道是不是这里的问题
有个好消息是,我感觉ADS1298可以正常工作了,因为我现在配置完某个寄存器后(如采样率),再恢复其RDTATC模式,已经没问题了。
但在使用默认寄存器的情况下,我读取的数据就如同我上面发的那3个图片里的数据一样。大多数时候都是0x800000 或者0x7FFFFF,应该是超量程了。
还有个地方需要请教下,就是我想 利用WCT 做 胸级单导联,是否需要重新配置寄存器的值呢?
我的数据有三组 分别为X = V1 -V2 ; Y = V3 -V4 ; Z = V5 - V6 。 附上原理图
这里可以下载ADS1299的source code:
ftp://ftp.ti.com/pub/data_acquisition/ECG_FE/ADS1298/Source_ads129x_v1p1.zip
但是需要在http://e2e.ti.com/上提出并留下邮箱申请解压密码。
另:ads1299和ads1298的内核是差不多的,只是在噪声和增益配置上有微小区别。ADS1299性能稍好一点