文章目录
前言
一、串口通信?
1.串口通信的基础与分类
2.波特率
3.单工、半双工和全双工
4.起始位、数据位、奇偶校验位、停止位
5.TXD,RXD,GND
二、龙芯UART串口介绍
三、程序代码
总结
前言
串口可以在某种程度来说,是一个单片机向外界传输信息的可靠途径,指的就是经过编码后的信息在某一可靠传输介质上传输的过程。这一期咱们就来讲讲龙芯1B的串口通信吧。 在此谢谢各位的关注了,大家的关注是我更新的持久动力!
一、串口通信?
1.串口通信的基础与分类
串口通信出现的时间比较早,速率低,距离近,干扰并不明显,当时使用的就是电平信号。后续经过不同的修改逐渐成为了差分信号传输。
串口通信每次都是同时只能传输1个二进制位。
首先我们可以把串口通信的分为TTL电平和RS232电平!不管哪种电平在工业上,TTL适合近距离且干扰小的情况。RS232电平传输适合于一种干扰大并且距离也可以毕竟大的情况。但这两种方式是不能混为一谈,胡乱接线!
龙芯串口通信:
2.波特率
波特率,就是串口通信的速率,也就是每秒钟可以传输多少个二进制位。比如,每秒钟可以传输9600个二进制位,则波特率就是9600。(传输一个二进制位的时间是1/9600秒,也就是104us)
3.单工、半双工和全双工
单工:甲方向乙方收发暑假,甲发送,乙接收
半双工:甲乙双方分时间的收发数据,甲发送,乙接收或者乙发送,甲接收(双方不能同时进行)
全双工:甲乙双方同时收发数据,甲发送,乙接收或者乙发送,甲接收(双方可以同时进行)
4.起始位、数据位、奇偶校验位、停止位
? ? ????????串口通信是一个周期接着下一个周期进行的,每个周期传输许多个二进制位。每个周期由:起始位+数据位+奇偶校验位+停止位组成。
? ? ? ? ? ? 起始位:表示发送方要开始发送,起始位的定义是串口通信标准事先指定的,根据通信线上的电平变化而变化。
? ? ? ? ? ? 数据位:是真正要发送的有效数据,串口通信一次发送多少位有效数据是可以设定的(可选的有6、7、8、9,一般都是选择8位数据位,因为一般通过串口发送的文字信息都是ASCII码编码,而ASCII码中一个字符刚好编码为8位)。
? ? ? ? ? ? 校验位:是用来校验数据位防止数据位出错。
? ? ? ? ? ? 停止位:是发送方用来表示本通信单元结束标志的。
5.TXD,RXD,GND
串口通信是有线通信,可以实现全双工通信。甲乙双方txd? rxd互相反接才行。
二、龙芯UART串口介绍
1B集成了 12 个UART核,通过APB总线与总线桥通信。UART控制器提供与MODEM 或其他外部设备串行通信的功能,例如与另外一台计算机,以RS232 为标准使用串行线路 进行通信。 该控制器在设计上能很好地兼容国际工业标准半导体设备 16550A。
UART 控制器有发送和接收模块(Transmitter and Receiver)、MODEM 模块、中断仲 裁模块(Interrupt Arbitrator)、访问寄存器模块(Register Access Control),这些模块之间 的关系见下图所示。主要模块功能及特征描述如下:
? 发送和接收模块:负责处理数据帧的发送和接收。发送模块是将FIFO发送队列中 的数据按照设定的格式把并行数据转换为串行数据帧,并通过发送端口送出去。 接收模块则监视接收端信号,一旦出现有效开始位,就进行接收,并实现将接收 到的异步串行数据帧转换为并行数据,存入 FIFO 接收队列中,同时检查数据帧格 式是否有错。UART 的帧结构是通过行控制寄存器(LCR)设置的,发送和接收器 的状态被保存在行状态寄存器(LSR)中
? MODEM 模块:MODEM 控制寄存器(MCR)控制输出信号 DTR 和 RTS 的状态。 MODEM 控制模块监视输入信号 DCD,CTS,DSR 和 RI 的线路状态,并将这些信号 的状态记录在 MODEM 状态寄存器(MSR)的相对应位中
? 中断仲裁模块:当任何一种中断条件被满足,并且在中断使能寄存器(IER)中相 应位置 1,那么 UART 的中断请求信号 UAT_INT 被置为有效状态。为了减少和外 部软件的交互,UART 把中断分为四个级别,并且在中断标识寄存器(IIR)中标 识这些中断。四个级别的中断按优先级级别由高到低的排列顺序为,接收线路状 态中断;接收数据准备好中断;传送拥有寄存器为空中断;MODEM 状态中断
? 访问寄存器模块:当 UART 模块被选中时,CPU 可通过读或写操作访问被地址线 选中的寄存器
三、程序代码
代码如下(示例):
uart.c:
#include "uart.h"
#include "ls1b.h"
#include "ls1b_gpio.h"
#include "ns16550.h"
#include "stdio.h"
#include "led.h"
#include "string.h"
#include "uart.h"
/*******************************************************************
**函数名:UART5_set_IO
**函数功能:初始化uart的IO口
**形参:无
**返回值:无
**说明: UART5_RX:60 -- 数据接收
UART5_TX:61 -- 数据发送
*******************************************************************/
void UART5_Config_Init(void)
{
unsigned int BaudRate = 9600;
ls1x_uart_init(devUART5,(void *)BaudRate); //初始化串口
ls1x_uart_open(devUART5,NULL); //打开串口
}
int count;
char buff[256];
//测试
void UART5_Test(void)
{
//接收数据
count = ls1x_uart_read(devUART5,buff,256,NULL);
if(count > 0)
{
//发送数据
ls1x_uart_write(devUART5,buff,8,NULL);
}
delay_ms(500);
if(strncmp(buff,"ABC",6) == 0) //比较前n个字节
{
LED_ON();// 开启LED
}
if(strncmp(buff,"ABD",6) == 0)
{
LED_OFF();//关闭LED
}
if(strncmp(buff,"ABE",6)==0)
{
LED_Wa();//流水灯
}
}
总结
源码链接:龙芯1B:串口通信例程-单片机文档类资源-CSDN文库
|