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.

[参考译文] TMS570LS1224:单个16位 SPI 事务的行为

Guru**** 2553260 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/940836/tms570ls1224-behavior-of-single-16-bit-spi-transaction

器件型号:TMS570LS1224
主题中讨论的其他器件:HALCOGEN

您好!

我尝试通过 SPI1发送单个16位字、但遇到了意外行为。

我已将 Halcogen 设置为在 SPI 事务之前或之后发送一个16位字、而不会有任何额外的延迟。  

调用 blocksize 为1的 spiTransmitAndReceiveData()时,会在作用域上产生以下行为:

时钟似乎激活了另外3个字。

这是预期的吗?  

如何防止这种行为? 我希望时钟仅在 MOSI 线路输出的16个数据位的持续时间内有效。

 

谢谢、

Erik

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

    您好 Erik、

    如果 charlen 为16位、则每次传输都会生成16个周期的 SPI 时钟。 如果 blocksize=1、则仅为1个字生成时钟。

    请仔细检查 spiTransmitAndReceiveData()函数中使用的块大小。  

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

    谢谢 QJ、

    charlen 为16, spiTransmitAndReceiveData()中的块大小在附加的图像中硬编码为1。

    时钟周期比我预期的要多很多。

    谢谢、

    Erik

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

    您好 Erik、

    您能否发布 SPI 配置和调用 SPI API 的代码? 谢谢

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

    QJ、

    下面是调用 SPI API 的代码和一些 Halcogen 生成的代码:

    void SPI_TX_Rx_test ()
    {
    spiDAT1_t 数据通信 fig1_t;
    uint16_t txData[16]、rxData[16];
    uint32_t returnData;
    
    dataconfig1_t.CS_hold = true;
    dataconfig1_t.WDEL = true;
    dataconfig1_t.DFSEL = SPI_FMT_0;
    dataconfig1_t.CSNR =(0xFF ^(0x1 << 1));
    
    TxData[0]= 0xFEFE;
    TxData[1]= 0xFEFE;
    TxData[2]= 0xFEFE;
    txData[3]= 0xFEFE;
    txData[4]= 0xFEFE;
    TxData[5]= 0xFEFE;
    txData[6]= 0xFEFE;
    txData[7]= 0xFEFE;
    
    //目前只使用单个块进行测试
    返回数据= spiTransmitAndReceiveData (spiREG1、&dataconfig1_t、1、&txData[0]、&rxData[0]);
    }
    
    void spiInit (void)
    {
    //...
    /**-延迟*/
    spiREG1->delay =(uint32)((uint32) 0U <<24U)/* C2TDELAY */
    |(UINT32)((UINT32) 0U <<16U)/* T2CDELAY */
    |(UINT32)((UINT32) 0U <<8U)/* T2EDELAY */
    |(uint32)((uint32) 0U << 0U);// C2EDELAY *
    
    /**-数据格式0 */
    spiREG1->FMT0 =(uint32)((uint32) 0U <<24U)// wdelay
    |(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
    |(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
    |(uint32)((uint32) 0U << 21U)//等待启用
    |(uint32)((uint32) 0U << 20U)/*移位方向*/
    |(uint32)((uint32) 0U << 17U)/*时钟极性*/
    |(uint32)((uint32) 0U << 16U)/*时钟相位*/
    |(uint32)((uint32) 79U << 8U)/*波特率预分频*
    |(uint32)((uint32) 16U << 0U);/*数据字长度*/
    
    //...
    } 

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

    我在 LS1224 Launchpad 上使用您的代码进行了测试、没有问题。 您在测试中使用了哪个硬件板? 您的 SPI 信号存在很大的噪声。

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

    感谢您的帮助 QJ、

    我们不使用 LaunchPad 开发套件。

    哪些条件会导致产生额外的时钟信号字值? 我的理解是、每个事务不可能产生超过16个时钟周期。  

    谢谢、

    Erik

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

    您好 Erik、

    另一项检查是在 SPI->DAT1=...处添加断点  在 SpiTransmitAndReceiveData()中,并在执行 SPI->DAT1=...时监视 SPI CLK。 (仅传输1个16位字)。

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

    QJ、

    我们的 SPI 时钟似乎以40MHz 的频率运行、这是不正确的。

    预分频器设置为79、因此不清楚 SPI 时钟为什么以如此高的频率运行。

    谢谢、

    Erik

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

    QJ、

    再次感谢您的帮助。

    确保时钟正确后、每个字传输的位数正好为16位。

    谢谢、

    Erik