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.

[参考译文] TM4C129XNCZAD:Rx SPI FIFO 中的一个额外字节

Guru**** 2430620 points
Other Parts Discussed in Thread: ADS1298

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/666475/tm4c129xnczad-an-extra-byte-in-the-rx-spi-fifo

器件型号:TM4C129XNCZAD
主题中讨论的其他器件:ADS1298

大家好。

我通过 SPI 将 TM4C129x 与 ADS1298通信、一切都正常、直到我必须从 ADS 读取转换。

当 DRDY 被触发时、我将开始读取、我意识到每次在讲座中、它都会产生一个值为零的额外字节。

我有两个函数、其中一个函数发送 RDATA (读取数据命令)、另一个函数读取 ADS 发送的值、如果执行此操作、则会显示额外的字节。

在执行一些测试时、我意识到、如果我调试代码并在读取数据的函数调用中停止代码(在命令发送后)、数据不含额外的字节、 我猜它与时序相关、因此我添加了延迟、现在如果我正常运行代码、我将读取而不使用额外的字节、但为什么呢? 我做了什么错了、或者我不做什么?

我在示波器上看到了来自 ADS 的 SPI 数据、它没有额外的字节、因此 Tiva 就是问题之一。

这是读取过程的顺序:

if (bdataReady)
{
bdataReady = false;

SendCommand (RDATA、0、0、NULL、NULL);
vReadADSData (ui32ADCReadings);
SysCtlDelay (200);
SendCommand (开始、0、0、NULL、NULL);
} 

这是我从 ADS 读取的函数:

void vReadADSData (uint32_t * ui32ReadData)
{
/*清理 Rx FIFO_uint32_t
ui32FlushFIFO = 0;
while (SSIDataGetNonBlocking (SSI2_base、&ui32FlushFIFO));

/*将用作虚拟数据的值设置为零*/
ui32FlushFIFO = 0;

for (uint8_t ui8ReadingIndex = 0;ui8ReadingIndex < Bytes_per_RDATA + 1;
ui8ReadingIndex++、ui32ReadData++)
{
SSIDataPut (SSI2_base、ui32FlushFIFO);
SSIDataGet (SSI2_base、ui32ReadData);
}

我不知道为什么会发生这种情况、如果您需要更多信息、请告诉我。

顺便说一下... 我无法选择合适的论坛、我不知道为什么、它只是出现在无线论坛上。 请帮助我将此帖子重定向至正确的论坛。

谢谢你。

此致、Juan。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉无法选择合适的论坛。 该问题现已得到解决。

    我不明白额外的字节是如何产生的。 您将 SSI2用作主机、正确清空接收 FIFO、然后使用 SSIDataPut 循环、后跟 SSIDataGet。 与调用 SSIDataPut 相比、您接收到的字节更多? 额外的字节在序列中的哪个位置? 它是第一个字节还是最后一个字节?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bob、主持人无法将我的帖子移至适当的论坛?

    它首先出现的额外字节

    如果我不在我提到的函数之间实现延迟、我将收到以下消息:

    如果我施加延迟、我将得到以下结果:

    当我逐行执行代码并且没有延迟时、我猜是因为调试器在行执行之间应用了延迟。 我认为这是与时间相关的问题、但为什么呢?

    感谢 Bob 的帮助。

    此致、Juan。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    听起来您 读取 ADS1298的速度太快了。 您是否正在检查!DRDY 在读取数据之前变为高电平、然后再次变为低电平? 您可能需要在示波器上将 SSICLK 与!DRDY 进行比较。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在下降沿触发的 GPIO 中断中将 bdataReady 设置为 true、该中断连接到 ADS1298的 DRDY 引脚。 这个标志启动读取、最后我发送另一个 START 命令来进行另一个转换。

    看到示波器中的信号、我意识到 DRDY 的下降沿与 SPI 信号不匹配、让我对该部分进行初始化、也许您是对的。

    同时、我让您了解中断的初始化方式

    void vConfigGPIO (void)
    {
    /*查看 GPIO D 外设是否已启用*/
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOD)
    ){
    /*如果尚未准备就绪,则尝试启用它并等待几个周期才能准备就绪*/
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    SysCtlDelay (10);
    }
    
    /*为 PIN*/
    GPIOIntRegister (GPIO_PORTD_BASE、PortDIntHandler)注册中断;
    
    /*触发 中断的引脚被声明为输入*/
    GPIOPinTypeGPIOInput (GPIO_PORTD_BASE、GPIO_PIN_5);
    
    /*在所需的引脚和触发器中配置中断
    在下降沿*/
    GPIOIntTypeSet (GPIO_PORTD_BASE、GPIO_PIN_5、GPIO_FALLING_EDGE);
    
    /*在启用 IT*/
    GPIOIntClear (GPIO_PORTD_BASE、GPIO_PIN_5)之前清除不需要的中断;
    
    /*启用中断*/
    GPIOIntEnable (GPIO_PORTD_BASE、GPIO_PIN_5);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这就是我在示波器中得到的结果:

    我忘记在图中提到黄色矩形是来自 ADS1298的数据

    一切似乎都符合预期、是否有任何想法或意见?

    此致、Juan。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这更像是 ADS1298问题、而不是 TM4C 问题。 我将向精密 A2D 专家介绍这一主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我打算撰写这篇文章时、我想将其发布到 Precess 转换器论坛、但在示波器中、我看到信号中没有零、因此我猜这是 TM4C 问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但在逻辑分析仪中、它显示了从器件(ADS1298)的第一个字节为0x00、第二个字节为0xC0。 主器件输出的是0x12、然后是0x00。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    0x12对应于 RDATA 命令、该命令下的0x00应由 FLUSH 接收 FIFO 读取

    while (SSIDataGetNonBlocking (SSI2_base、&ui32FlushFIFO));

    之后、ADS 立即以3个状态字节和转换结果进行响应。
    有办法解决这种情况、但这让我感到困扰、不应该发生

    此致、Juan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Juan:

    您是否能够在不增加延迟的情况下解决此问题? 我不确定额外字节来自何处、但 ADS1298的运行方式似乎与预期的一样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Juan:
    首先、我对延迟回复表示歉意。 上周我在度假。 此外、我对 ADS1298不是很熟悉。 如果我理解您所说的内容、即在执行 RDATA 命令后、ADS1298以三字节状态然后是数据进行回复。 您期望 while 循环调用 SSIDataGetNonBlocking(),以清除缓冲区中的三个字节响应。 我的理解是否正确?

    如果是这种情况、我怀疑 TM4C129在完全接收到响应的最后一个字节之前调用 SSIDataGetNonBlocking()(除非您添加延迟)。 这会导致代码在仅读取两个字节后从 while 循环中退出、从而在您需要数据时将状态的最后一个字节保留为读取状态。 由于 TM4C 是主器件,因此它必须传输3个字节才能读取3个字节的状态,因此最好通过调用 SSIDataGet ()三次来清除状态字节。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有听到您的反馈、因此我认为我的最后一个回答有助于回答您的问题。 如果不是、您可以回复或启动另一个线程。