一帧的数据结构 (NEC协议)
数据0和数据1的表示
在接收头收到的信号的相位是相反的
配置外部中断
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
void EXTI0_Config(void)
{
/* Enable GPIOA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* Configure PA0 pin as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Connect EXTI0 Line to PA0 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
/* Configure EXTI0 line */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //EXTI_Trigger_Falling;// EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable and set EXTI0 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
获得高电平脉冲宽度时间
u8 HW_ReceiveTime(void)
{
u8 t=0;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)//???
{
t++;
delay_us(20);//20us为单位
if(t>=250) return t;//????
}
return t;
}
外部中断处理
void EXTI0_1_IRQHandler()
{
u8 time=0,startSignal=0,Data=0,Count=0;
unsigned long HW_ReceivedData=0;
if(EXTI_GetITStatus(EXTI_Line0) != RESET)//?????EXTI??????????,????EXTI_Line???
{
//if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) GPIO_SetBits(GPIOA,GPIO_Pin_0);//??LED
//else GPIO_ResetBits(GPIOA,GPIO_Pin_0);//?
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
{
time = HW_ReceiveTime();
if(time>=250)
{
startSignal=0;
HW_ReceivedData=0;
Count=0;
break;
}
else if(time>=200 && time<250)//引导码 4.5ms
{
startSignal=1;//??????
HW_ReceivedData=0;
Count=0;
continue;
}
else if(time>=60 && time<90) //电平宽度1.5ms
{
Data=1;//???? 1
}
else if(time>=10 && time<50) //电平宽度0.6ms
{
Data=0;//???? 0
}
// else
// {
// break;
//
// }
if(startSignal==1)
{
HW_ReceivedData<<=1;
HW_ReceivedData+=Data;//存放data
Count++;
if(Count>=32)//满32位取出数
{
// for(i=0;i<4;i++)
// {
// printf("%x\n",HW_ReceivedData);
// }
//printf("0x%lx\n",HW_ReceivedData);
unsigned char cha[4]= {0};
cha[0] = (HW_ReceivedData & 0xFF000000)>>24;
cha[1] = (HW_ReceivedData & 0x00FF0000)>>16;
cha[2] = (HW_ReceivedData & 0x0000FF00)>>8;
cha[3] = HW_ReceivedData & 0x000000FF;
if(cha[0]==0x00&&cha[1]==0xFF)//用户码
{
if(cha[2]==0x90&&(cha[2]+cha[3])==0xFF)//判断反码
{
//..... 得到编码数据处理
}
}
}
}
}
// /* Clear the EXTI line 0 pending bit */
EXTI_ClearITPendingBit(EXTI_Line0);
// EXTI_ClearITPendingBit(EXTI_Line0);//???????
EXTI_ClearFlag(EXTI_Line0);//???????
}
}