这里所说的串口也叫RS232或这UART(Universal Asynchronous Receiver/Transmitter)。
下面的两个图是串口通信的两种应用场合。 三线制,用于一般的数据收发;
九线制,用于Modem(调制解调器)功能,应用于拨号上网设备,手机等通信设备中。
我们这里主要讨论三线制。
6.2 设置串口
也许很多人在XP下面用过串口,我们在"设备管理器"里面,有一个端口属性,
里面就是串口设备 这些基本的配置,在单片机和ARM里面也有。
6.2.1 波特率
这里第一个要设置的是串口波特率,波特率就是每秒传输的数据位数,用bps来表示。在LPC2136中,波特率通过公式
计算得到。 pclk指CPU的peripheral devices clock。
U0DLM是指UART0除法锁存器(Divisor Latch Register)的高八位;
U0DLL是指UART0除法锁存器(Divisor Latch Register)的低八位;
(注意:U0DLL的复位值为0)
LPC2136 datasheet提供了一个表,我们可以根据这个表设置这两个寄存器的值就行了,很方便。 6.2.2 设置串口数据格式 我们一般设置8位数据位,1个停止位,无奇偶校验位,禁止间隔发送。
注意,我们在设置波特率之前必须,使能访问除数锁存。
6.3 发送数据
到这里你就可以写程序来发送数据了。
设置波特率和数据格式安照"2 设置串口"方法,那么,接下来还有两个问题:
1:要发送的数据送到那里
2:怎么知道发送完成
6.3.1 要发送的数据送到哪里
LPC2136是通过往U0THR(UART0 Transmit Holding Register 发送器保持寄存器)写数据来发送出去的。
U0THR是UART0 TX FIFO的最高字节。它包含了Tx FIFO中最新的字符,可通过总线接口写入。LSB (bit0)代表最先发送的位。
注:如果要访问U0THR,U0LCR的除数锁存访问位(DLAB即bit[7])必须为0。U0THR为只写寄存器。
写UART0发送保持寄存器使数据保存到UART0发送FIFO中,当字节到达FIFO的最底部并且发送器就绪时,该字节将被发送。
6.3.2 怎么知道发送完毕
LPC2136有个线状态寄存器(U0LSR),其中的第六位就是用来判断是否发送完毕的。如果该位为1,则表示已经发送完毕。该位通过写U0THR清零。
注:也许有人会问为什么不是判断第五位,
答案是:可以用第五无位判断,但最好是用第六位,因为第六位指示的U0THR和U0TSR两个寄存器为空,如果你没有看LPC2136的英文datasheet,你不知道U0TSR是什么东西。U0TSR是UART0 TX Shift Register(UART0 传输移位寄存器,它从U0THR里面读出数据并装配发送到TXD0输出引脚)。
6.3.3 通过代码实现发送"Hello World!"
/****************************************************************************
* 文件名:main.c
* 功 能:向串口发送数据,在PC上用超级终端或串口助手就可以收到"Hello World!"字符串
* 说 明:使用外部11.0592MHz晶振,根据CONFIG.H文件配置,Fpclk=11.0592MHz;
* 通讯波特率,位数据位,位停止位,无奇偶校验。
****************************************************************************/
#include "config.h"
#define UART_BPS 115200 // 定义通讯波特率
uint8 const SEND_STRING[] = "Hello World!\r\n";
/****************************************************************************
* 名 称:DelayNS()
* 功 能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{
uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<5000; i++);
}
}
/****************************************************************************
* 名 称:UART0_Ini()
* 功 能:初始化串口。设置为位数据位,位停止位,无奇偶校验,波特率为
* 入口参数:无
* 出口参数:无
****************************************************************************/
void UART0_Init(void)
{
uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
/****************************************************************************
* 名 称:UART0_SendByte()
* 功 能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data 要发送的数据
* 出口参数:无
} |