本帖最后由 23124515 于 2016-5-18 10:52 编辑
这两天看G2开发板的出厂程序,在UART部分会有给TACCR0加一个Bitime的语句(红字标出)
不是很懂为什么要设这么一个语句,看注释是说给CCR0一个补偿,但是捕捉部分感觉应该是和CCR1有关的啊
所以在这想问问各位前辈,第一TACCR0在这段程序中的意义是什么,第二为什么要加一个这样的语句,最后那个Add Space start bit是为什么?
感谢大家!!
程序部分如下:
void Transmit()
{
BitCnt = 0xA; // Load Bit counter, 8data + ST/SP
/* Simulate a timer capture event to obtain the value of TAR into the TACCR0 register */
TACCTL0 = CM_1 + CCIS_2 + SCS + CAP + OUTMOD0;
//CM_1capture on rising edge, CCIS_2 initially set to GND as input,SCS 用来使Capture和Clock同步 // clear CCIFG flag
TACCTL0 |= CCIS_3; //CCIS_2(GND)~CCIS_3(VCC) change input to Vcc, effectively rising the edge, triggering the capture action
while (!(TACCTL0 & CCIFG)); //allowing for the capturing//updating TACCR0.
TACCR0 += Bitime ; // Some time till first bit (BitTime=52)
TXByte |= 0x100; // Add mark stop bit to TXByte (1 0000 0000)
TXByte = TXByte << 1; // Add space start bit 把最右边的位数给空出来
TACCTL0 = CCIS0 + OUTMOD0 + CCIE; // TXD = mark = idle CCIS-01:CCI0B OUTMOD:set
while ( TACCTL0 & CCIE ); // Wait for TX completion THEN JUMP OUT
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
if (timerMode == TIMER_UART_MODE) // IF IN UART MODE
{
TACCR0 += Bitime; // Add Offset to TACCR0
if (TACCTL0 & CCIS0) // TX on CCI0B?
{
if ( BitCnt == 0) //TX A BIT,BITCNT-1,AT LAST ALL BITS ARE TXED ,BITCNT=0
{
P1SEL &= ~(TXD+RXD); //Make TXD RXD NO LONGER WORK
TACCTL0 &= ~ CCIE ; // All bits TXed, disable interrupt
}
else //IF BITS ARE NOT ALL TRANSFERED
{
TACCTL0 |= OUTMOD2; // TX Space, SWITCHED TO RESET FUNC, OUTPUT 0
if (TXByte & 0x01) // IF LAST BIT OF TXByte IS 1
TACCTL0 &= ~ OUTMOD2; // TX Mark, SWITCHED BACK TO SET FUNC
//SO IF LAST BIT IS 1,OUTPUT "1" ,OTHERWISE OUTPUT "0".
TXByte = TXByte >> 1; //TXBYTE RIGHT MOVE A BIT
BitCnt --;
}
}
此帖出自
小平头技术问答
我的理解就是设定一个固定的周期。周期是用CCR0来控制的。
我对这个也不熟悉,还是要把手册读懂才是最关键的,别人看也是以手册为准。
一周热门 更多>