380 likes | 711 Views
ARM嵌入式体系结构与接口技术 第8章 串行通信接口. 课程安排 :. 第1章 嵌入式系统基础知识 第2章 ARM技术概述 第3章 ARM的指令系统 第4章 ARM汇编语言程序设计 第5章 ARM Realview MDK集成开发环境 第6章 GPIO编程 第7章 ARM异常中断处理及编程 第8章 串行通信接口. 课程安排 :. 第9章 存储器接口 第10章 定时器 第11章 A/D转换器 第12章 LCD接口设计 第13章 温度监测仪开发实例. 本章课程:. 8.1 串行通信 8.2 S3C2410X异步串行通信 8.3 接口电路与程序设计
E N D
ARM嵌入式体系结构与接口技术第8章 串行通信接口
课程安排: • 第1章 嵌入式系统基础知识 • 第2章 ARM技术概述 • 第3章 ARM的指令系统 • 第4章 ARM汇编语言程序设计 • 第5章 ARM Realview MDK集成开发环境 • 第6章 GPIO编程 • 第7章 ARM异常中断处理及编程 • 第8章 串行通信接口
课程安排: • 第9章 存储器接口 • 第10章 定时器 • 第11章 A/D转换器 • 第12章 LCD接口设计 • 第13章 温度监测仪开发实例
本章课程: • 8.1 串行通信 • 8.2 S3C2410X异步串行通信 • 8.3 接口电路与程序设计 • 8.4 小结 • 8.5 思考与练习
8.1 串行通信 • 8.1.1 串行通信与并行通信概念 • 在微型计算机中,通信(数据交换)有两种方式:串行通信和并行通信。 • 串行通信是指计算机与I/O设备之间数据传输的各位是按顺序依次一位接一位进行传送。通常数据在一根数据线或一对差分线上传输。 • 并行通信是指计算机与I/O设备之间通过多条传输线交换数据,数据的各位同时进行传送。
8.1 串行通信 • 8.1.2 异步串行方式的特点 • 异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。 • 异步串行通信的特点: • 以字符为单位传送信息。 • 相邻两字符间的间隔是任意长。 • 因为一个字符中的比特位长度有限,所以需要的接收时钟和发送时钟只要相近就可以。 • 异步方式特点简单的说就是:字符间异步,字符内部各位同步。
8.1 串行通信 • 8.1.3 异步串行方式的数据格式 • 异步串行通信数据每个字符(每帧信息)由4个部分组成 • 1位起始位,规定为低电0; • 5~8位数据位,即要传送的有效信息; • 1位奇偶校验位; • 1~2位停止位,规定为高电平1。 图8-1 异步串行数据格式
8.1 串行通信 • 8.1.4 同步串行方式的特点 • 同步通信,是指数据传送是以数据块(一组字符)为单位,字符与字符之间、字符内部的位与位之间都同步。 • 同步串行通信的特点: • 以数据块为单位传送信息。 • 在一个数据块(信息帧)内,字符与字符间无间隔。 • 因为一次传输的数据块中包含的数据较多,所以接收时钟与发送进钟严格同步,通常要有同步时钟。
8.1 串行通信 • 8.1.5 同步串行方式的数据格式 • 同步串行通信的数据格式如图8-2所示,每个数据块(信息帧)由3个部分组成: • 2个同步字符作为一个数据块(信息帧)的起始标志; • n个连续传送的数据 • 2个字节循环冗余校验码(CRC) 8-2 同步串行数据格式
8.1 串行通信 • 8.1.6 RS-232C串口规范 • RS-232C 标准(协议)的全称是EIA-RS-232C 标准,其中EIA(Electronic IndustryAssociation)代表美国电子工业协会,RS(ecommeded standard)代表推荐标准,232是标识号,C代表RS232 的最新一次修改(1969) • 常用物理标准还有EIA-RS-232-C、EIA-RS-422-A、EIA-RS-423A、EIA-RS-485 • 目前在PC 机上的COM1、COM2 接口,就是RS-232C
8.1 串行通信 • 8.1.6 RS-232C串口规范 • 1、9针串口引脚定义 • PC电脑串行口中的典型是RS-232及其兼容接口,串口引脚有9针和25针两类
8.1 串行通信 • 8.1.6 RS-232C串口规范 • 2、RS-232C电气特性 • 在TXD和RXD引脚上电平定义: • 逻辑1=-3V~-15V • 在RTS、CTS、DSR、DTR和DCD等控制线上电平定义: • 信号有效=+3V~+15V • 信号无效=-3V~-15V • 注意:对于介于-3V~+3V之间的电压处于模糊区电位,此部分电压将使得计算机无法正确判断输出信号的意义,可能得到0,也可能得到1,如此得到的结果是不可信的。因此,实际工作时,应保证传输的电平在+3~+15V或-3V~-15V之间。
8.1 串行通信 • 8.1.6 RS-232C串口规范 • 3、RS-232C的通讯距离和速度 • RS-232C能够可靠进行数据传输的最大通讯距离为15米 • 传输速度一般都可以达到115200bps甚至更高,标准串口能够提供的传输速度主要有以下波特率:1200bps、2400bps、4800bps、9600bps、19200bsp、38400bps、57600bps、115200bps等
8.1 串行通信 • 8.1.6 RS-232C串口规范 • 4、RS-232C电平转换芯片及电路 • MAX3232主要特点有: • 符合所有的RS-232C规范 • 单一供电电压+5V或3.3V • 片内电荷泵,具有升压。电压极行反转能力,能够产生+10V和-10V电压V+、V- • 低功耗,典型供电电流3mA • 内部集成2个RS-232C驱动器 • 内部集成2个RS-232C接收器 图8-3 MAX3232芯片
8.1 串行通信 • 8.1.7 RS-232C接线方式 • RS-232C串口的接线方式有全串口连接、3线连接等方式 • 3线连接方法:RXD,TXD和GND 图 8-4 3线连接法
8.2 S3C2410X异步串行通信 • 8.2.1 S3C2410X串口控制器概述 • 1.S3C2410X串行通信(UART)单元 • S3C2410X UART单元提供3个独立的异步串行通信接口,皆可工作于中断和DMA模式。使用系统时钟最高波特率达230.4Kbit/s,如果使用外部设备提供的时钟,可以达到更高的速率。每一个UART单元包含一个16字节的FIFO,用于数据的接收和发送
8.2 S3C2410X异步串行通信 • 8.2.1 S3C2410X串口控制器概述 • 2.波特率的产生 • 波特率由一个专用的UART 波特率分频寄存器(UBRDIVn)控制,计算公式如下: • UBRDIVn = (int)(ULK/(bps × 16) ) – 1 • 或者 UBRDIVn = (int)(PLK/(bps × 16) ) –1 • 说明:时钟选用UCLK还是PCLK由UART控制寄存器UCONn[10]的状态决定。如果UCONn[10] = 0,用PCLK作为波特率发生,否则选用UCLK做波特率发生。UBRDIVn的值必须在1~到(216−1)之间 • 例:UCLK或者PCLK等于40MHz,当波特率为115200时 • UBRDIVn = (int) (40000000/(115200 × 16) ) −1 • = (int)(21.7) −1 • = 21 − 1 = 20
8.2 S3C2410X异步串行通信 • 8.2.1 S3C2410X串口控制器概述 • 3.S3C2410X UART通信操作 • 1、发送数据帧包含一个起始位,5~8个数据位,一个可选的奇偶校验位和1~2位停止位,停止位通过行控制寄存器ULCONn配置 • 2、接收数据帧由一个起始位,5~8个数据位,一个可选的奇偶校验和1~2位行控制寄存器ULCONn里的停止位组成 • 3、接收器还可以检测溢出错、奇偶校验错、帧错误和传输中断,每一个错误均可以设置一个错误标志。 • 1)溢出错误(Overrun Error)是指已接收到的数据在读取之前被新接收的数据覆盖 • 2)奇偶校验错是指接收器检测到的校验和与设置的不符 • 3)帧错误指没有接收到有效的停止位 • 4)传输中断表示接收数据RxDn保持逻辑0超过一帧的传输时间
8.2 S3C2410X异步串行通信 • 8.2.2 S3C2410X串口控制器寄存器详解 • 1、UART行控制寄存器ULCONn
8.2 S3C2410X异步串行通信 • 8.2.2 S3C2410X串口控制器寄存器详解 • 2、UART控制寄存器UCONn
8.2 S3C2410X异步串行通信 • 8.2.2 S3C2410X串口控制器寄存器详解 • 3、UART FIFO 控制寄存器UFCONn
8.2 S3C2410X异步串行通信 • 8.2.2 S3C2410X串口控制器寄存器详解 • 4、UART MODEM控制寄存器UMCONn
8.2 S3C2410X异步串行通信 • 8.2.2 S3C2410X串口控制器寄存器详解 • 5、发送寄存器UTXHn和接收寄存器URXHn • 这两个寄存器存放着发送和接收的数据,在关闭FIFO的情况下只有一个字节8位数据。需要注意的是,在发生溢出错误的时候,接收的数据必须被读出来,否则会引发下次溢出错误。
8.2 S3C2410X异步串行通信 • 8.2.2 S3C2410X串口控制器寄存器详解 • 6、波特率分频寄存器UBRDIVn
8.2 S3C2410X异步串行通信 • 8.2.2 S3C2410X串口控制器寄存器详解 • 7、串口状态寄存器UTRSTATn
8.3 接口电路与程序设计 • 8.3.1 电路连接 图8-5 串口连接图
8.3 接口电路与程序设计 • 8.3.2 寄存器设置 • (1)禁止串口控制器的FIFO功能 • 设置UFCON0的[0]为“0”。 • (2)禁止AFC自动流控功能 • 设置UMCON0的[4]为“0” • (3)设置通讯格式为正常串口通讯模式、8个数据位、1个停止位、无奇偶校验 • 设置ULCON0的[7:0]为0x03。 • (4)设置串口的接收、发送模式为轮询模式 • 设置UCONn的[3:0]为“0101” • (5)设置串口的时钟源为PCLK • 设置UCONn的[10]为“0”。
8.3 接口电路与程序设计 • 8.3.3 程序的编写 • 1、相关寄存器定义 在例程MDK\common\inc\2410addr.h中: #define rULCON0 (*(volatile unsigned *)0x50000000) //UART 0 Line control #define rUCON0 (*(volatile unsigned *)0x50000004) //UART 0 Control #define rUFCON0 (*(volatile unsigned *)0x50000008) //UART 0 FIFO control #define rUMCON0 (*(volatile unsigned *)0x5000000c) //UART 0 Modem control #define rUTRSTAT0 (*(volatile unsigned *)0x50000010) //UART 0 Tx/Rx status #define rUBRDIV0 (*(volatile unsigned *)0x50000028) //UART 0 Baud rate divisor #define rUTXH0 (*(volatile unsigned char *)0x50000020) //UART 0 Transmission Hold #define rURXH0 (*(volatile unsigned char *)0x50000024) //UART 0 Receive buffer
8.3 接口电路与程序设计 • 8.3.3 程序的编写 • 2、串口初始化函数 • 函数输入参数为:串口工作波特率、串口通道。 • void uart_init(int nMainClk, int nBaud, int nChannel) • { • switch (nChannel) • { • case UART0: • rUFCON0 = 0x0; //禁止FIFO • rUMCON0 = 0x0; //禁止AFC自动流控功能 • //设置通讯格式为正常串口通讯模式、8个数据位、1个停止位、无奇偶校验 • rULCON0 = 0x3; • //设置串口的接收、发送模式为轮询模式, 串口的时钟源为PCLK • rUCON0 = 0x245; • //根据nBaud波特率和PCLK 设置分频寄存器 • rUBRDIV0=( (int)( PCLK /16./nBaud) -1 ); • break; • 。。。。。。
8.3 接口电路与程序设计 • 8.3.3 程序的编写 • 3、串口接收一个字符 • char uart_getch(void) • { • if(f_nWhichUart==0) //判断从第几个串口获取字符 • { • while(!(rUTRSTAT0 & 0x1)); //根据UTRSTAT0第0位的值,判断是否接收完成 • return RdURXH0(); • } • 。。。。 • }
8.3 接口电路与程序设计 • 8.3.3 程序的编写 • 4、串口发送一个字符 • void uart_sendbyte(int nData) • { • if(f_nWhichUart==0) • { //判断发送的字符是否是换行符,如果是,则需要先发送回车符‘\r’ • if(nData=='\n') • { • while(!(rUTRSTAT0 & 0x2));//等待,直到发送缓冲为空 • delay(10); • WrUTXH0('\r'); //发送缓冲为空时,发送‘\r’ • } • while(!(rUTRSTAT0 & 0x2)); //等待,直到发送缓冲为空 • delay(10); • WrUTXH0(nData); //发送缓冲为空时,发送‘nData’ • } • 。。。 • }
8.3 接口电路与程序设计 • 8.3.4 调试与运行结果 • 1、调试步骤 • (1)串口设置 • 在PC 机上运行Windows自带的超级终端串口通信程序(波特率为115 200Bd、1位停止位、无校验位、无硬件流控制)如图8-6所示;或者使用其他串口通信程序 图8-6 超级终端配置
8.3 接口电路与程序设计 • 8.3.4 调试与运行结果 • (2)硬件接线,使用目标板附带的串口线连接目标板上UART0和PC机串口COMx,并连接好ULINK2仿真器套件 • (3)运行MDK开发环境,进入实验例程目录MDK\uart_test 子目录下的uart_test.Uv2例程,编译链接工程 • (4)单击MDK控制栏“Options for Target”选择Debug 菜单,选择ULINK ARM Debugger • (5)单击Debug运行程序,下载调试代码到目标系统的RAM中 • (6)在超级终端的“Please input words that you want to transmit:”提示后输入想要发送的数据,并以回车作为发送字符串的结尾标志 • (7)继续运行程序,直至程序的结尾 • (8)结合实验内容和实验原理部分,熟练掌握S3C2410X处理器UART模块的使用
8.3 接口电路与程序设计 • 8.3.4 调试与运行结果 • 2、观察实验结果 • 在执行到第(6)步时,可以看到超级终端上输出等待输入字符: • boot success... • UART0 Communication Test Example • Please input words, then press Enter: • /> • 如果输入字符就会马上显示在超级终端上(假设输入为abcdefg),输入回车符后打印一整串字符: • The words that you input are: • abcdefg
8.4 小结 • 串口通讯的概念、数据规范 • S3C2410X串口控制器及编程方法
8.3 接口电路与程序设计 • 8.3.4 调试与运行结果
8.5 思考与练习 • 8-1 串行通讯与并行通讯的概念? • 8-2 同步通讯与异步通讯的概念、区别? • 8-3 RS-232C串口通讯接口规范? • 8-4 S3C2410X串口控制器中,哪个寄存器用来设置串口波特率? • 8-5 编写一个串口程序采用中断的方式,实现向PC的串口终端打印一个字符串“hello”的功能?