SIF一线通接收

void Isdn_Rx(uint8_t io)
{
    static uint8_t    temp = 0;
    static uint8_t    pre_level = 0;
    static uint8_t    cur_level = 0;
    static uint8_t    crc_xor = 0;
    static uint16_t    h_level_count = 0;
    static uint16_t    l_level_count = 0;
    volatile uint8_t recv_sync_ok = 0;
    uint8_t recv_zero_ok = 0;
    uint8_t recv_one_ok = 0;
    
    /*!< 获取当前电平 */
    cur_level = io;
 
    /*!< 当下降沿时 */
    if(cur_level < pre_level)
    {
        /* 检查信号[同步] */
        if(l_level_count > 150)
        {
            if(h_level_count > 3)
            {
                recv_sync_ok = 1;
                temp = 0;
                bitcount = 0;
                SIFcount = 0;
            }
        }
        /* 检查信号[0] */
        else if(l_level_count > h_level_count)
        {
            recv_zero_ok = 1;
            temp &= 0xfe; //bit位为0
        }
        /* 检查信号[0] */
        else if(h_level_count > l_level_count)
        {
            recv_one_ok = 1;
            temp |= 0x01; //bit位为1
        }
        /* 检测到信号 */
        if(recv_zero_ok || recv_one_ok)
        {
            if(++bitcount % 8 == 0)
            {
                SIF_Rx_buf[SIFcount++] = temp;
                if(SIFcount == 1)
                {
                    crc_xor = temp;
                }
                else if(SIFcount < 12)
                {
//                    crc_xor ^= temp;
                }
                else
                {
                    if(crc_xor == temp)
                    {
                        crc_xor = 0;
                    }
                    else
                    {
                        
                    }
                }
                temp = 0;
            }
            else
            {
                temp <<= 1;
            }
        }
        /**/
        l_level_count = 0;
    }
    /*!< 当上升沿时 */
    else if(cur_level > pre_level)
    {
        h_level_count = 0;
    }
    /*!< 当水平保持 */
    else
    {
        /*!< 计算预电平保持时间 */
        if(cur_level == 1)
        {
        h_level_count++;
        }
        else
        {
        l_level_count++;
        }
    }
    /*!< 保存当前电平 */
    pre_level = cur_level;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值