我用TA0的0通道实现了模拟串口的收发功能,但是同样的套路,用CCR1为什么做不了?
static uchar bitcnt=0;
static uint uart_buf;
static uchar RXData0; //用来存储接收的8位数据
static uchar RXBitCnt0;//接收数据位数
uchar rx_sign=0;
volatile int Send_flag=0;
void FaultRoutine(void)
{
while(1);// 异常挂起
}
void ConfigClocks()
{
uint i;
for(i = 0; i < 0xFFFF; i++){};
_BIS_SR(OSCOFF);
if(CALBC1_1MHZ==0xff||CALDCO_1MHZ==0xff)
{
while(1);
}
BCSCTL1 = CALBC1_1MHZ;// Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation
BCSCTL2 |=SELM_0+DIVS_0+DIVM_0;; // MCLK = DCO = SMCLK=1MHZ
}
void ConfigPins()
{
P1DIR |= TXD+LED+BIT6;
P1SEL |=RXD;
P1DIR &= ~RXD; // P1.2 input, other outputs
P1OUT |= TXD; // clear output pins
P1OUT &=~LED;
}
//----------发送一个字节------------------------------------------//
void send_char(uchar tchar)
{
TACTL = TACLR + TASSEL_2; //清零计数器 选择SMCLK时钟
CCR0 = BITTIME_1b; //crr0定时间隔为1bit时间宽度
CCTL0 |= CCIE; //打开CCR0中断
bitcnt = 10; //待发送的位数,1位开始位,8位数据位,1位停止位
uart_buf = 0x0100; //stop bit 停止位
uart_buf |= tchar; //data bit 数据位
uart_buf <<=1;//start bit.开始位
Send_flag = 0;
TACTL |= MC_1; //Start TA, Timer A mode control: 1 - Up to CCR0
_BIS_SR(GIE);
while(!Send_flag); //wait until send complete
Send_flag = 1;
}
//---------------------------------------------------------------------//
void RXReady(void)
{
// RXBitCnt0=0x08;//初始化接收数据计数器
TACTL=TASSEL_2+MC_2+TACLR;//SMCLK 连续记数模式 清零计数器
TACCTL1=CM_2+CAP+SCS+CCIE+CCIS_0;
//下降沿捕获 同步捕获源 捕获模式 捕获中断使能 捕获输入为CCI1A
_EINT();
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void) //串口发送程序处理过程,位操作
{
if(bitcnt>0)
{
if(uart_buf & 0x01)
POUT |= TXD;//发送数据1
else
POUT &= ~TXD;//发送数据0
uart_buf >>= 1;
bitcnt--;
}
else
{
POUT|=TXD;//默认状态置高
TACTL &= ~MC_3; //Close the TA when a Byte send over. 00 停止模式
CCTL0 &= ~CCIE; //关闭CCR0中断
Send_flag = 1;
}
}
//---------------------------------------------------------------------//
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1 (void) //接收串口数据处理过程,利用串口协议的时间间隔来进行。
{
P1OUT ^= LED;
TACCR1+=BITTIME_1b;//增加一位定时间隔
if(TACCTL1&CAP) //判断是否为捕获模式
{
RXBitCnt0=0;
}
switch(RXBitCnt0)
{
case 0: //为捕获模式
RXData0=0;//清空缓冲区
TACCR1+=BITTIME_1b5;
TACCTL1&=~CAP;//改为比较模式
RXBitCnt0++;
break;
case 9: //比较模式改为捕获模式
TACCTL1|=CAP;
rx_sign=1; //作为接收完毕的信号
break;
default://1~8 有效数据位
RXData0=RXData0>>1;//右移一位,等待下一个数据进来
if(TACCTL1&SCCI)RXData0|=0x80;//输入为1
RXBitCnt0++;
break;
}
} |