#include "TIM1_CAP.h" #include "app_def.h" #include "app_msg.h" #include "TIM6_1MS.h" #include "BSP.h" //#define debugbustestcomm unsigned char TIM1_Rev_flag=0; //表示正在接收总线数据,0表示当前未接收,1表示当前正在接收。 extern unsigned char RunMode; //工作模式 static unsigned char Bus_RevLength=146; //工作模式,0表示注册模式,分机发送注册码长度为146,工作模式时为26 extern unsigned char CallMode; //通话模式,0;双工 1;单工 extern void BUS_Rev_NewInfo(unsigned char *pInfo); #define BUS_REV_MAX 6 static unsigned short BUS_Rev_Buf[6][150]={0}; static unsigned char BUS_Rev_ReadIndex=0; static unsigned char BUS_Rev_WriteIndex=0; static unsigned char TIM1_cc_flag=0; unsigned char TIM1_Rev_Buf[30]={0}; unsigned char gt_busrxflag =0; int TIM1_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //================================= RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 |GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //================================= RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能 TIM_DeInit(TIM1); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //================================= TIM_TimeBaseStructure.TIM_Period =65535; //设置自动重装载寄存器周期值 TIM_TimeBaseStructure.TIM_Prescaler =(720-1); //720-1预分频器,100K的计数频率,10us加1. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数设置 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //参数初始化 TIM_ITConfig(TIM1, TIM_IT_Update, DISABLE); //================================= TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; //选择输入端 IC1映射到TI4上 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //下降沿捕获 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //通道一一对应 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM_ICInitStructure.TIM_ICFilter =5; //IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波 TIM_ICInit(TIM1, &TIM_ICInitStructure); //初始化定时器输入捕获通道 TIM_ClearFlag(TIM1,TIM_FLAG_CC4); //清中断标志位 TIM_ITConfig(TIM1,TIM_IT_CC4,ENABLE); //允许CC4IE捕获中断 TIM_ARRPreloadConfig(TIM1, ENABLE); //================================= NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //================================= TIM_Cmd(TIM1, ENABLE); return 1; } unsigned int itestCC4date[30] = {0}; unsigned int itestCC4cnt =0; void TIM1_CC_IRQHandler(void) { static unsigned int lastCC4Value=0; static unsigned short TIM1_CC3[200]={0}; unsigned int i,CC4Value; if(TIM_GetITStatus(TIM1,TIM_IT_CC4)!=RESET) { //========================================= i=TIM_GetCapture4(TIM1); if(i>lastCC4Value) CC4Value = i-lastCC4Value; else CC4Value=65535-lastCC4Value+i; lastCC4Value=i; BufSentTime = 40; itestCC4cnt ++; if (itestCC4cnt >25) { itestCC4cnt =0; } itestCC4date[itestCC4cnt] = CC4Value; //=========================================脉冲计算宽度 if(CC4Value<=150) { if(lastCC4Value>=CC4Value) { lastCC4Value=lastCC4Value-CC4Value; } else { lastCC4Value=65535-lastCC4Value+CC4Value; } } //=========================================处理误码 else { TIM1_CC3[TIM1_cc_flag]=CC4Value; if(TIM1_cc_flag==0) { if((CC4Value>450)&&(CC4Value<680)) //采集起始位:6ms { TIM1_cc_flag=2; TIM1_CC3[1]=CC4Value; gtackvalid =0; // TIM1_Rev_flag=1; } else if((CC4Value>900)&&(CC4Value<1100))//采ACK 10ms { gtackvalid=0 ; return; } else { TIM1_cc_flag=1; } } else if(TIM1_cc_flag==1) { if((CC4Value>450)&&(CC4Value<680)) //采集起始位:6ms { TIM1_cc_flag=2; TIM1_CC3[1]=CC4Value; gtackvalid =0; } else if((CC4Value>900)&&(CC4Value<1100)) //采ACK 10ms { gtackvalid=0 ; return; } } else if(TIM1_cc_flag450)&&(CC4Value<680)) //采集起始位:6ms { TIM1_cc_flag=2; gtackvalid =0; } else if((CC4Value>900)&&(CC4Value<1100))//采ACK 10ms { gtackvalid=0 ; return; } } //============================================================================ if(TIM1_cc_flag==Bus_RevLength) //接收完成,进行上传 { for(i=2;i=BUS_REV_MAX)BUS_Rev_WriteIndex=0; TIM1_cc_flag=0; //TIM1_Rev_flag=0; } else if(TIM1_cc_flag>Bus_RevLength) { TIM1_cc_flag=0; // TIM1_Rev_flag=0; } //============================================================================ } TIM_ClearITPendingBit(TIM1, TIM_IT_CC4); } } #ifdef debugbustestcomm unsigned short dwdcnt =0; unsigned short dwdcnt2 =0; unsigned short dwdcnt3 =0; #endif void BUS_Rev_Tick(void) { unsigned short i,j,k; unsigned short checkSum=0; //======================================= if(RunMode==0) { Bus_RevLength=146; } else { Bus_RevLength=26; } #ifdef debugbustestcomm dwdcnt2 ++; if (dwdcnt2 == 110) { OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, 'Y')); dwdcnt2 =0; } else if (dwdcnt2 >200) { dwdcnt2 =0; OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, 'Y')); } else if (dwdcnt2 >100) { dwdcnt2 =0; OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, 'Y')); // OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA5, TO_WORD(0x11, 0x39)); } #endif //======================================= if(BUS_Rev_WriteIndex != BUS_Rev_ReadIndex) { for(i=0;i<30;i++) { TIM1_Rev_Buf[i]=0; } //======================================= for(i=0;i<(Bus_RevLength-2);i++) { if(BUS_Rev_Buf[BUS_Rev_ReadIndex][i]>360) //230409 { if(i>0) { if(BUS_Rev_Buf[BUS_Rev_ReadIndex][i-1]<280) { BUS_Rev_Buf[BUS_Rev_ReadIndex][i-1]+=100; } else { BUS_Rev_Buf[BUS_Rev_ReadIndex][i+1]+=100; } } else { BUS_Rev_Buf[BUS_Rev_ReadIndex][i+1]+=100; } BUS_Rev_Buf[BUS_Rev_ReadIndex][i]-=100; } } //=======================================再次处理误码 for(i=0;i<(Bus_RevLength-2);i++) { k=(i)/8; j=(i)%8; if((BUS_Rev_Buf[BUS_Rev_ReadIndex][i]>250)&&(BUS_Rev_Buf[BUS_Rev_ReadIndex][i]<500)) //数据位:1 { TIM1_Rev_Buf[k]|=(1<>4)&0x0F; if((checkSum&0x0F)==i) { TIM1_Rev_Buf[17]=TIM1_Rev_Buf[17]&0x0F; BUS_Rev_NewInfo(TIM1_Rev_Buf); } else { #ifdef debugbustestcomm dwdcnt ++; #endif } } else { checkSum=TIM1_Rev_Buf[0]; checkSum+=TIM1_Rev_Buf[1]; checkSum+=(TIM1_Rev_Buf[2]&0x0F); i=(TIM1_Rev_Buf[2]>>4)&0x0F; if((checkSum&0x0F)==i) { TIM1_Rev_Buf[2]=TIM1_Rev_Buf[2]&0x0F; BUS_Rev_NewInfo(TIM1_Rev_Buf); } else if ((TIM1_Rev_Buf[2] == 'C') || (TIM1_Rev_Buf[2] == 'S')) { BUS_Rev_146BInfo(TIM1_Rev_Buf); // working find device } } BUS_Rev_ReadIndex++; if(BUS_Rev_ReadIndex>=BUS_REV_MAX)BUS_Rev_ReadIndex=0; } }