各位!我的SCIB通过HEF4052进行切换分时复用,出现的问题是初始化完成后程序运行一段时间就发现接收状态寄存器SCIRXST的内容就变成0x0092或者0x00B2这应该是提示接收错误了,可是我并没有操作SCIB,这是什么原因呢,如何排查和避免各位指点一下,多谢喽
!
Seven Han:请问您用的哪款芯片?SCIB的初始化代码是什么样的呢?
各位!我的SCIB通过HEF4052进行切换分时复用,出现的问题是初始化完成后程序运行一段时间就发现接收状态寄存器SCIRXST的内容就变成0x0092或者0x00B2这应该是提示接收错误了,可是我并没有操作SCIB,这是什么原因呢,如何排查和避免各位指点一下,多谢喽
!
chunfeng liang:
回复 Seven Han:
我用的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传送延时为0ScibRegs.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 INT4PieCtrlRegs.PIEIER1.bit.INTx5 = 1;// Enable PIE Gropu 1 INT5PieCtrlRegs.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 TXScibRegs.SCICTL1.bit.SLEEP= 0;// Disable sleep modeScibRegs.SCICTL1.bit.TXWAKE= 0;ScibRegs.SCICTL1.bit.RXERRINTENA= 0;// DisableError Interrupt
// ScibRegs.SCICTL2.bit.TXINTENA= 1;// Enable Tx interruptScibRegs.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);
}
各位!我的SCIB通过HEF4052进行切换分时复用,出现的问题是初始化完成后程序运行一段时间就发现接收状态寄存器SCIRXST的内容就变成0x0092或者0x00B2这应该是提示接收错误了,可是我并没有操作SCIB,这是什么原因呢,如何排查和避免各位指点一下,多谢喽
!
mangui zhang:最好详细到SCIRXST的具体功能bit上这样比较好判断错误提示
RX报错 一般都是有校验但收到的数据中没校验或校验错误