概念
通用异步收发器简称UART( Universal Asynchronous Receiver and Transmitter),它用来传输串行数据。UART之间以全双工方式传输数据,最精简的连接方式只有3根线:TxD用于发送数据,RxD用于接收数据,Gnd用于给双方提供参考电平。
UART使用标准的TTL/CMOS逻辑电平(0-3.3V,0-5V等)来表示数据,高电平表示1,低电平表示0。对于远距离传输,通常转换为RS-232电平,3-12V表示0,-3 - -12V表示1。
TxD和RxD数据线以“位”为最小单位传输数据。帧具有完整意义的、不可分割的若干位组成,它包括:开始位,数据位,校验位和停止位。发送数据之前,UART之间要约好数据的传输速率(即每位所占据的时间,其倒数为波特率),数据的传输格式(即有多少个数据位、是否使用校验位,多少个停止位等)。
常用的传输格式为:115200,8n1
数据传输流程:
1 平时数据线处于“空闲状态”(1状态)
2.当要发送数据时,改变TxD数据线的状态(变为0)并维持1位的时间,这样接收方检测到开始位后,在等待1.5位的时间就开始一位一位地检测数据线的状态得到所传输的数据。
3.UART一帧中可以有5-8个位的数据,发送方一位一位的改变数据线的状态将它们发送出去,首先发送最低位MSB。
4.如果使用校验功能,UART在发送完数据位后,还要发送1个检验位。两种校验方法:奇校验和偶校验-数据位连同检验位中1的数目等于奇数或偶数。
5.最后发送停止位,数据线恢复到“空闲”状态(1状态)。停止位长度有1位、1.5位、2位。
s3c2440有3条独立的通道,每个通道都可以工作于 中断模式或DMA模式,即UART可以发出中断(数据发送完可以中断)或 DMA请求 以便在UART和CPU之间传输数据。
寄存器
GPH2,GPH3引脚设为TXD0,RXD0;
UBRDIVn:设置波特率,选择时钟源(PCLK,UEXTCLK,FCLK/n)。
ULCONn(UART LINE CONTROL):设置传输格式,8n1。
UCONn(UART CONTROL):选择时钟源(PCLK,UEXTCLK,FCLK/n),中断方式(中断/查询,DMA请求)等。
UFCON,UFSTAT(FIFO):设置各FIFO的触发阈值,即发送FIFO中有多少个数据时产生中断、接收FIFO中有多少个数据时产生中断。
UMCON,UMSTAT(MODEM):流控
UTRSTATn:用来表示数据是否已经发送完毕、是否已经接收到数据。
UTXHn:数据写入该寄存器,uart会将它保存到缓冲区并自动发送。
URXHn:接收到数据时,读取这个寄存器。
程序
/* 115200,8n1 */
void uart0_init(){
/* 设置引脚用于串口 */
/* GPH2,3用于TxD0, RxD0 */
GPHCON &= ~((3<<4) | (3<<6));
GPHCON |= ((2<<4) | (2<<6));
GPHUP &= ~((1<<2) | (1<<3)); /* 使能内部上拉 */
/* 设置波特率 */
/* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
* UART clock = 50M
* UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26 */
UCON0 = 0x00000005; /* PCLK,中断/查询模式 */
UBRDIV0 = 26;
/* 设置数据格式 */
ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */
}
int putchar(int c){
/* UTRSTAT0 UTXH0 */
while (!(UTRSTAT0 & (1<<2))); //等待,直到发送缓冲区中的数据已经全部发送出去
UTXH0 = (unsigned char)c; //发送数据
}
int getchar(void){
while (!(UTRSTAT0 & (1<<0))); //等待,直到接收缓冲区中有数据
return URXH0; //返回数据
}
int puts(const char *s){
while (*s){
putchar(*s);
s++;
}
}
int main(void){
unsigned char c;
uart0_init();
puts("Hello, world!\n\r");
while(1) {
c = getchar();
if (c == '\r'){
putchar('\n');
}
if (c == '\n'){
putchar('\r');
}
putchar(c);
}
return 0;
}