我用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,在你的提示下,似乎找到了答案,看到正确波形了,但是还要进一步验证,谢谢。