我用SCIB外接485芯片进行RS485通信,但是一直都是无法接收到数据,只能发送数据,而且我可以确定485方向信号线是正确的控制方式。
初始化代码如下:
/*——————————————*/
/*形式参数:void */
/*返回值:void */
/*函数描述:配置SCIB */
/*——————————————*/
void Init_SCIB(uint32 uiBaud)
{
// 本例中用到的中断重新映射到本文件的中断服务子程序;
EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句
PieVectTable.SCIRXINTB = &ScibRxIsr;
EDIS; // 被保护的寄存器修改完成后,添加EDIS语句重新将这些寄存器保护起来
//软件复位SCI,复位值
ScibRegs.SCICTL1.bit.SWRESET =0;
//设置字符格式、通信协议、通信模式
ScibRegs.SCICCR.bit.SCICHAR=7; // 字符长度:8 bits
ScibRegs.SCICCR.bit.PARITYENA=0;//禁止奇偶校验
ScibRegs.SCICCR.bit.STOPBITS=0;//停止位为1个
ScibRegs.SCICCR.bit.ADDRIDLE_MODE=0;//空闲线模式协议
/*
* 波特率计算公式 baud = LSPCLK/[(BRR+1)*8]
* 故 BRR = LSPCLK/(baud*8) – 1
* SciaRegs.SCIHBAUD =BRR>>8;
* SciaRegs.SCILBAUD =BRR;
*/
{
Uint32 uiLSPCLK = SYSCLKOUT/(2*SysCtrlRegs.LOSPCP.bit.LSPCLK);
Uint16 uiBRR = uiLSPCLK/(uiBaud*8) – 1;
ScibRegs.SCIHBAUD = (uiBRR>>8)&0XFF;
ScibRegs.SCILBAUD = uiBRR&0XFF;
}
//使能SCI发送器和接收器
ScibRegs.SCICTL1.bit.RXENA=1;// 使能接收功能
ScibRegs.SCICTL1.bit.TXENA=1;// 使能发送功能
//使能中断(包含外设级、PIE级和CPU级),设置中断向量
ScibRegs.SCICTL2.bit.RXBKINTENA =1; // 使能SCI接收中断
PieCtrlRegs.PIEIER9.bit.INTx3 = 1; //使能PIE内的 SCIA_RX_INT中断
IER |= M_INT9; // 使能 CPU INT 9
EINT; // 全局中断使能INTM
//退出复位状态
ScibRegs.SCICTL1.bit.SWRESET =1;
}
中断接着代码,程序看是运行时能够进入接收中断,但是不是数据接收产生的,而是帧错误产生的,几次错误之后就无法进入中断了。
/*——————————————*/
/*形式参数:void */
/*返回值: void */
/*函数描述:SCIB接收中断处理函数 */
/*——————————————*/
interrupt void ScibRxIsr(void)
{
//char ch;
DINT;//关闭总中断
if (ScibRegs.SCIRXST.bit.RXRDY) {
SCIB_RecvBuf.auBuf[SCIB_RecvBuf.uiWrite++] = (uint8)ScibRegs.SCIRXBUF.bit.RXDT;
SCIB_RecvBuf.uiLastTmr = GetSysTmrMs();
} else {
ScibRegs.SCICTL1.bit.SWRESET = 0;
ScibRegs.SCICTL1.bit.SWRESET = 1;
}
//ch = ScibRegs.SCIRXBUF.bit.RXDT;
//RS485_SendData(&ch, 1);
PieCtrlRegs.PIEACK.all |= BIT9; //响应中断
EINT; //开总中断
}