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.

[参考译文] TMS320F280025:UART 和 SPI

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1080828/tms320f280025-uart-and-spi

部件号:TMS320F280025
“线程:AFE031”中讨论的其它部件

你(们)好

我的项目使用 SCI A 到 RS485。 下面是我的配置代码

代码[1]

           sci_setConfig (SCIA_base,25000000,ulBaudRate,(wlen |
                                                        秒数|
                                                        奇偶校验);

           sci_resetChannels (SCIA_base);
           SCI_CLEARInterruptStatus (SCIA_BASE,SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT);
           sci_enableModule (SCIA_base);
           SCI 性能软件重置(SCIA_BASE);

           sci_enableInterrupt (SCIA_base,SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT);

           SCI_CLEARInterruptStatus (SCIA_BASE,SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT);

           Interrup_enable (INT_SCIA_RX);
           Interrup_enable (INT_SCIA_TX);

设置工作正常,然后我添加了 SPI 模块 B 来控制 TI AFE031代码[2]

添加 SPI 模块,用于  IC 和 MCU 之间的通信。 下面是配置 SPI B 的代码

代码[2]


   GPIO 设置引脚 Mux (16,GPIO MUX_CPU1,0);
   GPIO 设置引脚选项(16,GPIO 输出,GPIO PushPull)
   GPIO 写入引脚(16,0);

   SpibRegs.SPIFFTX.ALL = HAL_SPI_FFTX;
   SpibRegs.SPIFFRX.ALL = HAL_SPI_FFRX;
   SpibRegs.SPIFFCT.ALL = 0x0;

      EALLOW;
   ClkCfgRegs.LOSPCP.all = HAL_SPI_LSPCLK;
   EDIS;

   SpibRegs.SPICCR.Bit.SPISWRESET =0;
   SpibRegs.SPICCR.Bit.CLKPOLARITY =1;
   SpibRegs.SPICCR.bit.SPILBK = 0;
   SpibRegs.SPICCR.Bit.SPICHAR = 15;//16位字符
   SpibRegs.SPICCR.bit.HS_mode = 0x1;
   SpibRegs.SPICTL.Bit.SPIINTENA = 0;//中断禁用
   SpibRegs.SPICTL.bit.Talk = 1;//传输启用
   SpibRegs.SPICTL.bit.master_slave = 1;//Master
   SpibRegs.SPICTL.Bit.CLK_PHASE = 0;//正常相位,取决于 SPICCR.6 (时钟极性)
   SpibRegs.SPICTL.Bit.OVERRUNINTENA = 0;//溢出中断禁用

   SpibRegs.SPIBRR.Bit.SPI_bit_rate = HAL_SPI_BRR;

   SpibRegs.SPIPRI.Bit.free =1; //设置断点时,断点不会干扰 xmission

   SpibRegs.SPICCR.Bit.SPISWRESET =1;//准备传输

UART 模块 A (SCI)未执行代码[2]。 如果代码[2]未执行,UART 功能将恢复。

我将 SCI A 用于 UART,而 SPI B 用于不同功能。 我认为他们不应该相互影响。

有什么想法吗?

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

    您好,

    感谢您的提问! 如果我正确理解您的问题,添加 SPIB 后,SCIA 停止工作,这是否正确?

    如果是这样,则 SPIB 中断(TX 和 RX)很可能会“使 SCIA 中断变得“饥饿”。 “饥饿”意味着 SCI 中断 ISR 没有机会进入,因为它们不断被 SPIB 中断抢占。 这是因为 SPIB 的优先级高于 SCIA (请参阅 TRM 的 PIE 通道映射表):

    根据 SPI 和 SCI 的使用情况,最佳的解决方案是让 SPI 使用 DMA 自动将数据传输到内存,而不会中断。 这将允许 SCI (没有 DMA)继续触发其中断。

    另一个潜在的解决方案是停止 SPI 通信(TX 和 RX)足够长的时间,使 SCI 也有机会进行通信。

    您可以尝试的另一个潜在解决方案(这不是很好)是偶尔临时禁用 SPI 中断。例如,每10个 SPI 中断一次,您在退出时禁用中断,并让 SCIA ISR 重新启用 SPI。 如果 SCI 并非始终在传输,这可能很危险。 更好的实施方法是使用计时器中断,有时从 SCI 和 SPI 缓冲区读取数据,从而消除实际 SCI 和 SPI 中断的需要。

    如果对此有任何疑问,请告诉我。

    此致,

    文斯

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

    你好,Vince

    感谢你的介绍。 我正在 SPI 中使用轮询,无中断。

    SCI A 使用 GPIO 2和3进行 Tx/RX。 使用下面的代码解锁销

       GPIO 设置引脚 Mux (2,GPIO MUX_CPU1,9);
       GPIO 设置引脚 Mux (3,GPIO MUX_CPU1,9);

    SPI B 使用以下代码进行 mux

       GPIO 设置引脚选项(7,GPIO 输入,GPIO 同步| GPIO 上拉);
       // SPI_味 噌
       GPIO 设置引脚选项(6,GPIO 输入,GPIO 同步| GPIO 上拉);
       // SPI_CS
       GPIO 设置引脚选项(29,GPIO 输入,GPIO 同步| GPIO 上拉);
       // SPI_CLK
       GPIO 设置引脚选项(28,GPIO 输入,GPIO 同步| GPIO 上拉);

    //将 PinMux 设置为 SPIB 模块:HK Woo
    //
       GPIO 设置引脚 Mux (6,GPIO MUX_CPU1,7);
       GPIO 设置引脚 Mux (7,GPIO MUX_CPU1,7);
       GPIO 设置引脚 Mux (29,GPIO MUX_CPU1,11);
       GPIO 设置引脚 Mux (28,GPIO MUX_CPU1,11);

    巴西

    hk)

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

    您好,

    感谢您的跟进。 当 SPI 初始化代码中没有此行时,您能否验证 UART 是否工作?
     ClkCfgRegs.LOSPCP.all = HAL_SPI_LSPCLK;

    更改 LSPCLK 可能会更改有效波特率,并导致问题。 这不应阻止传输,但可以阻止接收(RX)。

    此致,

    文斯

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

    将尝试并告诉您结果。