1. 程式人生 > >定時器IO模擬串列埠傳輸

定時器IO模擬串列埠傳輸

@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
		{
			
		}
	}

}