123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550 |
- #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);
- }
|