定時器IO模擬串列埠傳輸
阿新 • • 發佈:2018-12-17
@far @interrupt void TIM2_isr(void) { TIM2->SR1 &= 0x7E; TIM2->CNTRH = 0; TIM2->CNTRL = 0; if(mBT.status == BT_STATE_TX) // 傳輸 { if(mBT.RxTxStSpFlag == 0) { if (mBT.RxTxBit == 0) { mBT.RxTxData = mBT.TxBuf[mBT.RxTxDone]; } BT_TX_DDR = 1; BT_TX_CR1 = 1; if (mBT.RxTxData & 0x01) { BT_TX_ODR = 1; } else { BT_TX_ODR = 0; } mBT.RxTxBit++; if(mBT.RxTxBit >= 8) { mBT.RxTxBit = 0; mBT.RxTxStSpFlag = 3; mBT.RxTxDone++; } else { mBT.RxTxData >>= 1; } TIM2->CNTRH = 0; TIM2->CNTRL = 0; } else if (mBT.RxTxStSpFlag == 1) // 1->0-3-1 { BT_TX_ODR = 0; mBT.RxTxStSpFlag = 0; } else if (mBT.RxTxStSpFlag == 3)// 傳送停止拉高, 拉高完整時間,保證開始時間充足 { BT_TX_ODR = 1; mBT.RxTxStSpFlag = 1; //傳送開始位 if (mBT.RxTxDone >= mBT.Txlen) //傳送完最後一個位元組 { mBT.RxTxDone = 0; mBT.RxTxBit = 0; mBT.status = BT_STATE_RX; // 傳送完成,切換為接收狀態 BT_RX_CR2 = 1; TIM2->CR1 = 0x00; // 關閉定時器計數 mBT.flagTimeOn = 0; } } } else if (mBT.status == BT_STATE_RX) // 讀取 { if (mBT.RxTxStSpFlag == 0) { if (BT_RX_IDR == 1)//串列埠都是先傳輸低位,然後是高位 { mBT.RxTxData |= 1<<(mBT.RxTxBit); } mBT.RxTxBit++; if(mBT.RxTxBit >= 8) { mBT.RxTxStSpFlag = 3; mBT.RxTxBit = 0; } } else if (mBT.RxTxStSpFlag == 1)// 起始位 { mBT.RxTxStSpFlag = 0; mBT.RxTxBit = 0; mBT.RxTxData = 0; } else if (mBT.RxTxStSpFlag == 3) // 停止位 { // 200ms傳送一次 //mBT.RxData_int = BT_RX_DATA_INT_CNT; if (mBT.RxTxDone == 0 && mBT.RxTxData != FITSHOW_HEAD) { mBT.RxTxDone = 0; } #if 0 else if (mBT.RxTxDone == 1 && (mBT.RxTxData > 20)) { mBT.RxTxDone = 0; } #endif else { mBT.RxBuf[mBT.RxTxDone] = mBT.RxTxData; mBT.RxTxDone++; mBT.RxTimeOut = 2; // 60ms #if 0 if(mBT.RxTxData == FITSHOW_END) { mBT.flagNew = 1; mBT.RxTxDone = 0; } #endif } mBT.Rxlen = mBT.RxTxDone; if (mBT.RxTxDone >= BT_BUF_LEN) { mBT.RxTxDone = 0; } BT_RX_CR2 = 1;// IO腳中斷使能 TIM2->CR1 = 0x00;// 停止暫存器計數 mBT.flagTimeOn = 0; } } } @far @interrupt void EXTI_PORTD_IRQHandler() { BT_RX_CR2 = 0; mBT.RxTxStSpFlag = 1; TIM2->CNTRH = (uint8_t)((BAUDTATE_TIME_CNT/2)>>8); TIM2->CNTRL = (uint8_t)(BAUDTATE_TIME_CNT/2); TIM2->CR1 = 0x01; mBT.flagTimeOn = 1; } void BTSendData(void) { mBT.RxTxDone = 0; mBT.RxTxBit = 0; mBT.RxTxStSpFlag = 0; mBT.RxTxData = mBT.TxBuf[0]; // 禁止讀取資料 BT_RX_CR2 = 0; // 啟用定時器 BT_TX_DDR = 1; // 需要設定TX方向 BT_TX_ODR = 0; // 傳送第一個位元組的起始位 TIM2->CR1 = 0x01; mBT.flagTimeOn = 1; //mBT.status = BT_STATE_TX; } void BTCommu(void) { uchar i; uchar temp8; uint temp16; u32 temp32; if (mBT.flagTimeOn == 1) // 定時器已經開啟,正在處理資料 { return; } // 包頭+功能+長度+DATA+CRC+FD if(mBT.status == BT_STATE_TX) // 傳送需要約12ms { mBT.TxBuf[1] = mBT.pcfunc_code; BTSendData() } else if(mBT.status == BT_STATE_RX) { if(mBT.flagNew == 1) { mBT.flagNew = 0; mBT.RxTxDone = 0; mBT.RxCnt++; if(mBT.Rxlen_max < mBT.Rxlen) { mBT.Rxlen_max = mBT.Rxlen; } mBT.flag_connect=50; } else { if(mBT.RxTimeOut) // 收取到最後一個位元組的時間 { mBT.RxTimeOut--; if(mBT.RxTimeOut == 0 ) { mBT.flagNew = 1; } } else { } } }