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.

ADS1211的时序问题

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

  • 希望是这个问题,如果有帮到你,麻烦结下帖子,貌似你点赞你自己,没有点赞我的答案啊 :(