MSP5308 定时器模拟串口,有TI官方例程吗?在哪儿下?开发环境 XP IAR
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
这个网上资料很多,比如:http://wenku.baidu.com/view/385c312de2bd960590c677b5.html MSP430架构类似,稍作修改即可使用
其他MSP430F5308模块示例代码:http://www.ti.com/lit/zip/slac469
只有第一帧是错的,后面是对的,谢谢,程序附上:
void TimerA_UART_init(void)
{
TA0CTL = TASSEL_2 + MC_2; // SMCLK, start in continuous mode
TA0CCTL0 = OUT; // Set TXD Idle as Mark = '1'
TA0CCTL1 = SCS + CM1 + CAP + CCIE; // Sync, Neg Edge, Capture, Int
}
//------------------------------------------------------------------------------
// Prints a string over using the Timer_A UART
//------------------------------------------------------------------------------
void Tx_array(unsigned char *array, int CNT)
{
int i=0;
for(i=0;i<CNT;i++)
{
Tx_byte(array+i);
}
}
//------------------------------------------------------------------------------
// Outputs one byte using the Timer_A UART
//------------------------------------------------------------------------------
void Tx_byte(unsigned char *pointer)
{
while (TA0CCTL0 & CCIE); // Ensure last char got TX'd
TA0CCR0 = TA0R; // Current state of TA counter
TA0CCR0 += UART_TBIT; // One bit time till first bit
TA0CCTL0 = OUTMOD0 + CCIE; // Set TXD on EQU0, Int
txData = *pointer; // Load global variable
txData |= 0x100; // Add mark stop bit to TXData
txData <<= 1; // Add space start bit
}
//------------------------------------------------------------------------------
// Timer_A UART - Transmit Interrupt Handler
//------------------------------------------------------------------------------
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A0_ISR(void)
{
static unsigned char txBitCnt = 10;
TA0CCR0 += UART_TBIT; // Add Offset to CCRx
if (txBitCnt == 0) { // All bits TXed?
TA0CCTL0 &= ~CCIE; // All bits TXed, disable interrupt
txBitCnt = 10; // Re-load bit counter
}
else {
if (txData & 0x01) {
TA0CCTL0 &= ~OUTMOD2; // TX Mark '1'
}
else {
TA0CCTL0 |= OUTMOD2; // TX Space '0'
}
txData >>= 1;
txBitCnt--;
}
}
//------------------------------------------------------------------------------
// Timer_A UART - Receive Interrupt Handler
//------------------------------------------------------------------------------
#pragma vector = TIMER0_A1_VECTOR
__interrupt void Timer0_A1_ISR(void)
{
static unsigned char rxBitCnt = 8;
static unsigned char rxData = 0;
switch (__even_in_range(TA0IV, TA0IV_TA0IFG)) { // Use calculated branching
case TA0IV_TA0CCR1: // TACCR1 CCIFG - UART RX
TA0CCR1 += UART_TBIT; // Add Offset to CCRx
if (TA0CCTL1 & CAP) { // Capture mode = start bit edge
TA0CCTL1 &= ~CAP; // Switch capture to compare mode
TA0CCR1 += UART_TBIT_DIV_2; // Point CCRx to middle of D0
}
else {
rxData >>= 1;
if (TA0CCTL1 & SCCI) { // Get bit waiting in receive latch
rxData |= 0x80;
}
rxBitCnt--;
if (rxBitCnt == 0) { // All bits RXed?
RX_DATA[RX_PW++] = rxData;
if (RX_PW >= RXDATA_SIZE)
{
RX_PW = 0;
}
rxBitCnt = 8; // Re-load bit counter
TA0CCTL1 |= CAP; // Switch compare to capture mode
}
}
break;
}
}