Transcript 七、串行口
Communications 通信基础知识 通信方式的几个要素 串行、并行(Serial/parallel) 同步、异步(Synchronous/asynchronous) 点对点、总线(Point-to-point/bus) 半双工、全双工(Half-duplex/full-duplex) 主从式、对等式(Master-slave/equal partners) 单端信号、差分信号(Single-ended/differential) 微控制器开发技术 Lecture4 Page 1 通信基础知识-characteristics Communications —— 串行、并行 串行通信 数据按位传输 通信方只需要很少的连接 – resource/pin efficient 速度较慢,传输信息少 传输距离较远 并行通信 数据按字节/字传输 通信方需要多个连接信号-- difficult for PCB routing 传输速度快 传输距离较短 你接触过哪些串行/并行通信? 微控制器开发技术 Lecture4 Page 2 通信基础知识-characteristics Communications —— 同步、异步 同步通信 接收方可以得到发送方的通信时钟信号 传输速率高 异步通信 发送方和接收方使用独立的时钟来处理通信信号 通信双方约定通信速率 通信中需要约定起始/停止位或定义特殊的帧结构 传输速率较低 微控制器开发技术 Lecture4 Page 3 通信基础知识-characteristics Communications —— 拓扑结构 点对点 通信线路上只有两个通信方 不需要寻址 总线 通信线路上有多个通信方 需要建立寻址机制 微控制器开发技术 Lecture4 Page 4 通信基础知识-characteristics Communications —— 半双工、全双工 半双工 不能同时进行发送和接收 一方发送时,其他通信方只能处于接收状态 需要额外的逻辑来控制发送和接收状态的切换 有发生冲突的危险 全双工 通信端可以同时进行发送和接收 需要两个独立的通信通道 使用简单,数据传输率高 对讲机?电话机? 微控制器开发技术 Lecture4 Page 5 通信基础知识-characteristics Communications —— 主从式、对等式 主从式 只有主端可以发起数据传输 从端等待主端的允许才能传输数据 对等式 任何节点可以发起数据传输 需要建立冲突检测和仲裁机制 微控制器开发技术 Lecture4 Page 6 通信基础知识-characteristics Communications —— 单端、差分信号 单端信号 信号幅度以地电平作为参考 通信双方必须建立共同的参考地电平 干扰造成的信号幅度变化可能导致错误解释 差分信号 每个信号使用两根线传输,信号的值由两个线上的电 平的差值表示 通信方不需要共同的参考地 对干扰抑止能力强 传输速率高 微控制器开发技术 Lecture4 Page 7 微控制器常见的通信类型 总线类型 线数 通信类型 多主 波特率(bps) 器件数 目 总线长度 UART 2 异步 No 3K-1M 2 * SPI 3 同步 Yes 1M-10M <10 板内 I2C 2 同步 Yes ~1M <10 板内 CAN 2 异步 Yes 20K-1M 128 百米~公 里 LIN 1 异步 No <20K 16 几十米 微控制器开发技术 Lecture4 Page 8 Tsinghua Freescale Embedded System Center www.tsinghua-mot.net by AlexGong [email protected] 10.2 同步串行外设接口SPI 单片机原理及应用 本节提要 一、SPI概述 二、SPI模块功能 三、SPI模块引脚 四、SPI模块寄存器 五、SPI模块编程范例 微控制器开发技术 Lecture4 Page 10 本节提要 一、SPI概述 二、SPI模块功能 三、SPI模块引脚 四、SPI模块寄存器 五、SPI模块编程范例 微控制器开发技术 Lecture4 Page 11 SPI 特性 可设置主机模式 / 从机模式 可选择8位或16位数据宽度 可选择全双工模式 ( 一个)或单线双向模式 可灵活设置的时钟极性和相位 可选择从最高位或最低位开始传送 可编程的传送速率 可实现双缓存操作 与LCD驱动器, D/A 转换器, RTC,EEPROM等通信 接口简单; 微控制器开发技术 Lecture4 Page 12 SPI的数据流动 微控制器开发技术 Lecture4 Page 13 SPI工作原理 IO端 7 CPU端 0 MOSI 7 0 MISO 重复8次 IO端 7 CPU端 0 MOSI 7 0 MISO 微控制器开发技术 Lecture4 Page 14 本节提要 一、SPI概述 二、SPI模块功能 三、SPI模块引脚 四、SPI模块寄存器 五、SPI模块编程范例 微控制器开发技术 Lecture4 Page 15 SPI 方框图 移位寄存器 SPI 时钟发生器 控制寄存器 微控制器开发技术 Lecture4 Page 16 主机模式 控制整个数据传送 通过定义SS 选择通信从机 确定SCK 波特率,相位和极性 切换SCK 脉冲 驱动MOSI信号 采样MISO信号 通过写入SPIDR触发传输过程 微控制器开发技术 Lecture4 Page 17 从机模式 响应传输 仅当定义了相应的SS才被激活 利用事先定义的相位和极性检测SCK跳变沿 驱动MISO信号 采样MOSI信号 微控制器开发技术 Lecture4 Page 18 本节提要 一、SPI概述 二、SPI模块功能 三、SPI模块引脚 四、SPI模块寄存器 五、SPI模块编程范例 微控制器开发技术 Lecture4 Page 19 SPI 引脚1 —— 串行数据引脚 MOSI — Master Out/Slave In Pin MISO — Master In/Slave Out Pin 作用:发送和接收串行数据 SPI置为主机模式:MISO – 数据输入线 MOSI – 数据输出线 SPI置为从机模式:MISO – 数据输出线 MOSI – 数据输入线 . 微控制器开发技术 Lecture4 Page 20 SPI 引脚2 —— 串行时钟 SCK — Serial Clock Pin 同步信号,对MOSI和MISO引脚传输的串行输入、输出数据进行同步 主机模式下,SCK信号来源于内部MCU总线时钟 主机和从机在SCK信号的跳变沿进行移位和采样数据 SCK的时钟频率由SPI0BR选择 主机和从机遵守相同时序模式 . 微控制器开发技术 Lecture4 Page 21 SPI 信号 – SCK极性 & 相位 SCK奇数跳变沿驱动,偶数跳变沿采样 微控制器开发技术 Lecture4 Page 22 SPI 信号 –SCK极性 & 相位(续) SCK偶数跳变沿驱动,奇数跳变沿采样 微控制器开发技术 Lecture4 Page 23 SPI 引脚3 —— 外设片选 SS — Slave Select Pin 主机和从机对SS引脚使用不同 主机模式:SS信号上拉到高电平 从机模式:SS信号为低电平 . 微控制器开发技术 Lecture4 Page 24 本节提要 一、SPI概述 二、SPI模块功能 三、SPI模块引脚 四、SPI模块寄存器 五、SPI模块编程范例 微控制器开发技术 Lecture4 Page 25 SPI 寄存器 1/4 SPICR1 - SPI 控制寄存器 1 1 = SPI IS MASTER 0 = SPI IS SLAVE 1 = SPI Transmit Interrupt Enable 0 = SPI Transmit Interrupt Disabled 1 = SPI SYSTEM Enabled 0 = SPI SYSTEM Disabled 1 = SPI Interrupt Enabled 0 = SPI Interrupt Disabled 1 = SPI LSB FIRST 0 = SPI MSB FIRST DDRS7 SSOE 0 0 0 1 1 1 0 1 MASTER MODE SS INPUT (MODF Enabled) GP INPUT GP OUTPUT SS OUTPUT SLAVE MODE SS INPUT SS INPUT SS INPUT SS INPUT SPICR2 - SPI 控制寄存器 2 MODFEN - Mode Fault Enable 0 = Mode Fault Disabled 1 = Mode Fault Enabled BIDIROE - Output Enable in Bidirectional mode 0 = Output Buffer Disabled 1 = Output Buffer Enabled 微控制器开发技术 SPISWAI = SPI Stop in Wait Mode 1 = HALT SSI CLOCK WHEN CPU IN WAIT MODE Lecture4 Page 26 SPI 寄存器 2/4 练习: 20M 总线时钟, 最大 SPI 波特率 = ? 最小SPI 波特率 = ? 微控制器开发技术 Lecture4 Page 27 SPI 寄存器 3/4 SPISR - SPI 状态寄存器 SPRF - SPI 接收中断标志 1 = New is received into SPIDR SPTEF - SPI 发送缓存空中断标志 1 = SPI Data Register is Empty 微控制器开发技术 MODF –主机模式错误标志 1 = SPI Master was selected as Slave Lecture4 Page 28 SPI 寄存器 4/4 SPI Data Register(SPIDR = SPIDRH:SPIDRL) - SPI 数据寄存器 注: 用户仅当SPI发送缓冲空标志置位时才能写入该寄存器. 注: 发送数据与接收数据使用相同寄存器 微控制器开发技术 Lecture4 Page 29 本节提要 一、SPI概述 二、SPI模块功能 三、SPI模块引脚 四、SPI模块寄存器 五、SPI模块编程范例 微控制器开发技术 Lecture4 Page 30 SPI模块编程范例 SPI模块编程方法 ① SPI初始化:先写SPI0BR,设定SPI波特率;再写控 制寄存器SPI0CR1和SPI0CR2,设定时钟的极性、 相位、SPI数据传输宽度、SPI工作模式、中断允许 位,并使能SPI模块 ② SPI收发数据:通过查询SPI0SR中的状态位或采用 中断方式,读写数据寄存器,完成数据收发。 微控制器开发技术 Lecture4 Page 31 SPI模块编程范例(续1) SPI模块编程范例 1. SPI初始化 //SPI初始化函数 void SPI_Init() { SPI0BR=0x44; //设定波特率 SPI0CR1=0x5C; //关闭SPI中断,置SPI主机模式,使能SPI模块 SPI0CR2=0x00; //数据传输宽度为8位,即一个字节 } 微控制器开发技术 Lecture4 Page 32 SPI模块编程范例(续2) 2. SPI收发数据 //SPI发送一个字节的函数 //参数:send_data为待发送的1字节数据 void SPI_send_char(unsigned char send_data) { while((SPI0SR&0x20)==0); SPI0DRL=send_data; } //SPI接收一个字节的函数 //返回:接收的1字节数据 unsigned char SPI_rev_char(void) { while((SPI0SR&0x80)==0); return SPI0DRL; } 微控制器开发技术 Lecture4 Page 33 SPI驱动数码管显示的典型应用 硬件连接: 教材P80: 1.MCU的MOSI(17)接164的A脚(1) 2.MCU的SCK(18)接164的CLK脚(8) 3.164的B(2)和/MR(9)接+5V 4.164的Q0~Q7,接数码管的a~DP 板上12、11、10、9、8、7、6、5、4、 3、 2、1 1 位、a 、 f 、2、3、b、4、g、c、DP、d、e 微控制器开发技术 Lecture4 Page 34 74LS164原理 符号 引脚 说明 DSA 1 数据输入 DSB 2 数据输入 Q0~Q 3 3~6 输出 GND 7 地 (0 V) CP 8 时钟输入(低电平到高电平边沿触发) /M/R 9 中央复位输入(低电平有效) Q4~Q 7 10~1 3 输出 VCC 14 正电源 微控制器开发技术 Lecture4 Page 35 SPI驱动数码管显示的典型应用 软件: 见3-SPI练习程序 微控制器开发技术 Lecture4 Page 36 异步串行通信(SCI) 通信基础知识 异步串行通信协议RS-232标准 SCI功能简介 SCI寄存器 SCI软件开发方法 SCI应用程序示例 SCI RS232 standard EIA RS-232-C 美国电子工业协会正式公布的异步串行通信标准,也是目前最常用的异步串行通信标准, 用来实现计算机与计算机之间、计算机与外设之间的数据通信 RS-232-C电平采用负逻辑,即,逻辑1:-3~-25V,逻辑0:+3~+25V (需要电平转换) RS-232-C接口标准有22根线,采用标准25芯D型插头座;PC上使用简化的9芯D型插座 多种通信应答(握手)方式: 硬件握手,自应答,XON/XOFF模式 波特率: 300bps ~ 4Mbps, 物理层有多种实现方式(铜缆,光缆,红外,无线,微波) 起始位/停止位/数据位/奇偶校验/全双工半双工模式 广泛应用: Modem,20mA电流环,RS485 个人计算机都有标准的RS232接口,驱动程序,超级终端 RS232 standard RS232 standard 简化的9芯D型接头信号定义(硬件流量控制) DTE 3 2 5 7 8 6 9 4 TxD RxD GND RTS CTS DSR DCD DTR DCE out in out in in in out TxD Transmit Data RxD Receive Data GND RTS Require To Send CTS Clear To Send DSR Data Set Ready DCD Data Care Detected DTR Data Terminal Ready RS232 standard 简化的9芯D型接头信号定义(自应答方式) DTE / DCE 2 TxD 3 RxD 7 GND 4 RTS 5 CTS 6 DSR 8 DCD 20 DTR out in out in in in out TxD RxD GND RTS CTS DSR DCD DTR (Transmit Data ) (Receive Data) (Ground) (Require to Send) (Clear to Send) (Data Terminal Ready) (Data Carry Detected) (Data Set Ready) Ready always, or XON/XOFF protocol, ASCII only! RS232 standard 简化的9芯D型接头信号定义(无应答方式) 1 2 3 5 6 7 8 9 4 protection ground RxD in TxD out GND DSR in RTS out CTS in DCD in DTR out RxD TxD GND DSR RTS CTS DCD DTR (Receive Data) (Transmit Data ) (Ground) (Data Terminal Ready) (Require to Send) (Clear to Send) (Data Carrier Detected) (Data Set Ready) No Handshake, should use XON/XOFF protocol,ASCII only RS232 standard TTL level vs. RS232 level RS232 standard TTL level vs. RS232 level RS232 standard DB9 RS232标准(1962) 出现的比TTL(1964) 还早 需要接口转换芯片 RS232 MAX232 TTL/CMOS Microcontroller UART Frame format 0 idle start LSB 1 2 3 4 5 6 7 8 MSB Parity stop (stop) idle NRZ (not return zero) encoding Several configurable parameters Baud rate, #data bits, parity, #stop bits Nomenclature: 9600,N81 LSB- Least significant bit MSB- Most significant bit Start/stop 位 接受端需要明确数据帧的边界,即该帧从 什么时候开始,什么时候结束。 数据位传送之前,都要发送START 位 (always ‘0’) (从空闲状态开始的下降沿,是 START位的开始) 在数据位传送结束后,还要传送STOP位 (always ‘1’). 数据位识别 接受端在其时钟上升沿采样数据线电平, 以识别数据位的高低状态。 What is the data transmitted above? 数据位识别 Tx_clk TxD 传输过程会引起信号的延迟,会引入外部干扰导致的噪声及毛刺 RxD Rx_clk SCI(UART)-oversampling - 通信双方有约定的通信速率(波特率) - 接受端按照16倍波特率的频率对信号进行"over samples" - 使用其中3个采样结果,通过3取2的机制确定实际的信号电平状态 - 如果3个采样结果不一致,noise标志会置起 - 接受端在总线进入空闲状态后,通过监测下降沿,启动对起始位的判断,从 而开始整个数据帧的接受。 SCI(UART)-oversampling SCI- 波特率 波特率: bits per second Question1: 按照9600,N81的通信参数,每 秒可以传送多少个字节? Hints: don’t forget the start/stop bits. Question2: 对于一个总线频率为16MHz的 微控制器,其SCI最高支持的波特率是多少? 波特率误差容限 10 Transmitter 9 1 Receiver 0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1 1 16*(1+8) +9 接受端必须能正确的识别整个数据帧,从起始位到停止位 9Ttx < (153/16)Trx <10Ttx clock difference tolerance ~5% 校验位 校验位附加在数据帧末尾,用于检查传输过程 中是否发生了数据位错误。 start LSB MSB Parity stop Parity bit 偶校验 -- 所有数据位和校验位中,1的数目是偶数 奇校验 --所有数据位和校验位中,1的数目是奇数 Example: what is the even parity for “10011100” what is the odd parity for “01010110” SCI 可能产生的事件 - Tx Empty - Tx Complete - Rx Full - Idle - Rx Overrun - Noise Error - Framing Error - Parity Error (IRQ) (IRQ) (IRQ) (IRQ) (IRQ) SCI 故障 Framing Error: 在数据帧结尾没有收到正确 的停止位 Receiver overrun: 下一个数据到达时,上 一个数据还没有被处理 Parity Error: 接受的校验和与协议规定的不 匹配. So, are we clear about UART? Let’s play a game! I need one volunteer This volunteer will be a UART sender, all your students will be UART receivers. LSB first Protocol is 1,N81 (1bit per second) Hand-raise is ‘1’, hand-down is ‘0’ SCI – 双缓冲寄存结构 Transmitter: Receiver: DATA IN P A R I T Y G E N . T8 DATA IN TDR BUFFER SHIFT REGISTER DATA OUT SHIFT REGISTER R8 RDR BUFFER DATA OUT 发送和接受都具有双缓冲结构 CPU不能读写移位缓冲寄存器 CPU仅能访问数据寄存器 . P A R I T Y C H E C K SCI – 缓冲结构 发送时,数据自动从数据寄存器转移到移位寄存器 接受时,数据自动从移位寄存器转移到数据寄存器 发送和接受的数据寄存器使用相同的寄存器地址 读写该寄存器地址具有不同的含义! Question: what’s the function of the instructions below . while(1){ asm LDAA SCI0DR asm STAA SCI0DR } Transmitter block diagram Tx data register Shift register Tx clock gen Note the ÷16 Parity gen Interrupt request gen Control logic Receiver block diagram Rx data register Rx clock gen shift register Control logic SCI(UART) SCI Registers 1/5 SCIBH/L - SCI Baud Rate Control Register 24M bus clock Bus clock 1 ~ 8191 Exercise1: 9600bps wanted, BR = ? BDH = ? BDL = ? Exercise2: the maximum baud rate = ? 必须连续写入BDH和BDL寄存器,仅仅写入BDH没有作用。 SCI Registers 2/5 SCCR1 - SCI Control Register 1 Address Offset $0002 1 = EVEN PARITY 0 = ODD PARITY 1 = PARITY Enabled 0 = PARITY Disabled 1 = NORMAL IDLE TIME 0 = SHORT IDLE TIME SCISWAI - SCI Stop in Wait mode 0 = Normal operation 1 = SCI Disabled in Wait mode 1 = IDLE LINE WAKE-UP 0 = ADDRESS MARK WAKE-UP 1 = 9-BIT DATA 0 = 8-BIT DATA SCI Registers 3/5 SCICR 2 - SCI Control Register 2 TIE - Transmitter Interrupt Enable 1 = Transmitter IRQ Enabled 0 = Transmitter IRQ Disabled ILIE - Idle Line Interrupt Enable 1 = IDLE IRQ Enabled 0 = IDLE IRQ Disabled RWU - Receiver Wake-up 1 = Enter Receiver Wake-UP 0 = Exit Receiver Wake-UP TCIE - Transmit Complete Interrupt Enable 1 = Transmitter Complete IRQ Enabled 0 = Transmitter Complete IRQ Disabled TE _ Transmitter Enable 1 = Transmitter Enabled 0 = Transmitter Disabled SBK - Send Break 1 = Send Break 0 = Terminate Break RIE - Receiver Interrupt Enable 1 = Receiver IRQ Enabled 0 = Receiver IRQ Disabled RE Receiver Enable 1 = Receiver Enabled 0 = Receiver Disabled SCI Registers 4/5 SCISR 1 - SCI Status Register 1 RDRF: Receive data Register Full TC : Transmit Complete TDRE: Transmit data register empty SCISR 2 - SCI Status Register 2 BRK13 - Break Transmit Character Length 0 = Break Char is 10 or 11 bits long 1 = Break Char is 13 or 14 bit long TXDIR - Transmitter pin direction 0 = TxD pin is input in Single-Wire mode 1 = TxD pin is output in Single-Wire mode RAF - Receiver Active Status 1 = Receiver Active 0 = Receiver not Active SCI Registers 5/5 SCIDRH/L - SCI Data Register High/Low Note: R8 and T8 are used when 9-bit char is required Notice: same register for both transmit data and receive data SCI programming Put_Char BRCLR SCI0SR1,#$80,* STAB SCI0DRL RTS void Put_Char(char c) { while ( (SCI0SR1 & 0x80) == 0); SCI0DRL = c; } SCI programming Get_Char BRCLR SCI0SR1,$20,* LDAB SCI0DRL RTS char Get_Char(void); { while ((SCI0SR1 & 0x20) == 0); return(SCI0DRL); }