MSP430模拟串口程序
时间:11-13
来源:互联网
点击:
数模式)
P1SEL = TXD + RXD; // PP1.0/1 TA0 for TXD/RXD function(TA0引脚功能)
P1DIR = TXD; // TXD output on P1(输出引脚)
// Mainloop
for (;;)
{
RX_Ready(); // UART ready to RX one Byte(为等待起始位到来作准备)
_BIS_SR(LPM3_bits+GIE); // Enter LPM3 Until character RXed
TX_Byte(); // TX Back RXed Byte Received(回传收到的字节)
}
}
// Function Transmits Character from RXTXData Buffer
void TX_Byte (void)
{
BitCnt = 0xA; // Load Bit counter, 8data + ST/SP(发送10位数据)
CCR0 = TAR; // Current state of TA counter(定时器计数器当前值放比较寄存器中)
CCR0 += Bitime; // Some time till first bit(后推一位的时间)
RXTXData |= 0x100; // Add mark stop bit to RXTXData(填充停止位)
RXTXData = RXTXData < 1; // Add space start bit(填充起始位)
CCTL0 = OUTMOD0+CCIE; // TXD = mark = idle(置位输出模式,允许中断)
while ( CCTL0 & CCIE ); // Wait for TX completion(等待发送完成)
}
// Function Readies UART to Receive Character into RXTXData Buffer
void RX_Ready (void)
{
BitCnt = 0x8; // Load Bit counter(接收8位)
CCTL0 = SCS+CCIS0+OUTMOD0+CM1+CAP+CCIE; // Sync, Neg Edge, Capture
//(CCIxB引脚同步下降沿捕获,置位输出模式,允许中断)
}
// Timer A0 interrupt service routine
interrupt[TIMERA0_VECTOR] void Timer_A (void)
{
CCR0 += Bitime; // Add Offset to CCR0(下一定时时间为1位时间)
// RX(接收字节)
if (CCTL0 & CCIS0) // RX on CCI0B?(如果CCI0B是捕获输入引脚)
{
if( CCTL0 & CAP ) // Capture mode = start bit edge(如果是在捕获模式,则是在等待起始位)
{
CCTL0 &= ~ CAP; // Switch from capture to compare mode(得到起始位后改为比较模式)
CCR0 += Bitime_5; //定时位置改到位的中间位置(加半个位的时间)
}
else
{
RXTXData = RXTXData >> 1; //先收到的是低位
if (CCTL0 & SCCI) // Get bit waiting in receive latch
RXTXData |= 0x80; //SCCI中锁存的是比较相等时的输入引脚上的信号
BitCnt --; // All bits RXed? //位计数减1
if ( BitCnt == 0) //接收完一个字节?
//>>>>>>>>>> Decode of Received Byte Here
{
CCTL0 &= ~ CCIE; // All bits RXed, disable interrupt(接收完一个字节后禁止中断)
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)(准备退出低功耗模式)
}
//>>>>>>>>>> Decode of Received Byte Here
}
}
// TX(发送字节,在进入发送中断前已经置位OUTMOD0)
else
{
if ( BitCnt == 0) //所有位发送完成
CCTL0 &= ~ CCIE; // All bits TXed, disable interrupt(禁止中断)
else
{
CCTL0 |= OUTMOD2; // TX Space(输出模式OUTMOD2+OUTMOD0:复位)
if (RXTXData & 0x01)
CCTL0 &= ~ OUTMOD2; // TX Mark(输出模式OUTMOD0:置位)
RXTXData = RXTXData >> 1; //低位先发
BitCnt --; //位计数
}
}
}
P1SEL = TXD + RXD; // PP1.0/1 TA0 for TXD/RXD function(TA0引脚功能)
P1DIR = TXD; // TXD output on P1(输出引脚)
// Mainloop
for (;;)
{
RX_Ready(); // UART ready to RX one Byte(为等待起始位到来作准备)
_BIS_SR(LPM3_bits+GIE); // Enter LPM3 Until character RXed
TX_Byte(); // TX Back RXed Byte Received(回传收到的字节)
}
}
// Function Transmits Character from RXTXData Buffer
void TX_Byte (void)
{
BitCnt = 0xA; // Load Bit counter, 8data + ST/SP(发送10位数据)
CCR0 = TAR; // Current state of TA counter(定时器计数器当前值放比较寄存器中)
CCR0 += Bitime; // Some time till first bit(后推一位的时间)
RXTXData |= 0x100; // Add mark stop bit to RXTXData(填充停止位)
RXTXData = RXTXData < 1; // Add space start bit(填充起始位)
CCTL0 = OUTMOD0+CCIE; // TXD = mark = idle(置位输出模式,允许中断)
while ( CCTL0 & CCIE ); // Wait for TX completion(等待发送完成)
}
// Function Readies UART to Receive Character into RXTXData Buffer
void RX_Ready (void)
{
BitCnt = 0x8; // Load Bit counter(接收8位)
CCTL0 = SCS+CCIS0+OUTMOD0+CM1+CAP+CCIE; // Sync, Neg Edge, Capture
//(CCIxB引脚同步下降沿捕获,置位输出模式,允许中断)
}
// Timer A0 interrupt service routine
interrupt[TIMERA0_VECTOR] void Timer_A (void)
{
CCR0 += Bitime; // Add Offset to CCR0(下一定时时间为1位时间)
// RX(接收字节)
if (CCTL0 & CCIS0) // RX on CCI0B?(如果CCI0B是捕获输入引脚)
{
if( CCTL0 & CAP ) // Capture mode = start bit edge(如果是在捕获模式,则是在等待起始位)
{
CCTL0 &= ~ CAP; // Switch from capture to compare mode(得到起始位后改为比较模式)
CCR0 += Bitime_5; //定时位置改到位的中间位置(加半个位的时间)
}
else
{
RXTXData = RXTXData >> 1; //先收到的是低位
if (CCTL0 & SCCI) // Get bit waiting in receive latch
RXTXData |= 0x80; //SCCI中锁存的是比较相等时的输入引脚上的信号
BitCnt --; // All bits RXed? //位计数减1
if ( BitCnt == 0) //接收完一个字节?
//>>>>>>>>>> Decode of Received Byte Here
{
CCTL0 &= ~ CCIE; // All bits RXed, disable interrupt(接收完一个字节后禁止中断)
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)(准备退出低功耗模式)
}
//>>>>>>>>>> Decode of Received Byte Here
}
}
// TX(发送字节,在进入发送中断前已经置位OUTMOD0)
else
{
if ( BitCnt == 0) //所有位发送完成
CCTL0 &= ~ CCIE; // All bits TXed, disable interrupt(禁止中断)
else
{
CCTL0 |= OUTMOD2; // TX Space(输出模式OUTMOD2+OUTMOD0:复位)
if (RXTXData & 0x01)
CCTL0 &= ~ OUTMOD2; // TX Mark(输出模式OUTMOD0:置位)
RXTXData = RXTXData >> 1; //低位先发
BitCnt --; //位计数
}
}
}
MSP430模拟串 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)