【说明】
UART(Universal Asynchronous Receiver/Transmitter)就是串口通讯,全称“异步接收发送器”,我们前面已经提到,我们利用secureCRT来显示开发板发送过来的串口数据,这一节我们就来看看,在开发板上到底是怎么控制串口的,也就是说,如果我们要自己写程序从开发板发送或者接收数据,要怎么做。
【协议】
1)起始位:先发出一个逻辑"0"的信号,表示传输字符的开始
2)数据位:个数可以是4,5,6,7,8等,构成一个字符,通常采用ASCII码,从最低位开始传输,靠时钟来定位
3)奇偶校验位:数据位加上这一位后,使得"1"的位数应为偶数(偶校验)或者奇数(奇校验),现在一般不用了,因为现在出错率比较低
4)停止位:它是一个字符数据的结束标志,可以是1位,1.5位,2位的高电平(逻辑"1")
5)空闲位:处于逻辑"1"状态,表示当前线路上没有数据的传送
6)波特率:表示为每秒钟传送的二进制位数。
【原理图】
1)在6410中,我们并不需要自己写代码处理那些发送协议,我们只需要初始化UART模块,
然后把需要发送的数据放入某个寄存器,或者从读取某个寄存器,就能实现数据的发送和接收,
硬件会自动发送, 上边2个大大的buffer 就是发送缓存,在后面的中断方式控制UART中,我们就知道它的作用了。
2)初始化UART其实就是设置一下波特率,数据位数,是否使用校验位等等,这些不就是设置一些寄存器嘛。
【相关寄存器】
从上边的协议中我们大概可以猜测我们需要设置的东西至少包括,波特率,数据位个数,校验位个数,停止位个数,等等。
1】相关引脚
首先我们的串口显然需要2个引脚,一个用于发送数据,一个用于接收数据,查询6410主板手册(TINY6410-1107.PDF)的UART,发现如下
1)显然,GPA0要配置成UART模式,GPA1也是,查看GPA控制器(回忆点灯的GPKCON,类似的),看下图。
2】数据配置寄存器
如说所说的各种参数在哪个寄存器设置呢?
1)这个寄存器只有8位,所以后面代码中这个寄存器类型定义和别的不一样。
2)第6位清0表示使用正常模式,1表示红外模式,我们当然是用0
3)第3到5位表示校验位个数,我们配置成第一种,即没有校验位
4)第2位设置停止位个数,我们使用1位停止位 所以就是0
5)第0到1位代表数据个数,我们要用8位数据传送,所以就是11
3】控制寄存器
1)第10到11位我们设置为0,也就是我们要使用PCLK,回忆一下上一张的系统时钟里关于PCLK的设置
2)第5位控制是否开启回环模式,回环模式是指我们发送的数据会直接当做接收的数据送往本机上的接收端,用于测试用的,我们不需要。
3)第0,1和2,3位我们都设置为01 表示我们使用中断请求或者查询模式(这章我们用查询模式)
4)其他位是中断相关,这一章用不到,后面的中断那一章再用
4】缓存的设置
上边那2个大大的BUFFER,我们也要设置一下
1)我们只要关心最后一位,也就是把BUFFER使能就可以,其他的也是和中断相关的
5】流量控制寄存器
1)我们直接往里面写0,意思是关闭流量控制,有时间我研究研究流量控制相关的部分,再记录
6】波特率设置
搞了半天我们还有一个很重要的参数没有设置呢,那就是波特率,波特率的设置并不是直接写入一个值,而是由2个寄存器再加上PCLK
共同控制,手册中给了如下的公式
1)感觉好复杂的样子啊,其实不复杂,简单的说,首先我们要计算出DIV_VAL,然后让UBRDIV0等于DIV_VAL的整数部分,
让UDIVSLOT0中1的个数除以16等于DIV_VAL的小数部分就可以了
2)具体数据:DIV_VAL = (66500000 / (115200 * 16)) -1 = 35.08 ,所以UBRDIV0 = 35, UDIVSLOT0中1的个数是
16 * 0.08 取整为 1,所以直接让UDIVSLOT0 = 1.
7】发送,接受数据
好了,以上我们设置了所有必要参数,我们已经可以使用UART发送了。
1)上边是缓冲区状态寄存器,用来判断发送缓冲是否已满,或者接收缓冲是否有数据
1)这2个寄存器都是8位的
2)往里边写数据就可以发送,往里边读数据就可以接收啦,就是这么简单!快乐玩耍吧!