大家好、
我在以波特率115200运行的 FIFO 模式下使用 SCI-A、具有1级(在 FIFO 中接收到1个字节将生成中断)。 它连接到 SCI-A TX 命令的电机、并在 SCI-A RX 上发送反馈。
- 当通过使能命令启用电机时,它将反馈 OK[CR][LF]。
- 当命令电机以特定速度移动时,它开始旋转,然后再次反馈 OK[CR][LF]。
对于调试、我同时使用:
- 示波器
- 将反馈发送到串行终端。
示波器和串行终端似乎都显示来自电机的反馈数据是准确的。
但是、即使 字节数正确、MCU RX 也会接收到损坏的反馈。
以下是代码段:
RX 引脚上的示波器图像:
串行终端显示从电机接收到"确定"。 但是、rDataA 的前4个字节应该为0x4F ('O') 0x4B ('K) 0x0D (CR) 0x0A (LF)。 但我正在接收0x808F、0x00A7、0x808D、0x0086。
我正在使用其他具有类似设置的 SCI 来接收两个传感器数据、这些 SCI 从传感器正确接收数据。
我的代码中可能缺少某些内容、我需要一些帮助才能理解这些内容。
当示波器和串行终端显示接收到的正确数据 与 MCU SCIA-RX 共享时、我感到有点惊讶。 这意味着 SCIA-RX 和 FIFO 初始化可能会有一些问题。 但是、当我将同一代码连接到其中一个传感器时、代码工作正常。 MCU SCI-A RX 引脚上正确接收传感器的数据输出、显示我的初始化设置正确。
因此,我假设我忽略了一些我无法弄清楚的重要问题。
下面是用于 SCI-A 初始化和 ISR 的代码(系统时钟为50MHz、LSPCLK 为12.5MHz):
void scia_init()
{
//
//注:时钟被打开到 Scia 外设
//在 InitSysCtrl()函数中
//
SciaRegs.SCICCR.all = 0x0007;// 1停止位,无回路
//无奇偶校验,8个字符位,
//异步模式,空闲线协议
SciaRegs.SCICTL1.all = 0x0003;//启用 TX、RX、内部 SCICLK、
//禁用 RX ERR、睡眠、TXWAKE
SciaRegs.SCICTL2.all = 0x0003;
SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
//BRR = LSPCLK /(SCI 异步波特* 8)- 1.
SciaRegs.SCIHBAUD.ALL = 0x0000;//对于在 SYSCLK 50MHz 和 LSPCLK 12.5MHz 上的19200波特率
SciaRegs.SCILBAUD.ALL = 0x000D;//对于19200波特率、SYSCLK 为50MHz、LSPCLK 为12.5MHz FSS 为115200
// SciaRegs.SCILBAUD.ALL = 0x001B;//对于在 SYSCLK 50MHz 和 LSPCLK 12.5MHz RW 57600上的19200波特率
SciaRegs.SCICTL1.all = 0x0023;//从复位中撤回 SCI
}
//
// Scia_fifo_init -初始化 SCI FIFO
//
void scia_fifo_init()
{
SciaRegs.SCIFFTX.all = 0xC000;
SciaRegs.SCIFFRX.ALL = 0x0021;
SciaRegs.SCIFFCT.all = 0x00;
// SciaRegs.SCICTL1.all = 0x0023;//从复位中撤回 SCI
SciaRegs.SCIFFTX.bit.TXFIFORESET = 1;
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
}
//
// sciaTxFifoIsr - SCIA 发送 FIFO ISR
//
中断空 sciaTxFifoIsr (空)
{
SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;//清除 SCI 中断标志
PieCtrlRegs.PIEACX.All|=PIEACK_group9;//发出 PIE ACK
}
//
// sciaRxFifoIsr - SCIA 接收 FIFO ISR
//
中断空 sciaRxFifoIsr (空)
{
uint16_t i;
对于(I = 0;I < SciaRegs.SCIFFRX.bit.RXFFST;I++)
{
rDataA[rDataSizeA]= SciaRegs.SCIRXBUF.ALL;
rDataSizeA++;
}
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志
PieCtrlRegs.PIEACX.All|=PIEACK_group9;//发出 PIE ACK
}
空 UART_Init()
{
scia_fifo_init();
scia_init();
}
谢谢、此致、
Ankit

