历史上的今天
今天是:2025年03月22日(星期六)
2021年03月22日 | 飞思卡尔16位单片机(七)——SCI串口测试
2021-03-22 来源:eefocus
一、SCI串口介绍
随着单片机系统的广泛应用和计算机网络技术的普及,单片机的通信功能越来越显得重要了。单片机通信是指单片机与计算机或单片机与单片机之间的信息交换。通信方式有并行和串行两种方式。由于单片机的接口资源是比较宝贵的,采用并口通信会占用比较多的接口资源,所以信息的交换多采用串行通信的方式。
(1)并行通信方式
并行通信通常是将数据字节的各位用多条数据线同时进行传送,每一位数据都需要一条数据线,8位数据总线的通信系统,一次传送8位数据(一个字节),将需要8条数据线。此外,还需要一条信号线和若干控制信号线,这种方式仅适合于短距离的数据传输,如比较老式的打印机就是通过并口方式与计算机连接,现在都用传输速度非常快的USB接口通信了。并口通信控制简单、相对传输速度快,但由于传输线较多,长距离传送时成本高且收发方的各位同时接收存在困难。
(2)串行通信方式
串行通信方式是将数据字节分成一位一位的形式在一条传输线上逐个地传送,此时只需要一条数据线,至少要分8位才能传送完毕。串行通信的必要过程是:发送时,要把并行数据变成串行数据发送到线路上去,接收时,要把串行信号再变成并行数据,这样才能被计算机及其他设备处理。串行通信传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
串行通信又有两种方式:异步串行通信和同步串行通信。
(3)异步串行通信方式
异步串行通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方收、发协调,要求发送和接收设备的时钟尽可能一致。异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隙)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍关系,但同一字符内的各位之间的距离均为“位间隔”整数倍。
飞思卡尔单片机的SCI模块就是采用异步串行通信的方式,所谓SCI,是飞思卡尔公司自己起的名字,它与其它单片机的UART串口的功能是相同的。
SCI串口通讯一帧字符信息由4部分组成:起始位、数据位、奇偶校验位和停止位,如下图所示。SCI的数据格式用8位数据格式和9位数据格式两种。

异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销小,但每个字符要附加2~3位,用于起始位、校验位和停止位,因此传输效率不高。在单片机与单片机之间,单片机与计算机之间通信时,通常采用异步串行通信方式。
(4)同步串行通信方式
同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。关于同步串行通信方式,我们在以后的实验中还会进行详细介绍。
(5)串行通信的制式
单工。单工是指数据传输仅能沿一个方向,不能实现反向传输。
半双工。半双工是指数据传输可以沿两个方向,但需要分时进行。
全双工。全双工是指数据可以同时进行双向传输。
串行通信的错误校验
①奇偶校验
在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验时,数据中1的个数与校验位1的个数之和应为奇数;偶校验时,数据中1的个数与校验位1的个数之和应为偶数。接收字符时,对1的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。
②代码和校验
代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据时同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则差错,否则即认为传送过程中出现了差错。
③循环冗余校验
这种校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用与对磁盘信息的传输、存储区的完整性校验等。这种校验方式纠错能力强,广泛应用于同步通信中。
要使单片机的SCI串口与计算机的串口进行通信,还必须进行电平的转换。XEP100单片机的电平标准为TTL电平,5V代表逻辑“1”,0V代表逻辑“0”;计算机的串口电平为RS-232电平,-12V代表逻辑“1”,12V代表逻辑“0”。要使计算机能够接收到单片机的数据,就必须将TTL电平转换为RS-232电平;要使单片机能够接收到计算机的数据,就必须将RS-232电平转换为TTL电平。实现这两种电平转换的芯片主要有MAX232、MAX202、HIN232等。本实验中使用MAX232实现两路串口电平的互换。电路原理图如下图所示。

飞思卡尔单片机的SCI模块允许在单片机和远程器件(包括其他单片机)间进行全双工、异步、串行通信。SCI由波特速率发生器、发射器和接收器组成。发射器和接收器独立运行,尽管它们使用同一波特率发生器。在正常运行期间,单片机监控SCI的状态,写将要发送的数据,处理已接收的数据。
XEP100单片机的SCI模块的功能框图如下图所示

