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

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就变成高电平了?

 

 

kqian0327:

你好,

我简单理一下思路:

1.你利用TM4C的SSI模块做SPI的读取。

2.写读的地址,然后连续读三个数据。

3.读SPI接收数据是利用中断读出。

我的问题是,如果按照你的思路,包括写地址也会产生接收中断,也就是你最后应该收到4个数据到你的buf中。

而且根据你的波形ENABLE 应该在每个数据读取完以后都产生一个电平跳变。

所以我建议两点:

第一.读TM4C函数调用手册 SSIDATAPUTNONBLOCKING函数。

第二,尝试写一个数据,看其接收室什么值,然后尝试写l两个数据看读出来是什么值,

jason wang3:

回复 kqian0327:

SSI中断我设定的是  //接收超时中断,//接收半满或超过,这样我发送4个数据 刚好半满产生中断,我都仿真过了,是正确的。

现在我还有个疑问:就是在读写数据的时候是不是DRDY一直保持低电平,读写完毕后才变为高电平。现在示波器是完成2个数据就变成高点平了

kqian0327:

回复 jason wang3:

你好,

先回答你的疑问,是的,DIRDY在读写的时候都是保持低电平,空闲是才会为高。

jason wang3:

回复 kqian0327:

我感觉是初始化不对,因为我把初始化注销了,波形都没什么改变,

下面是我的开机初始化,请问有什么问题么?或者初始化我要注意点什么?

 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);

jason wang3:

回复 jason wang3:

还有一个问题,我的单片机都是3.3V的,而1211是5V的,这样直接连在一起用,有没有问题?

kqian0327:

回复 jason wang3:

你好,

不能这样啊.

jason wang3:

回复 kqian0327:

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,有错误么?

jason wang3:

回复 jason wang3:

我做了很多努力,加延时,改设置,但是不管我怎么做,包括上面提示的先写一个数据,再写2个数据,都是在第二个8位数据传送完毕DRDY就变为高电平,到底是哪里错了?

jason wang3:

回复 jason wang3:

感谢Michael,在你的提示下,似乎找到了答案,看到正确波形了,但是还要进一步验证,谢谢。

赞(0)
未经允许不得转载:TI中文支持网 » ADS1211的时序问题
分享到: 更多 (0)