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;
}
SIF一线通接收
最新推荐文章于 2024-07-17 14:44:35 发布