#include "TIM6_1MS.h" #include "bsp.h" #include "app_def.h" #define BusTx_Check_STATE GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) extern unsigned char TIM1_Rev_flag; //表示正在接收总线数据,0表示当前未接收,1表示当前正在接收。 extern unsigned int LocalTime; unsigned char CallLineMode =0 ; U08 gtackvalid = 0; U08 gfxq_cmd =0; unsigned char BUS_SendBuf[4]; //应用层发送数据 unsigned char BUS_SendBitBuf[30]; //应用层发送中断位 //============================================ static unsigned char BUS_SendInex=0; // static unsigned char BUS_SendingBuf[4]; //定时器正在处理数据 static void s_frmBusTxNull(U16 prm) ; static void s_frmBusTxEntenData4(U16 prm) ; static void s_frmBusTxEntenData5(U16 prm) ; static void s_frmBusTxEntenData6(U16 prm) ; static void s_frmBusTxEntenData7(U16 prm) ; static void s_frmBusTxEntenData8(U16 prm) ; static void s_frmBusTxEntenData9(U16 prm) ; static void s_frmBusTxRegeditQuest(U16 prm) ; static void s_frmBusTxRegeditState(U16 prm) ; static void s_frmBusTxCallMode(U16 prm) ; static void s_frmBusTxEntenData20(U16 prm) ; static void s_frmBusTxEntenData21(U16 prm) ; static void s_frmBusTxSigAck(U16 prm); static void s_frmBusTxEveAck(U16 prm) ; static void s_frmBusTxFxq1(U16 prm); static void s_frmBusTxFxq2(U16 prm); //============================================ unsigned char Bus_SendStart=0; int TIM6_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); TIM_DeInit(TIM6); TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; //72000000/72=1M TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 100 - 1; //初始值 F=1M/100=10KHz TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure); //========================================================= TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); TIM_ITConfig(TIM6,TIM_IT_Update,DISABLE); TIM_ClearFlag(TIM6, TIM_FLAG_Update); NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM6, ENABLE); //========================================================= //PA9用于主端发码 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_9); //PA8 用于检测发码情况 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); gtackvalid =0; return 1; } void BUS_SendData(T_BUS_FRAME c) { unsigned char i=0; //=========================== // while(BUS_SendInex>0); // while(TIM1_Rev_flag>0); //=========================== i = HI_BYTE(c.DaddressDate); i += LO_BYTE(c.DaddressDate); c.DataType &=0x0F; i += c.DataType ; c.DataType |=((i&0x0F)<<4); //=========================== BUS_SendBuf[0]=HI_BYTE(c.DaddressDate); BUS_SendBuf[1]= LO_BYTE(c.DaddressDate); BUS_SendBuf[2]= c.DataType; // 处理数据 BUS_SendBitBuf[0] = ((BUS_SendBuf[0] >>0) &0x01); BUS_SendBitBuf[1] = ((BUS_SendBuf[0] >>1) &0x01); BUS_SendBitBuf[2] = ((BUS_SendBuf[0] >>2) &0x01); BUS_SendBitBuf[3] = ((BUS_SendBuf[0] >>3) &0x01); BUS_SendBitBuf[4] = ((BUS_SendBuf[0] >>4) &0x01); BUS_SendBitBuf[5] = ((BUS_SendBuf[0] >>5) &0x01); BUS_SendBitBuf[6] = ((BUS_SendBuf[0] >>6) &0x01); BUS_SendBitBuf[7] = ((BUS_SendBuf[0] >>7) &0x01); BUS_SendBitBuf[8] = ((BUS_SendBuf[1] >>0) &0x01); BUS_SendBitBuf[9] = ((BUS_SendBuf[1] >>1) &0x01); BUS_SendBitBuf[10] = ((BUS_SendBuf[1] >>2) &0x01); BUS_SendBitBuf[11] = ((BUS_SendBuf[1] >>3) &0x01); BUS_SendBitBuf[12] = ((BUS_SendBuf[1] >>4) &0x01); BUS_SendBitBuf[13] = ((BUS_SendBuf[1] >>5) &0x01); BUS_SendBitBuf[14] = ((BUS_SendBuf[1] >>6) &0x01); BUS_SendBitBuf[15] = ((BUS_SendBuf[1] >>7) &0x01); BUS_SendBitBuf[16] = ((BUS_SendBuf[2] >>0) &0x01); BUS_SendBitBuf[17] = ((BUS_SendBuf[2] >>1) &0x01); BUS_SendBitBuf[18] = ((BUS_SendBuf[2] >>2) &0x01); BUS_SendBitBuf[19] = ((BUS_SendBuf[2] >>3) &0x01); BUS_SendBitBuf[20] = ((BUS_SendBuf[2] >>4) &0x01); BUS_SendBitBuf[21] = ((BUS_SendBuf[2] >>5) &0x01); BUS_SendBitBuf[22] = ((BUS_SendBuf[2] >>6) &0x01); BUS_SendBitBuf[23] = ((BUS_SendBuf[2] >>7) &0x01); //=========================== Bus_SendStart=1; } void BUS_SendData2(T_BUS_FRAME c) { unsigned char i=0; //=========================== // while(BUS_SendInex>0); // while(TIM1_Rev_flag>0); //=========================== c.DataType &=0x0F; //=========================== BUS_SendBuf[0]= (c.DataType <<4); BUS_SendBuf[0] |= (HI_BYTE(c.DaddressDate)>>4); BUS_SendBuf[1] = ((HI_BYTE(c.DaddressDate)&0x0f) <<4); BUS_SendBuf[1] |= (LO_BYTE(c.DaddressDate)>>4); BUS_SendBuf[2]= (LO_BYTE(c.DaddressDate)&0x0f); i=(BUS_SendBuf[0]+ BUS_SendBuf[1]+(BUS_SendBuf[2]&0x0F))&0x0F; BUS_SendBuf[2] |= ((i&0x0F)<<4); // BUS_SendBuf[0]=HI_BYTE(c.DaddressDate); // BUS_SendBuf[1]= LO_BYTE(c.DaddressDate); // BUS_SendBuf[2]= c.DataType; // 处理数据 BUS_SendBitBuf[0] = ((BUS_SendBuf[0] >>0) &0x01); BUS_SendBitBuf[1] = ((BUS_SendBuf[0] >>1) &0x01); BUS_SendBitBuf[2] = ((BUS_SendBuf[0] >>2) &0x01); BUS_SendBitBuf[3] = ((BUS_SendBuf[0] >>3) &0x01); BUS_SendBitBuf[4] = ((BUS_SendBuf[0] >>4) &0x01); BUS_SendBitBuf[5] = ((BUS_SendBuf[0] >>5) &0x01); BUS_SendBitBuf[6] = ((BUS_SendBuf[0] >>6) &0x01); BUS_SendBitBuf[7] = ((BUS_SendBuf[0] >>7) &0x01); BUS_SendBitBuf[8] = ((BUS_SendBuf[1] >>0) &0x01); BUS_SendBitBuf[9] = ((BUS_SendBuf[1] >>1) &0x01); BUS_SendBitBuf[10] = ((BUS_SendBuf[1] >>2) &0x01); BUS_SendBitBuf[11] = ((BUS_SendBuf[1] >>3) &0x01); BUS_SendBitBuf[12] = ((BUS_SendBuf[1] >>4) &0x01); BUS_SendBitBuf[13] = ((BUS_SendBuf[1] >>5) &0x01); BUS_SendBitBuf[14] = ((BUS_SendBuf[1] >>6) &0x01); BUS_SendBitBuf[15] = ((BUS_SendBuf[1] >>7) &0x01); BUS_SendBitBuf[16] = ((BUS_SendBuf[2] >>0) &0x01); BUS_SendBitBuf[17] = ((BUS_SendBuf[2] >>1) &0x01); BUS_SendBitBuf[18] = ((BUS_SendBuf[2] >>2) &0x01); BUS_SendBitBuf[19] = ((BUS_SendBuf[2] >>3) &0x01); BUS_SendBitBuf[20] = ((BUS_SendBuf[2] >>4) &0x01); BUS_SendBitBuf[21] = ((BUS_SendBuf[2] >>5) &0x01); BUS_SendBitBuf[22] = ((BUS_SendBuf[2] >>6) &0x01); BUS_SendBitBuf[23] = ((BUS_SendBuf[2] >>7) &0x01); //=========================== Bus_SendStart=1; } void BUSMODE_SendTick(void) { static U08 laytime =0; static U08 u8cnt1 =0; static U08 u8cnt2 =0; static U08 u8line =0xff; static U08 u8oldline =0xff; laytime ++; if ( laytime <30) //35*30 =1s { return; } else { laytime = 100; } GpioLineCheckInputVal(); if (GpioLineCheckInputVal()) { u8cnt1 ++; u8cnt2 =0; if (u8cnt1 >30) { u8cnt1 =0; u8line = 1; //3线 if ( u8line == u8oldline) { return; } CallLineMode =1; //1:三线制 0:两线制 u8oldline =1; OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff,'Y')); OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff,'Y')); OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, 'Y')); GpioSwLineOutput_L; } } else { u8cnt2 ++; u8cnt1 =0; if (u8cnt2 >30) { u8cnt2 =0; u8line = 0; //2线 if ( u8line == u8oldline) { return; } CallLineMode =0; //1:三线制 0:两线制 u8oldline =0; OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, 'N')); OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, 'N')); OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, 'N')); GpioSwLineOutput_H; } } } //注:1ms中断 改0.1ms中断 void TIM6_IRQHandler (void) { static U08 flag=0; if(TIM_GetITStatus(TIM6, TIM_IT_Update)== SET) { TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update); //================================================== if(flag>=10) { GPIOA->BSRR = GPIO_Pin_9; //总线为低电平 flag--; return; } else if((flag<=9) && (flag!=0)) { GPIOA->BRR = GPIO_Pin_9; //总线为高电平 flag --; return; } if((BUS_SendInex>0)&&(flag==0)) { if(BUS_SendInex==1) //起始位:总线5ms低电平 { flag=41;//41-9 =3.3ms GPIOA->BSRR = GPIO_Pin_9; BUS_SendInex++; } else if(BUS_SendInex<(24+3)) { if (BUS_SendBitBuf[BUS_SendInex-2]) { //数据位1:2ms低电平 flag= 27; } else { //数据位0:1ms低电平 flag= 17; } GPIOA->BSRR = GPIO_Pin_9; BUS_SendInex++; } else if(BUS_SendInex==(24+3)) { flag=0; GPIOA->BRR = GPIO_Pin_9; BUS_SendInex++; } else { BUS_SendInex=0; GPIOA->BRR = GPIO_Pin_9; flag=0; TIM_ITConfig(TIM6,TIM_IT_Update,DISABLE); } } //================================================== } } const fp_prm arryBusTxTbl[NomOfBusTxMsg] = { s_frmBusTxNull, s_frmBusTxEntenData4, //BUS_MSG_EXTENDATA4 s_frmBusTxEntenData5, //BUS_MSG_EXTENDATA5 s_frmBusTxEntenData6, //BUS_MSG_EXTENDATA6 s_frmBusTxEntenData7, //BUS_MSG_EXTENDATA7 s_frmBusTxEntenData8, //BUS_MSG_EXTENDATA8 s_frmBusTxEntenData9, //BUS_MSG_EXTENDATA9 s_frmBusTxRegeditQuest, //BUS_MSG_REGEDITQUEST s_frmBusTxRegeditState, //BUS_MSG_REGEDITSTATE s_frmBusTxCallMode, // BUS_MSG_CALLMODE s_frmBusTxEntenData20, //BUS_MSG_EXTENDATA20 s_frmBusTxEntenData21, //BUS_MSG_EXTENDATA21 s_frmBusTxSigAck, //BUS_MSG_SIGINACK s_frmBusTxEveAck, //BUS_MSG_EVEACK s_frmBusTxFxq1, //BUS_MSG_FXQ1 s_frmBusTxFxq2, //BUS_MSG_FXQ2 }; /*---------------------------------------------------------------------- // Function name : BUS_Rev_TxTask // Input parameter : // Output parameter : // Use Function : 数据约65ms一帧 // Reserve date : 09:18am, 7.July.2019, written by dwd ----------------------------------------------------------------------*/ void BUS_Rev_TxTask(void) { static U08 u8cnt =0; T_MESSAGE *pmsg; if (Bus_SendStart ) { //15*(5+1) =90ms后发下一帧90-65,间隔25MS u8cnt ++; if (u8cnt >=5) { u8cnt =0; Bus_SendStart =0; } return; } else { u8cnt =0; } if (BufSentTime) { return; } pmsg = OSQGet(BusMsgQueue); if ((pmsg->id) &&(pmsg->id < NomOfBusTxMsg)) { arryBusTxTbl[pmsg->id](pmsg->prm); } } static void s_frmBusTxNull(U16 prm) { prm =prm; } static void s_frmBusTxEntenData4(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 4; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); if (gtackvalid ) { gtackvalid --; OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA4, prm); } } static void s_frmBusTxEntenData5(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 5; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); if (gtackvalid ) { gtackvalid --; OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA5, prm); } } static void s_frmBusTxEntenData6(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 6; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxEntenData7(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 7; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxEntenData20(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 2; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxEntenData21(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 3; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxSigAck(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 1; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxEntenData8(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 8; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxEntenData9(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 9; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxRegeditQuest(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 0xd; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxRegeditState(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 0xe; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxCallMode(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 0xf; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxEveAck(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = 10; BUS_SendData(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxFxq1(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = gfxq_cmd; BUS_SendData2(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } static void s_frmBusTxFxq2(U16 prm) { T_BUS_FRAME brm = {0}; brm.DaddressDate = prm; brm.DataType = gfxq_cmd|0x08; BUS_SendData2(brm); BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); }