二、例程测试
在这个实验中,我们用单片机的SCI串口与计算机进行通信。需要用到一根串口转USB线,这根线会在计算机用USB口模拟出一个串口,另外需要一个串口助手软件sscom,界面如下图所示

准备好了需要的东西,我们来看一下代码,与SCI相关的主要代码是SCI的初始化、发送、接收函数,如下所示。
/*************************************************************/
/* 初始化SCI */
/*************************************************************/
void INIT_SCI(void)
{
SCI0BD = BUS_CLOCK/16/BAUD; //设置SCI0波特率为9600
SCI0CR1 = 0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
SCI0CR2 = 0x2c; //允许接收和发送数据,允许接收中断功能
}
/*************************************************************/
/* 串口发送函数 */
/*************************************************************/
void SCI_send(unsigned char data)
{
while(!SCI0SR1_TDRE); //等待发送数据寄存器(缓冲器)为空
SCI0DRL = data;
}
/*************************************************************/
/* 串口接收函数 */
/*************************************************************/
unsigned char SCI_receive(void)
{
while(!SCI0SR1_RDRF); //等待发送数据寄存器满
return(SCI0DRL);
}
在初始化代码中,首先根据总线时钟将SCI串口的波特率设置为9600,然后设置SCI为正常模式,8位数据位,无奇偶校验位,最后通过SCI0CR2寄存器设置允许接收和发送,并使能接收中断。SCI的发送函数中,首先判断发送缓冲器是否为空,如果为空就将需要发送的数据赋值给SCI的数据寄存器。SCI的接收函数中,等待接收标志位置1,如果置1,说明读到了数据,然后将数据返回。
这个程序采用中断方式处理SCI串口的数据,中断函数代码如下所示。
interrupt void receivedata(void)
{
data_receive = SCI_receive();
if(data_receive == 'O')
{
SCI_send('Y');
LEDCPU = LED_ON;
}
if(data_receive == 'C')
{
SCI_send('V');
LEDCPU = LED_OFF;
}
}
如果计算机向单片机发送数据,就会进入到中断函数中,在中断函数中,读取SCI串口上的数据,然后判断数据是什么,如果数据是‘O’,则点亮LED,并向计算机发送字符‘Y’;如果数据是‘C’,则熄灭LED,并向计算机发送字符‘V’。
将这个程序烧写到单片机中运行,并用USB转串口线将单片机与计算机连接起来,在计算机上打开串口助手sscom,将串口的属性设置成与单片机一直,然后选择USB转串口线对应的串口号,用串口助手向单片机发送‘O’或者‘C’,查看指示灯的状态和串口助手上接收到的数据,与上面分析的结果一致。
史海拾趣
|
最近做wavecom模块连单片机的项目,要做来电自动回复短信的模块,可是用at+clip=1的at命令后,打电话返回的是这样的字符串 ring +clip \"18935\",,,129 \"xxxxxxxxxxxxxxxxxxxxxxxx\" 那一串x是一大堆十六进制数,我也记不清了,反正是根本没 ...… 查看全部问答> |
|
我想用AD9851DDS芯片产生10M到20M联系可调的方波 目前不知道单片机怎样和AD9851 连接 怎么控制过程?谢谢大家啊 急用 谢谢 如果能有程序的话最好 我可以先学学 再改进… 查看全部问答> |
|
使用PB裁系统,怎么使得裁出来的系统默认使用GB2312字符集? 已经在setting选择 中国(中文) 在Fonts 添加了 Simsun ... (Subset 2_80) 是不是还需要添加什么啊?… 查看全部问答> |
|
我有个PDA windows mobile5.0。 想让PDA与单片机通过红外通信。 看了点wince下的红外资料,貌似是用套接字接口通信,还分客户端和服务器端。 单片机部分是硬件工程师做的,他说红外通信部分就和串口一样,把应用数据一个字节一个字节地发送。 但 ...… 查看全部问答> |
|
感谢大家的帮助!我的enet_lwip、和enet_io调通了 感谢大家的热心相助!这几个lwip的例程已经可以跑了!我采取静态分配IP的模式!尤其是TI自带驱动库里面的enet_io这个程序确实是非常强大!可以通过在网页上远程控制开发板!这种功能可以将原来的C/S模式(客户端/服务器-模式)进化到B/S模式(浏览 ...… 查看全部问答> |




