⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 carrierint.c

📁 低压电力线载波通信PL3200驱动程序
💻 C
字号:
/********************************************************************
包含头文件
********************************************************************/
#include "PL3200.H"
#include "CONST.H"
#include "RAM.H"
#include "IO.H"

/********************************************************************
函数名称: void CarrierInt(void) interrupt 7
功    能: 载波接收和发送中断处理
入    口: 无
出    口: ZB_RECE_OK    ZB_RECE_OK='Z',接收载波帧成功
                        其他:未成功接收数据帧                                         
********************************************************************/
void CarrierInt(void) interrupt 7
{
    uint8 i ;
    uint8 state ;
    
    ssc_adr_bak = SSC_ADR ;
    
    zb_busy_bit = 1 ;
    zb_tmr = 100 ;
    
    SSC_ADR = 0x00 ;
    state = SSC_DAT ;
    
    if((state&0x01)==1)
    {//载波发送
        if((zb_send_ptr<(zb_total_len-1))&&(zb_send_ptr<zb_send_buf_len))
        {
            zb_send_ptr++ ;
            SSC_BUF = zb_send_buf[zb_send_ptr] ;
        }
    }
    else
    {//载波接收
        if(zb_rece_ptr>=zb_rece_buf_len) 
        {
            goto zb_rece_exit ;
        }
    
        if((state&0x04)==4)
        {//接收帧头
            if(zb_rece_step==0)
            {
                zb_rece_crc = 0 ;
                zb_rece_ptr = 0 ;
                zb_rece_buf[zb_rece_ptr] = SSC_BUF ;
                zb_rece_crc = zb_rece_crc+zb_rece_buf[zb_rece_ptr] ;
                zb_rece_len = 2 ;
                zb_rece_step = 1 ;
            }
            else
            {
                zb_rece_step = 0 ;
                SSC_ADR = 0x00 ; 
                SSC_DAT = 0x00 ;
            }
        }
        else if(zb_rece_step==1)
        {//接收后续表号
            zb_rece_ptr++ ;
            zb_rece_buf[zb_rece_ptr] = SSC_BUF ;
            zb_rece_crc = zb_rece_crc+zb_rece_buf[zb_rece_ptr] ;
            zb_rece_len-- ;
            if(zb_rece_len==0)
            {
                zb_rece_step = 2 ;
            }
        }
        else if(zb_rece_step==2)
        {//接收控制码
            zb_rece_ptr++ ;
            zb_rece_buf[zb_rece_ptr] = SSC_BUF ;
            zb_rece_crc = zb_rece_crc+zb_rece_buf[zb_rece_ptr] ;
            zb_rece_step = 3 ;
        }
        else if(zb_rece_step==3)
        {//接收数据长度
            zb_rece_ptr++ ;
            zb_rece_buf[zb_rece_ptr] = SSC_BUF ;
            zb_rece_crc = zb_rece_crc+zb_rece_buf[zb_rece_ptr] ;
            if((SSC_BUF=!0)&&(SSC_BUF<=(zb_rece_buf_len-8)))
            {
                zb_rece_len  = SSC_BUF ;
                zb_rece_step = 4 ;
            }
            else
            {
                zb_rece_step = 0 ;
                SSC_ADR = 0x00 ; 
                SSC_DAT = 0x00 ;
            }
        }
        else if(zb_rece_step==4)
        {//接收数据
            zb_rece_ptr++ ;
            zb_rece_buf[zb_rece_ptr] = SSC_BUF ;
            zb_rece_crc = zb_rece_crc+zb_rece_buf[zb_rece_ptr] ;
            zb_rece_len-- ;
            if(zb_rece_len==0)
            {
                zb_rece_len = 2 ;
                zb_rece_step = 5 ;
            }
        }
        else if(zb_rece_step==5)
        {//接收校验码
            zb_rece_ptr++ ;
            zb_rece_buf[zb_rece_ptr] = SSC_BUF ;
            zb_rece_len-- ;
            if(zb_rece_len==0)
            {
                if(((zb_rece_crc%256)==zb_rece_buf[zb_rece_ptr-1])&&((zb_rece_crc/256)==zb_rece_buf[zb_rece_ptr]))
                {
                    for(i=0;i<(zb_rece_buf[4]+7);i++)
                    {
                        zb_rece_buf_bak[i] = zb_rece_buf[i] ;
                    }
                
                    zb_rece_step = 0 ;
                    SSC_ADR = 0x00 ; 
                    SSC_DAT = 0x00 ;
                    
                    ZB_RECE_OK = 'Z' ;
                }
            }
        }
        else
        {
            zb_rece_step = 0 ;
            SSC_ADR = 0x00 ; 
            SSC_DAT = 0x55 ;
        }
        
    }
zb_rece_exit:
    SSC_ADR = ssc_adr_bak ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -