ADS1211的时序问题
我用TM4C的SPI读ADS1211
SSIDataPutNonBlocking(SSI0_BASE,0xc0); //设置INSR,读取采样数据。
SSIDataPutNonBlocking(SSI0_BASE,0x00);//因为在ADS1211从模式读数据不产生CLK,所以发送3个数据为了产生3个CLK。
SSIDataPutNonBlocking(SSI0_BASE,0x00);
SSIDataPutNonBlocking(SSI0_BASE,0x00); //发送4个数据刚好8个深度 占用了4个 产生半满中断
上面是发送的四个数据,第一个是命令,后面3个是读取ADS1211的数据
我先写入,再读出,是通过SSI的中断读出的,但是产生中断后,发现读出的值全是FF,这是为什么?
这个芯片的SPI设定应该没有问题,因为之前是用来读写ADS1254,都没问题
附件中2张图片,是在SPI不同的速度下的波形,黄色是CLK的波形,蓝色是DRDY的波形,这个波形的问题是 为什么在第二个CLK完成后,DRDY就变成高电平了?
你好,
我简单理一下思路:
1.你利用TM4C的SSI模块做SPI的读取。
2.写读的地址,然后连续读三个数据。
3.读SPI接收数据是利用中断读出。
我的问题是,如果按照你的思路,包括写地址也会产生接收中断,也就是你最后应该收到4个数据到你的buf中。
而且根据你的波形ENABLE 应该在每个数据读取完以后都产生一个电平跳变。
所以我建议两点:
第一.读TM4C函数调用手册 SSIDATAPUTNONBLOCKING函数。
第二,尝试写一个数据,看其接收室什么值,然后尝试写l两个数据看读出来是什么值,
SSI中断我设定的是 //接收超时中断,//接收半满或超过,这样我发送4个数据 刚好半满产生中断,我都仿真过了,是正确的。
现在我还有个疑问:就是在读写数据的时候是不是DRDY一直保持低电平,读写完毕后才变为高电平。现在示波器是完成2个数据就变成高点平了
你好,
先回答你的疑问,是的,DIRDY在读写的时候都是保持低电平,空闲是才会为高。
我感觉是初始化不对,因为我把初始化注销了,波形都没什么改变,
下面是我的开机初始化,请问有什么问题么?或者初始化我要注意点什么?
while(!GPIOPinRead(GPIO_PORTA_BASE,GPIO_PIN_3))
while(GPIOPinRead(GPIO_PORTA_BASE,GPIO_PIN_3)) //检查下降沿
delay2(800); //延时程序
SSIDataPutNonBlocking(SSI0_BASE,0x64);
SSIDataPutNonBlocking(SSI0_BASE,0x52);
SSIDataPutNonBlocking(SSI0_BASE,0x20);
SSIDataPutNonBlocking(SSI0_BASE,0x81);
SSIDataPutNonBlocking(SSI0_BASE,0x38);
还有一个问题,我的单片机都是3.3V的,而1211是5V的,这样直接连在一起用,有没有问题?
你好,
不能这样啊.
你好,
你的SPI选择是四种模式中的哪一种?
是上升沿采样,CLK空闲低电平?
和ADS1211的SPI模式是匹配的么。
void InitSPI0(void)
{
//初始化SSI0
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); // The SSI3 peripheral must be enabled for use.
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //GPIO port B needs to be enabled so these pins can be used.
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 100000, 8); //接收
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5);
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA4_SSI0RX);
GPIOPinConfigure(GPIO_PA5_SSI0TX);
IntEnable(INT_SSI0);
SSIIntDisable(SSI0_BASE,SSI_RXFF|SSI_RXOR|SSI_RXTO);
SSIEnable(SSI0_BASE);
}
kqian0327,非常感谢你耐心的回复,上面是我的SPI的初始化,
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 100000, 8); //接收
用的是SSI_FRF_MOTO_MODE_0,有错误么?
我做了很多努力,加延时,改设置,但是不管我怎么做,包括上面提示的先写一个数据,再写2个数据,都是在第二个8位数据传送完毕DRDY就变为高电平,到底是哪里错了?
感谢Michael,在你的提示下,似乎找到了答案,看到正确波形了,但是还要进一步验证,谢谢。
希望是这个问题,如果有帮到你,麻烦结下帖子,貌似你点赞你自己,没有点赞我的答案啊 :(