2nd note of communication: UART
Now I’ve made my own decision, I will pay whatever to learn CCS and TI hardware include DSPs and SCM, I found that my major would be nothing without the hardware.
So let’s begin now, the communication start from UART. what is UART exactly? it’s a very common signal communication, which is asynchronous(异步), that’s mean it won’t send data timely when it receive some signal, so the physical clock line is not required. Two devices communicate with each other will need three pins called ‘rxd’ , ‘txd’ and ‘ground’. they will have a base rate to exchange data: the baud rate. it will decide how many words can be sent per minute.

How does it work on the board? well, like this:

Some essential rule is made here, such as the edge-detection has been set in advance(I was confused about that since some knowledge about FPGA. and I did’t this message, which made me confused about the sample code.
Based on the MSP430 series board, the most important part is reading user guide&set many register of the chip(copy code actually). Even you have had a good command of C, while you try to design the code of 430 you will found you know nothing about C(bushi). the core knowledge is about underlying logic.so these data .pdf is so essential include user guide, datasheet, schematic diagram.
The automatic baud-rate detection mode can be used in a full-duplex communication system with somere strictions. The USCI can not transmit data while receiving the break/sync field and, if a 0h byte with framing error is received, any data transmitted during this time gets corrupted. The latter case can be discovered by checking the received data and the UCFE bit.
The message from user guide indicates that most of detection work is set previously in the devices, we don’t need to configure the edge detection or the begin flag. That’a a very typical work model of 430, since they will arrange every switch(actually register), and if you know the principal like UART, you just need to learn how to set relative register(UCxCTLx, UCxBRx). In my own view, I think it seems like RTL level of FPGA.
Let’s back to UART itself, based on it’s protocol and characteristic, we know that, the Baud rate is a essential part, and it won’t work in the main procedure of the program(unless you are testing the UART module of a device), we need to preset both devices baud rate to make sure they can communicate correctly. But the most important part is the interrupt . whether it’s UART or SPI or IIC, it’s a communication, and we can’t predict what time will we receive the data, so in the hardware protocol, usually some data flag is required to detect communication module is working. that’s actually how the interrupt module work. if we preset some UART&communication register, then it will work like this:
receive data mark->mechanism check if it’s valid->(if it’s true)->interrupt flag=1->program execute the interrupt function-> data into the RXTBUFFER
if some error happen or the mark is invalid, the interrupt flag will not be set as 1(interrupt was not triggered).
let’s try to give some example and comment it(TI and CCS have brought own example code for you to learn, it’s easy to get their example):
tape here to learn how to import code:https://blog.youkuaiyun.com/redgragon0/article/details/79197271
// MSP430F552x
// -----------------
// /|\| |
// | | |
// --|RST |
// | |
// | P3.3/UCA0TXD|------------>
// | | 115200 - 8N1
// | P3.4/UCA0RXD|<------------
// that's very iconic hhhhh
#include <msp430.h>
/*
the main fuction will keep work in a loop, and if a interrupt haprrened
the main function will stop and some register will save the process of main
function then go to execute interrupt function,and normally some register
will be preset in main fuction, most of them like a switch, and actually like
the clock, they have default clock of the three signal clock, but if you need
some other frequncy of physical clock, you need to know how to set these switch
*/
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL |= BIT3+BIT4; // P3.3,4 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 9; // 1MHz 115200 (see User's Guide)
UCA0BR1 = 0; // 1MHz 115200
UCA0MCTL |= UCBRS_1 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
__no_operation(); // For debugger,this sentence will do
// nothing but will be helpful if you want to make it stop here if you need to debug
}
// Echo back RXed character, confirm TX buffer is ready first
/*
here is the interupt function, we can deploy the UCAxIFg(flag) and TX/RX buffer
then we can decide where will the data go after we receive data or sent the data
into TXbuffer.
*/
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; /* TX -> RXed character, the data got from RXbuffer will immediately transport to TXbuffer, which mean once the device
got the data, it will send the data back timely*/
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
}
I think that UART or interrupt is not so hard while it will cost a lot of time to learn how to set these complex registers. let’s keep overcome it!!!

本文详细介绍了UART通信协议,包括其异步特性和波特率设置,并以MSP430单片机为例,阐述了UART在硬件上的实现,特别是如何配置寄存器进行通信。同时,讨论了中断在UART通信中的关键作用,以及中断处理程序的工作流程。通过示例代码展示了如何在MSP430上设置和使用UART。
1689

被折叠的 条评论
为什么被折叠?



