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.

串行口B接收不正常的问题

Other Parts Discussed in Thread: TMS320F28335

各位!我的SCIB通过HEF4052进行切换分时复用,出现的问题是初始化完成后程序运行一段时间就发现接收状态寄存器SCIRXST的内容就变成0x0092或者0x00B2这应该是提示接收错误了,可是我并没有操作SCIB,这是什么原因呢,如何排查和避免各位指点一下,多谢喽

  • 请问您用的哪款芯片?SCIB的初始化代码是什么样的呢?
  • 我用的TMS320F28335,初始化代码如下:


    void SCIB_FIFO_Init( void )
    {
    // 配置发送FIFO寄存器
    ScibRegs.SCIFFTX.bit.SCIRST = 1; // 继续执行功能
    ScibRegs.SCIFFTX.bit.SCIFFENA = 1; // 使能SCI FIFO功能
    ScibRegs.SCIFFTX.bit.TXFFIENA = 1; // FIFO发送中断使能,使能TXFIFO与TXFFIVL匹配中断
    ScibRegs.SCIFFTX.bit.TXFFIL = 0; // 发送中断级别,此时为上电默认值0,当TXFFST[4:0]<=TXFFIL[4:0]时产生发送中断,把此处改成0发送就正常了
    // ScibRegs.SCIFFTX.all = 0xc020; // 寄存器整体复制可以用这句话
    // 配置接收FIFO寄存器
    ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1; // 清除接收FIFO溢出标志位
    ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1; // 清除接收FIFO中断标志位
    ScibRegs.SCIFFRX.bit.RXFFIENA = 1; // 使能FIFO接收中断
    ScibRegs.SCIFFRX.bit.RXFFIL = 1; // FIFO接收中断级别为8,当 RXFFST[4:0] >= RXFFIL[4:0] 时产生接收中断
    // ScibRegs.SCIFFRX.all = 0x0021; // 寄存器整体复制可以用这句话

    ScibRegs.SCIFFCT.all = 0x00; // 为默认值 效果为 禁用自动波特率调整, fifo传送延时为0
    ScibRegs.SCIFFTX.bit.TXFIFOXRESET = 1; // 重新使能发送fifo操作
    ScibRegs.SCIFFRX.bit.RXFIFORESET = 1; // 重新使能接收fifo操作
    }

    //下面的PIE配置在主程序开始就进行了!!!
    {
    // 重定位中断向量表
    EALLOW;

    PieVectTable.TINT0 = &cpu_timer0_isr; // Time0 中断向量重定位
    // PieVectTable.XINT13 = &cpu_timer1_isr; // Time1 中断向量重定位
    // PieVectTable.TINT2 = &cpu_timer2_isr; // Time2 中断向量重定位

    PieVectTable.XINT1 = &XINT1_Isr;
    PieVectTable.XINT2 = &XINT2_Isr;
    PieVectTable.EPWM1_INT = &EPWM1_Timer_Isr;
    // PieVectTable.SCIRXINTA = &SCIARxFifoIsr; // 中断向量表重新赋值( 自定义中断函数的入口地址 )
    // PieVectTable.SCITXINTA = &SCIATxFifoIsr; // 中断向量表重新赋值
    PieVectTable.SCIRXINTB = &SCIBRxFifoIsr; // 中断向量表重新赋值( 自定义中断函数的入口地址 )
    PieVectTable.SCITXINTB = &SCIBTxFifoIsr; // 中断向量表重新赋值
    PieVectTable.SCIRXINTC = &SCICRxFifoIsr; // 中断向量表重新赋值( 自定义中断函数的入口地址 )
    PieVectTable.SCITXINTC = &SCICTxFifoIsr; // 中断向量表重新赋值
    EDIS;

    // Enable interrupts required for this. example 中断使能
    PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // Enable PIE Gropu 1 INT4
    PieCtrlRegs.PIEIER1.bit.INTx5 = 1; // Enable PIE Gropu 1 INT5
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // 使能定时器0的PIE级中断线,由于time1和time2直接连接CPU所以不需要PIE控制
    // Enable interrupts required for this. example 中断使能
    PieCtrlRegs.PIEIER3.bit.INTx1 = 0; // 使能PIE中的EPWM1中断
    // Enable interrupts required for this. example 中断使能
    PieCtrlRegs.PIEIER8.bit.INTx5 = 1; // PIE Group 8, INT5 SCIRXINTC SCIC 使能PIE分组8的第5中断线SCIC的接收中断
    PieCtrlRegs.PIEIER8.bit.INTx6 = 1; // PIE Group 8, INT6 SCITXINTC SCIC 使能PIE分组8的第6中断线SCIC的发送中断
    // Enable interrupts required for this. example 中断使能
    // PieCtrlRegs.PIEIER9.bit.INTx1 = 1; // PIE Group 9, INT3 SCIRXINTA SCIA 使能PIE分组9的第1中断线SCIA的接收中断
    // PieCtrlRegs.PIEIER9.bit.INTx2 = 1; // PIE Group 9, INT4 SCITXINTA SCIA 使能PIE分组9的第2中断线SCIA的发送中断
    // Enable interrupts required for this. example 中断使能
    PieCtrlRegs.PIEIER9.bit.INTx3 = 1; // PIE Group 9, INT3 SCIRXINTB SCIB 使能PIE分组9的第3中断线SCIB的接收中断
    PieCtrlRegs.PIEIER9.bit.INTx4 = 1; // PIE Group 9, INT4 SCITXINTB SCIB 使能PIE分组9的第4中断线SCIB的发送中断
    }

    void SCIB_Init( void )
    {
    InitSciBGpio(); // 初始化串口B的信号引脚

    SCIB_Location( COM_IDLE ); // 初始化串行口B悬空
    // 基本的参数配置
    //8位数据位,空闲线模式,禁止回送测试模式,无奇偶效验,1位结束位
    ScibRegs.SCICCR.bit.SCICHAR = 7; // 8位模式
    ScibRegs.SCICCR.bit.ADDRIDLE_MODE = 0; // 选择空闲线模式与RS-232兼容
    ScibRegs.SCICCR.bit.LOOPBKENA = 0; // 屏蔽回送测试模块功能
    ScibRegs.SCICCR.bit.PARITYENA = 0; // 禁止极性功能
    ScibRegs.SCICCR.bit.PARITY = 0; //
    ScibRegs.SCICCR.bit.STOPBITS = 0; // 1个停止位

    ScibRegs.SCICTL1.bit.RXENA = 1; // 使能接收
    // ScibRegs.SCICTL1.bit.TXENA = 1; // Enable TX
    ScibRegs.SCICTL1.bit.SLEEP = 0; // Disable sleep mode
    ScibRegs.SCICTL1.bit.TXWAKE = 0;
    ScibRegs.SCICTL1.bit.RXERRINTENA = 0; // Disable Error Interrupt

    // ScibRegs.SCICTL2.bit.TXINTENA = 1; // Enable Tx interrupt
    ScibRegs.SCICTL2.bit.RXBKINTENA = 1; // Enable Rx interrupt

    SCIB_TXINTEN();

    // 串行口B的波特率配置,此时LSPCLK为系统时钟4分频
    #if( CPU_FRQ_150MHZ )
    // ScibRegs.SCIHBAUD = 0x0001; // 9600 baud @LSPCLK = 37.5MHz.
    // ScibRegs.SCILBAUD = 0x00E7;

    ScibRegs.SCIHBAUD = 0x0000; // 115200 baud @LSPCLK = 37.5MHz.
    ScibRegs.SCILBAUD = 0x0028;

    #endif

    #if( CPU_FRQ_100MHZ )
    // ScibRegs.SCIHBAUD = 0x0001; // 9600 baud @LSPCLK = 25MHz.
    // ScibRegs.SCILBAUD = 0x0044;

    ScibRegs.SCIHBAUD = 0x0000; // 115200 baud @LSPCLK = 25MHz.
    ScibRegs.SCILBAUD = 0x001a;
    #endif

    SCIB_FIFO_Init();
    // SCIB_PIEConfig();

    ScibRegs.SCICTL1.all = 0x0023;

    SCI_MSGRST( UARTB );
    Delay_ms(50);
    }
  • 最好详细到SCIRXST的具体功能bit上 这样比较好判断错误提示
    RX报错 一般都是有校验 但收到的数据中没校验或校验错误