打印

PIC16F193x usart 奇校验通讯

[复制链接]
1851|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fq1110|  楼主 | 2013-4-8 18:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,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;
        }
}

沙发
fq1110|  楼主 | 2013-4-9 10:37 | 只看该作者
有大侠能指导下吗?可能是代码哪里出了问题呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

530

帖子

1

粉丝