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.

[参考译文] TMS320F28379S:SPI 问题- 8位字符模式

Guru**** 2538950 points
Other Parts Discussed in Thread: TMS320F28379S

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1185944/tms320f28379s-spi-issue---8-bit-character-mode

器件型号:TMS320F28379S

您好!

我使用 TMS320F28379s C2000系列微控制 器(主控制   器)通过 SPI 连接 SRAM 23LCV1024 (从控制器)。 我已  根据控制套件中提供的示例代码将 SPI 配置为 FIFO 模式、 SPI 配置如下控制器处于主模式、时钟极性至上升、时钟相位正常(0)、 数据字符长度为8位 、已 配置位速率为500kHz。

 我正在尝试将1字节数据- 111 (0x6f)写入 NVRAM,并从 NVRAM IC 读取相同数据。 但我没有按预期获得数据111 (0x6f),而是始终获得 255 (0xFF)…! 在检查 SPI 引脚的脉冲时,我从从属设备(在 MISO 引脚中)获取数据

但 MCU 不会获取响应的数据。 在检查示波器时、在下面的情况1中观察到以下结果、脉冲模式正确、但在 MCU 中始终发现 SPI 存储器0xff。

我已在随附的文档中附上脉冲模式和 SPI 代码以供参考。

谢谢

Rajamurugan

