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.

[参考译文] TMS320F28069M:2个不同 SPI 从器件的 SPI 通信问题

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/931806/tms320f28069m-spi-communication-problem-with-2-different-spi-slave-devices

器件型号:TMS320F28069M

您好!  

我无法与两个不同的 SPI 器件进行 SPI 通信。 问题是、一个从器件需要正常时钟相位、另一个从器件需要延迟时钟相位、因此我需要在程序运行期间动态更改时钟相位。  

如果我在运行期间将时钟相位从正常更改为 延迟 ,则相位会正确地更改为延迟(在逻辑分析仪上进行分析),但当我尝试将其改回正常相位时,时钟相位仍会延迟。  

结论:  

SLAVE1 (正常时钟阶段)、 SLAVE2 (延迟时钟阶段)  

程序流:  


0。初始 SPI 设置:   

void HAL_setupSpiA (HAL_Handle handle)
{
HAL_Obj *) handle =(HAL_Obj *) handle;

SPI_reset (obj->spiAmHandle);
SPI_setMode (obj->OutAmHandle、SPI_Mode_Master);
SPI_setClkPolarity (obj->SpiHandle、SPI_ClkPolputEdge)
;SpiInputEdge_InputTx;SpiInputEdge_Input_Spinarity (SPI_Spi_Spi_InputEdge)
spi_enableTxFifoEnh (obj->spiAHandle);
spi_enableTxFifo (obj->spiAHandle);
//spi_setTxDelay (obj->bauAHandle、0x0018);
spi_setClkPhase (obj->spiAHandle、SPI_ClkPhase_Baudle_Spi000e
);spi_setAdrate (spi_R000e);spi_Adrate_Adrate_deT (spi_Adrate_AdudeT);spi_Adte //CCA 1、5MHZ
SPI_setCharLength (obj->spiAHandle、SPI_CharLength _16_Bits);
SPI_setSuspend (obj->spiAHandle、SPI_TxSuspend_free);
SPI_enable (obj->spiAHandle);
} 

1. 与 slave1的通信正常  

2.将时钟相位更改为延迟(SPI_setClkPhase (obj->spiAHandle、SPI_ClkPhase_Delayed))  

-相位已正确更改为延迟

与 SLAVE2通信正常  

3.将时钟相位改回正常(SPI_setClkPhase (obj->spiAHandle、SPI_ClkPhase_Normal))  

-相位不变并保持延迟。

-与 SLAVE1通信失败  

是否有人知道如何解决此问题?  

感谢您的任何提示。  

此致、

Tom。  

 

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

    大家好、我刚刚解决了这个问题。 问题出在函数 SPI_setClkPhase (SPI_Handle spiHandle、const SPI_ClkPhase_e clkPhase)中。 默认情况  下,此函数仅包含行 SPI->SPICTL |= clkPhase,因此它可以将寄存器位从0设置为1,但不能将寄存器位设置为0,反之亦然。 因此,在 前面添加 SPI->SPICTL &=(~SPI_SPICTL_CLK_PHASE_BITS)行可以解决问题。  

    此致、

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

    您好、Tom、

    很高兴知道您的问题已解决。 SPI_setClkPhasy()函数的良好捕捉。