大家好,PIC16F193X系列MCU不包括硬件奇偶校验功能,我现在需要与海为PLC通讯,PLC不支持8N1方式,仅支持8O1,8E1,8N2方式,找资料说PIC可以使用9位数据模式完成奇偶校验功能,但我使用之后,数据发送基本正确,但大概还是有30%的数据有问题,接收的话总是只能接收到一个包中的最后一个字节,其余均提示FERR接收帧错误。在读取和发送过程中,都是先处理的RX9D与TX9D。延时我也加了,间隔10ms才发送1个字节,具体代码如下:
void Init()
{
//usart
#if(SYSCLK==16000000)
//SPBRG=0x67; //16000000/(16*(SPBRG+1))=9600
SPBRG=0x10; //16000000/(16*(SPBRG+1))=57600
#endif
#if(SYSCLK==4000000)
SPBRG=0x19; //4000000/(16*(SPBRG+1))=9600
#endif
//奇检验
TXSTA=0x64;
RCSTA=0xd0;
// TXSTA=0x24;
// RCSTA=0x90;
BAUDCON=0x00;
//PIE1|=0x20; //open usart rx interrupt
PIE1|=0x30; //open usart interrupt
//Enable Intterupt
INTCON=0xd8; //GIE,PEIE,TMR0IE,RB0/INT,IOCIE
}
void interrupt ISR(void)
{
u8 rx9d=0;
if(RCIE&&RCIF) //USart接收中断
{
if(FERR==0)
{
if(g_usart_r_len<BUFFER_LEN)
{
g_usart_r_len++;
//奇检验
rx9d=RX9D;
*g_pusart_r_end=RCREG;
if(g_pusart_r_end!=(g_usart_r_buffer+BUFFER_LEN-1))
{
g_pusart_r_end++;
}
else
{
g_pusart_r_end=g_usart_r_buffer;
}
}
else
{
rx9d=RX9D;
rx9d=RCREG;
}
}
else
{
SPEN=0;
asm("nop");
SPEN=1;
}
if(OERR==1)
{
CREN=0;
asm("nop");
CREN=1;
}
RCIF=0;
}
if(TXIE&&TXIF) //USart发送中断
{
if(g_usart_s_len>0)
{
g_usart_s_len--;
//奇检验
TX9D=CalcOdd(g_CmdBuf[3-g_usart_s_len]);
TXREG=g_CmdBuf[3-g_usart_s_len];
/* g_usart_s_len--;
TXREG=*g_pusart_s_begin;
if(g_pusart_s_begin!=(g_usart_s_buffer+BUFFER_LEN-1))
{
g_pusart_s_begin++;
}
else
{
g_pusart_s_begin=g_usart_s_buffer;
}*/
g_uart_timer_1ms=0;
}
//if(g_usart_s_len==0)
{
TXIE=0;
}
TXIF=0;
}
}
|