e2e.ti.com/.../0245.Main.txt     e2e.ti.com/.../SPI_5F00_Query.docx

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

    您好  Rajamurugan、

    我看了一下您的代码和附件。 我身上没有什么明显的东西。 我会推荐以下几项:

    1.验证时钟极性和相位配置是否与预期 的23LCV1024 SPI 总线时序相匹配。 不要假定 23LCV1024数据表中给出的 SPI 模式定义与 C2000数据手册中给出的 SPI 模式定义相匹配。

    2.尝试在 SPI 中启用环回模式、以查看是否可以从 SPIRXBUF 寄存器中获取任何正确的数据。 您的 pinmux 配置对我来说是可以的、所以对于为什么您总是从 SPIRXBUF 寄存器中获得0xFF、这是一个问题。

    关于您的具体问题:

    >> …接收数据而不检查 RX FIFO 状态缓冲器(SpibRegs.SPIFFRX.bit.RXFFST)时、它显示的值为7、14 μ s 等、有时溢出标志位(SpibRegs.SPISTS.bit.overoverlate_flag) 也会变为 高电平(1)。

    您必须先检查 RXFFST、以确保 FIFO 中有实际数据。 您具有正确的顺序:

        SpibRegs.SPITXBUF = sdata<<8;  // SPI Serial Output Buffer Register -SPITXBUF
    
        while (SpibRegs.SPIFFRX.bit.RXFFST == 0);
        rdata = SpibRegs.SPIRXBUF;  // SPI Serial Input Buffer Register

    >> 当检查 RX FIFO 状态(SpibRegs.SPIFFRX.bit.RXFFST)时 SPI 脉冲

    当一个或多个字可用时接收数据。  

    1. 根据上述配置,时钟不连续?
    2. 主器件在没有可用时钟(CLK)脉冲时发送数据?
    3. 我没有在 MISO 引脚上获得任何数据(来自从设备)

    由于 SPITXBUF 为空并且 CPU 写入新数据的时间很短、因此时钟不连续、因为 SPI_xmit()只发送一个字符、您必须多次调用它。 您可以更改 SPI_xmit()函数以充分利用 SPI TX FIFO。 换言之,将 SPI_xmit()更改为接受一组字符并同时将所有字符写入 SPITXBUF (当然,检查 TXFFST 是否不会溢出 FIFO 大小)。  

    没有时钟时、我看不到主器件发送数据。 时钟被简单停止、MOSI 引脚保持最后一个发送的值。

    不确定在这种情况下从器件为何不使用数据进行响应。 检查从器件数据表、看看 SPICLK 停止一段时间时是否可能有超时功能。  

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

    尊敬的 Gus Martinez:

    感谢您的回复。。 但我的问题没有得到解决 我已将结果和我的问题附在以下文档中。

    此致

    Rajamurugan  

    e2e.ti.com/.../5164.SPI_5F00_1.docx

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

    Rajamurugan、

    当你向 SPITXBUF 寄存 器写入一个字符时、该字符将被传输、同时将接收一个字符。 因此、您始终必须从 SPIRXBUF 发出虚拟读取以清除该数据。 如果不清除这些数据、数据将保持在 RX FIFO 中、RXFFST 将递增1。 我相信您看到的问题是、您没有从 RX FIFO 中进行此虚拟读取。

    之前,在 SPI_xmit()函数中,每次写入 SPITXBUF 后,您都正确地读取了 SPIRXBUF。 但是、由于您轮询数据以使数据到达 SPIRXBUF、CPU 被强制等待 SPI 传输完成。

    以下是一项建议。 在下面的函数中、总共有5个写入 SPITXBUF 的操作(如果我对这些进行计数)。 因此、您需要从 SPIRXBUF 读取5次。

    void Write_to_NVRAM(unsigned char Write_data, unsigned long int Write_address)
    {
    
        chip_select_NVRAM1();
        spi_xmit(RAM_INS_WRITE);
        NVRAM1_send_address(Write_address);
        spi_xmit(Write_data);
        chip_deselect_NVRAM1();
    
    }

    您可以执行以下操作:

    • 写入 SPITXBUF
    •  RXFFST = 0时等待;
    • 虚拟读取 SPIRXBUF
    • 再重复4次

    缺点是 SPI CLK 中会有中断、因为 SPI TX FIFO 在字符传输结束时始终为空。 当 RXFFST = 1时、CPU 太晚、无法向 SPI TX FIFO 加载新字符以保持 SPI CLK 运行。

    或者、您可以执行以下操作:

    • 写入 SPITXBUF
    • 写入 SPITXBUF
    • 写入 SPITXBUF
    • 写入 SPITXBUF
    • 写入 SPITXBUF
    •  RXFFST < 5时等待;
    • 虚拟读取 SPIRXBUF x 5

    在这种情况下、SPITXBUF 始终加载数据、SPI CLK 将是连续的。  

    尽管如此、我还是有点惊讶、因为完全需要连续的 SPI CLK。 我在23LCV1024 数据表 SPI 时序中看不到任何表明这是一个要求的东西。 您原来的 SPI_xmit()实现应该是完全可以接受的。 除非您的目标是通过消除字符之间的死区时间来提高数据吞吐量?  

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

    Hai 

    感谢您的支持...我们的问题现已解决、我能够从 SRAM (23LCV1024)读取和写入数据  

    以下是我 对代码所做的更新

    1.将默认 SPI EN 引脚更改为 GPIO...我  手动将其设置为高电平和低电平、以避免在数据之间切换 EN 引脚。

    2.已检查 RX FIFO 状态(RXFFST) 和 TX FIFO 状态(TXFFST)。

    最后一个问题是:是否有任何其他通过使用 SPI 寄存器(不带 GPIO 控制)来控制 EN 引脚的默认方法?

    此致、

    RajaMurugan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="515467" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1185944/tms320f28379s-spi-issue---8-bit-character-mode/4476600 #4476600"]已将默认 SPI EN 引脚更改为 GPIO ...我  手动将其设置为高电平和低电平、以避免在数据之间切换 EN 引脚。

    啊! 我无法相信、我在您的示波器图中没有看到 CS 引脚变为高电平! 这是很好的解释。  

    [引用 userid="515467" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1185944/tms320f28379s-spi-issue---8-bit-character-mode/4476600 #4476600"]

    最后一个问题是:是否有任何其他通过使用 SPI 寄存器(不带 GPIO 控制)来控制 EN 引脚的默认方法?

    [/报价]

    确保 SPI TX FIFO 始终具有数据的唯一方法。