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.
工具与软件:
CCS 版本:12.6.0
编译版本:TI v22.6.0.1.TLS
芯片模型:TMS320F28374S
GPIO 初始化代码如下:
void scib_gpio54_55_init(void) { EALLOW; const uint16_t mux54 = 6; // GPIO54_MUX = 6: SCIB_TX const uint16_t mux55 = 6; // GPIO55_MUX = 6: SCIB_RX GpioCtrlRegs.GPBGMUX2.bit.GPIO54 = mux54 / 4; GpioCtrlRegs.GPBMUX2.bit.GPIO54 = mux54 % 4; GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0; // 0: enable pull up GpioCtrlRegs.GPBDIR.bit.GPIO54 = 1; // 0:input 1:output GpioCtrlRegs.GPBGMUX2.bit.GPIO55 = mux55 / 4; GpioCtrlRegs.GPBMUX2.bit.GPIO55 = mux55 % 4; GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0; // 0: enable pull up GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0; // 0:input 1:output EDIS; } void scia_gpio35_36_init(void) { EALLOW; const uint16_t mux35 = 1; // GPIO35_MUX = 1: SCIA_RX const uint16_t mux36 = 1; // GPIO36_MUX = 1: SCIA_TX // SCIA_RX GpioCtrlRegs.GPBGMUX1.bit.GPIO35 = mux35 / 4; // 0:GPIO 1:RXD GpioCtrlRegs.GPBMUX1.bit.GPIO35 = mux35 % 4; // 0:GPIO 1:RXD GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0; // enable pull up GpioCtrlRegs.GPBDIR.bit.GPIO35 = 0; // 0:input 1:output // SCIA_TX GpioCtrlRegs.GPBGMUX1.bit.GPIO36 = mux36 / 4; // 0:GPIO 1:TXD GpioCtrlRegs.GPBMUX1.bit.GPIO36 = mux36 % 4; // 0:GPIO 1:TXD GpioCtrlRegs.GPBPUD.bit.GPIO36 = 0; // enable pull up GpioCtrlRegs.GPBDIR.bit.GPIO36 = 1; // 0:input 1:output EDIS; }
SCI 初始化代码如下:
void scib_init(uint32_t baud_rate) { uint16_t prescale = (uint16_t)(get_clock_freq() / 4 / baud_rate / 8 - 1); ScibRegs.SCICTL1.all = 0x00; // reset SCI ScibRegs.SCICCR.all = 0x07; // 1 bit stop, disable parity, idle mode, 8 bits data ScibRegs.SCIHBAUD.bit.BAUD = prescale / 256; ScibRegs.SCILBAUD.bit.BAUD = prescale % 256; ScibRegs.SCIFFRX.bit.RXFIFORESET = 1; // 1:enable RXFIFO ScibRegs.SCIFFTX.bit.SCIRST = 1; // 1:resume FIFO, 0: reset FIFO ScibRegs.SCIFFTX.bit.SCIFFENA = 1; // enable FIFO ScibRegs.SCICTL1.all = 0x23; // Enable RX and TX, enable SCI add_task("scib_soft_fifo", soft_fifo_1ms_task, FOREGROUND_TASK, 1, 0); } static void soft_fifo_1ms_task(void) { uint16_t i; // -------------------------------------------------------------------- if(ScibRegs.SCIRXST.bit.RXERROR) { // writing a zero to SWRESET to clear FE OE PE RXERROR ScibRegs.SCICTL1.bit.SWRESET = 0; // re-enable SCI by writing a 1 to SWRESET bit ScibRegs.SCICTL1.bit.SWRESET = 1; } // -------------------------------------------------------------------- while(ScibRegs.SCIFFRX.bit.RXFFST) { uint8_t rxd = ScibRegs.SCIRXBUF.bit.SAR; if(ScibRxFifo.ElementNum < 2*ArrLen(ScibRxFifo.Buffer)) { packed_byte_array_set(ScibRxFifo.Buffer, ScibRxFifo.EnqueueIndex, rxd); ScibRxFifo.EnqueueIndex ++; ScibRxFifo.EnqueueIndex %= 2*ArrLen(ScibRxFifo.Buffer); ScibRxFifo.ElementNum ++; } } // -------------------------------------------------------------------- for(i=0; i<16; i++) { if(ScibRegs.SCIFFTX.bit.TXFFST < 16) { uint8_t txd; if(ScibTxFifo.ElementNum) { txd = packed_byte_array_get(ScibTxFifo.Buffer, ScibTxFifo.DequeueIndex); ScibTxFifo.DequeueIndex ++; ScibTxFifo.DequeueIndex %= 2*ArrLen(ScibTxFifo.Buffer); ScibTxFifo.ElementNum --; ScibRegs.SCITXBUF.bit.TXDT = txd; } } else { break; } } }
void scia_init(uint32_t baud_rate) { uint16_t prescale = (uint16_t)(get_clock_freq() / 4 / baud_rate / 8 - 1); SciaRegs.SCICTL1.all = 0x00; // reset SCI SciaRegs.SCICCR.all = 0x07; // 1 bit stop, disable parity, idle mode, 8 bits data SciaRegs.SCIHBAUD.bit.BAUD = prescale / 256; SciaRegs.SCILBAUD.bit.BAUD = prescale % 256; SciaRegs.SCIFFRX.bit.RXFIFORESET = 1; // 1:enable RXFIFO SciaRegs.SCIFFTX.bit.SCIRST = 1; // 1:resume FIFO, 0: reset FIFO SciaRegs.SCIFFTX.bit.SCIFFENA = 1; // enable FIFO SciaRegs.SCICTL1.all = 0x23; // Enable RX and TX, enable SCI add_task("scia_soft_fifo", soft_fifo_1ms_task, FOREGROUND_TASK, 1, 0); } static void soft_fifo_1ms_task(void) { uint16_t i; // -------------------------------------------------------------------- if(SciaRegs.SCIRXST.bit.RXERROR) { // writing a zero to SWRESET to clear FE OE PE RXERROR SciaRegs.SCICTL1.bit.SWRESET = 0; // re-enable SCI by writing a 1 to SWRESET bit SciaRegs.SCICTL1.bit.SWRESET = 1; } // -------------------------------------------------------------------- while(SciaRegs.SCIFFRX.bit.RXFFST) { uint8_t rxd = SciaRegs.SCIRXBUF.bit.SAR; if(SciaRxFifo.ElementNum < 2*ArrLen(SciaRxFifo.Buffer)) { packed_byte_array_set(SciaRxFifo.Buffer, SciaRxFifo.EnqueueIndex, rxd); SciaRxFifo.EnqueueIndex ++; SciaRxFifo.EnqueueIndex %= 2*ArrLen(SciaRxFifo.Buffer); SciaRxFifo.ElementNum ++; } } // -------------------------------------------------------------------- for(i=0; i<16; i++) { if(SciaRegs.SCIFFTX.bit.TXFFST < 16) { uint8_t txd; if(SciaTxFifo.ElementNum) { txd = packed_byte_array_get(SciaTxFifo.Buffer, SciaTxFifo.DequeueIndex); SciaTxFifo.DequeueIndex ++; SciaTxFifo.DequeueIndex %= 2*ArrLen(SciaTxFifo.Buffer); SciaTxFifo.ElementNum --; SciaRegs.SCITXBUF.bit.TXDT = txd; } } else { break; } } }
我们以相同的方式初始化 SCIA 和 SCIB、SCIA 函数正常。 但是、SCIB 只能发送消息、而无法接收消息。 我们在 SCIB 接收引脚之前测量了波形、波形准确且正常。 不过、SCIB 接收 FIFO 总是保持为0、表示没有接收到消息。 如何解决该问题?
您好!
如果您在 RX 上看到从另一个器件发送的波形正确、但在 FIFO 中没有看到接收到的数据、则这可能是 GPIO 设置问题。
您可以仔细检查 SCIB 的 GPIO 多路复用是否正确吗?
侧边说明:您可以通过启用内部环回(将 TX 和 RX 在内部连接在一起)来确认 SCI 配置(GPIO 多路复用除外)是否正确、从而验证您是否可以在 SCIB 中发送和接收数据正常。
此致、
Allison
尊敬的 Allison:
目前、我们正在从引导过渡到应用程序执行。 如果该应用程序直接运行、则功能正常、SCIB 可以正确读取和写入。 但是、在从引导模式转换到应用程序时、会出现问题、例如 SCIB 无法读取。 是否有人有任何好的解决方案? 非常感谢!
此致、
Yulong Cheng
尊敬的 Yulong Cheng:
您能否在这方面再详细说明一下吗? 例如、您使用什么引导模式? 您是否在启动过程中使用 SCI (例如 SCI 引导等)? 您能否验证您是否正确地从 bootROM/bootloader 跳转到应用程序代码、在此之前没有卡住、并且 SCIB 在此过程中得到了正确初始化? 更多信息可以帮助我提供有关调试方法的建议。
为了澄清、您已经使用 SCIA 完成了此启动并跳转到应用 、SCIB 和 SCIA 能够正常工作(可以发送和接收)、但 SCIB 却不能正常工作?
此致、
Allison
尊敬的 Allison:
感谢您的答复和支持。 出现此问题的原因是我们意外地将另一个引脚配置为 SCIB 的 RX。
此致、
Yulong Cheng
尊敬的 Yulong Cheng:
很高兴听到您能够解决此问题! 我将继续、关闭该线程
此致、
Allison