1、第7章 IO设备与通信接口7.1 IO设备与通信接口概念7.3 串行异步通信7.2 串行通信基础7.4 I2C总线7.5 SPI总线7.6 USB总线7.1 IO设备与通信接口概念示例7-111.51单片机在编程时,可以直接对IO口进行赋值或读取IO口状态,IO口状态通常有0和1。2.STM32嵌入式芯片的GPIO口通常有8种输入输出模式可供选择,且不仅要配置功能模式,还要配置端口引脚的最大速度,开启相应的时钟模块,然后才能从数据寄存器中写入或读取数据。但由于ARM处理器的应用十分广泛,开发者们为了提高开发效率,为其开发了对应的固件库,可以更方便的控制IO口。在一个嵌入式系统中,处理器用于运算
2、以实现处理功能;存储器用于存储数据以实现存储功能;而不同模块间的通信则需要经由总线进行。利用总线实现通信的技术称为接口技术,进行通信的设备即为IO(Input/Output)设备。IO接口作为CPU和外设之间交换数据的通路,也是其他模块(如I2C通信、SPI通信)的基础。不同的CPU对IO设备的操作方式上不尽相同,但原理类似。对8位单片机来说,其IO口可以直接写入或读取;但对于32位的高性能处理器来说,其IO口的控制就要复杂许多,有的IO口还可以进行功能复用,所以在使用时必须通过对应的寄存器进行控制。当处理器内核操作I/O接口时,需要先访问I/O接口对应的寄存器,进而操作这些接口模块,因此这些
3、接口模块必须有一个地址。不同的处理器有往往有不同的地址编码方式。7.1.1IO接口寄存器的映射方式1.1.统一编址统一编址统一编址,也称存储器映像编址,指的是从存储空间中分配一个空间给I/O端口,这种情况下,I/O空间的地址位于存储器空间,访问寄存器与访问存储器使用相同的指令。这种映射方式有着较大的编址空间,对端口操作的指令类型较多,功能也更全面。但端口地址会占用存储器的地址空间,执行效率也比CPU内部指令效率要低,端口外围的译码器也更复杂。映射方式有以下两种实现方案:(1)I/O空间与存储器空间重叠MCS51系列单片机,I/O寄存器成为特殊功能寄存器,它们映射到片上存储器空间,与片上存储器的
4、地址空间重合,访问特殊功能寄存器和访问片上存储器的指令相同,但是采用不同的寻址方式。(2)I/O空间与存储器空间不重叠把整个存储器寻址空间分配出一部分用于I/O空间,访问存储器和访问I/O的地址空间不同。为了存储器系统设计的方便,嵌入式处理器的I/O空间是可以重新定位的,设计一个重新定位寄存器,通过编程重新定位寄存器的值,可以使I/O空间在整个存储器空间浮动。7.1.1IO接口寄存器的映射方式2.2.统一编址统一编址独立编址方式设计了存储器地址空间和I/O地址空间,它们之间完全独立,互不影响,处理器对它们的访问采用不同的指令进行。I/O寄存器的实际地址的计算方法也是基地址加上偏移量。独立编址的
5、好处有:不占用内存空间;译码电路设计简单;程序可读性高。提高易用性的背后不可避免的会牺牲功能性,与统一编址相比,独立编址只能使用专用的I/O指令,访问端口的方法较少。I/O接口电路与嵌入式处理器之间通过内部总线交换信息,I/O模块从编程结构上来说可分成数据输入寄存器、数据输出寄存器、控制寄存器、状态寄存器、模式寄存器等。I/O接口的功能主要有:(1)实现主机和外设的通信联络控制。(2)进行地址译码和设备选择:把CPU传来的地址号转换为制定设备。(3)实现数据缓冲。(4)电平信号转换:外社和主机的电平信号不同,要通过转换。(5)传送控制命令和状态信息,接收CPU传来的启动设备命令和向CPU传递设
6、备准备就绪信号。7.1.2IO设备分类IO设备就是通常生活中所说的外设,是计算机及嵌入式系统的延伸部分,与外界沟通的硬件组成。可以从多方面对I/O设备进行分类:A、按使用特性分类,可以划分为:(1)存储设备,如磁盘、磁带、光盘等。(2)输入/输出设备,如打印机、键盘、显示器、声音输入/输出设备等等。(3)终端设备,包括通用终端、专用终端和虚终端。(4)脱机设备。B、按传输数据数量分类,可划分为:(1)字符设备,如打印机、终端、键盘等低速设备。(2)块设备,如磁盘、磁带等高速外存储器。7.1.2IO设备分类C、按所属关系分类,可划分为:(1)系统设备,指在操作系统生成时已经等机载系统中的标准设备
7、,如打印机、磁盘等,时钟也是一种系统设备。(2)用户设备,指在系统生成时未登记在系统中的非标准设备。D、按资源分配分,可划分为:(1)独占设备,通常分配给某个进程,在该进程释放之前,其他进程不能使用,如打印机和纸带读入机。(2)共享设备,允许若干个进程同时使用。如磁盘机等。(3)虚拟设备,通过假脱机技术把原来的独占设备改造成若干进程所共享的设备,以提高设备的利用率。7.1.3并行通信与串行通信n1.并行通信并行通信并行通信是将数据字节的各位用多条数据线同时进行传送,类似于有8个车道同时可以过去8辆车一样。一般来说,并行通信技术最适宜应用在IC芯片间通信,因此大部分IC设计公司都有自己设计开发的
8、并行总线协议,如比较流行的ISA总线、EISA总线、PCI总线、PC/104u总线、IEEE1284总线等等,都属于并行通信总线。并行通信控制简单、传输速度快;但由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。n2.串行通信串行通信串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。就如同一条车道,一次只能一辆车过去,如果一个0 x55这样一个字节的数据要传输过去的话,假如低位在前高位在后的话,那发送方式就是0-1-0-1-1-0-1-0-1,一位一位的发送出去的,要发送8次才能发送完一个字节。串行通信的
9、传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。7.1.4同步通信与异步通信n1.异步通信异步通信 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。异步通信以字符(构成的帧)为单位进行传输,字符与字符之间的间隙异步通信以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)任意,但每个字符中的各位是以固定的时间传送的,即字符之间(时间间
10、隔)任意,但每个字符中的各位是以固定的时间传送的,即字符之间是异步的(字符之间不一定有是异步的(字符之间不一定有“位间隔位间隔”的整数倍的关系),但同一字符内的的整数倍的关系),但同一字符内的各位是同步的(各位之间的距离均为各位是同步的(各位之间的距离均为“位间隔位间隔”的整数倍)。的整数倍)。异步通信的每帧数据由异步通信的每帧数据由4部分组成:起始位(占部分组成:起始位(占1位)、字符代码数据位位)、字符代码数据位(占(占58 位)、奇偶校验位(占位)、奇偶校验位(占1位,也可以没有校验位)、停止位(占位,也可以没有校验位)、停止位(占1或或2位)。图位)。图7.1给出了给出了8位数据位和位
11、数据位和1位停止位,加上固定的位停止位,加上固定的1位起始位,共位起始位,共10位组位组成的一个传输帧,无校验位。传送时数据的低位在前,高位在后。字符之间允成的一个传输帧,无校验位。传送时数据的低位在前,高位在后。字符之间允许有不定长度的空闲位。起始位许有不定长度的空闲位。起始位“0”作为联络信号,它告诉收方传送的开始,作为联络信号,它告诉收方传送的开始,接下来的是数据位和奇偶校验位,停止位接下来的是数据位和奇偶校验位,停止位“1”表示一个字符的结束,表示一个字符的结束,7.1.4并行通信与串行通信2.同步通信同步通信同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,
12、传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种方法实现:1)外同步:在发送方和接收方之间提供单独的时钟线路,发送方在每个比特周期都向接收方发送一个同步脉冲。接收方根据这些同步脉冲来完成接收过程。由于长距离传输时,同步信号会发生失真,所以外同步方法仅适用于短距离的传输。2)自同步:利用特殊的编码(如曼彻斯特编码),让数据信号携带时钟(同步)信号。在比特级获得同步后,还要知道数据块的起始和结束。为此,可以在数据块的头部和尾部加上前同步信息和后同步信息。加有前后同步信息的数据块构成一帧。前后同步信息的形式
13、依数据块是面向字符的还是面向位的分成两种。同步通信的特点是以同步字符或特定的位组合“01111110”作为帧的开始,所传输的一帧数据可以是任意位。所以传输的效率较高,但实现的硬件设备比异步通信复杂。7.2串行通信基础串行通信是一种结构简单、用途广泛的一种通信方式,其通过数据信号线、地线、控制线等较少的数据线即可按位进行传输数据,虽然结构简单,但其具有超过1200米的有效传输距离。串口通信对应的串行接口,简称串口,是一种可以将处理器发出的并行数据转换成连续的串行数据流发送出去,同时也可接收串行数据流的器件,具备此功能的电路,一般被称为串行接口电路。在嵌入式系统中,串口通信用途广泛,大部分嵌入式系
14、统都集成了串行接口,许多外部设备也支持串口通信。目前市面上有多种串口,从最开始的普通串口,4线制的I2C通信接口到通信速度更快的SPI接口,USB接口等,速率的提高往往会带来口线数量的增加,因此,需要结合实际应用需求选择最适合的通信接口。7.2.1串行通信的传输方向串行通信依数据传输的方向及时间关系可分为:单工、半双工和全双工。n1单工单工通信就是指只允许一方向另外一方传送信息,而另一方不能回传信息。比如电视遥控器、收音机广播等,都是单工通信技术。n2半双工半双工通信是指数据可以在双方之间相互传播,但是同一时刻只能其中一方发给另外一方,比如我们的对讲机就是典型的半双工。n3全双工全双工通信就发
15、送数据的同时也能够接收数据,两者同步进行,就如同我们的电话一样,我们说话的同时也可以听到对方的声音。7.2.2传输速率数据的传输速率可以用比特率表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送960个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为10位960/秒=9600bps应注意的是,在数据通信中常用波特率表示每秒钟调制信号变化的次数,单位是:波特(Baud)。波特率和比特率不总是相同的,如每个信号(码元)携带1个比特的信息,比特率和波特率就相同。如1个信号(码元)携带2个比特的信息,则比特率就是波特率的2倍。对于将数字
16、信号1或0直接用两种不同电压表示的所谓基带传输,波特率和比特率是相同的。所以,我们也经常用波特率表示数据的传输速率。7.2.3串行通信的错误校验在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的一个或者多个帧被破坏。校验是保证准确无误传输数据的关键。常用的校验方法有奇偶校验、代码和校验及循环冗余码校验。n1奇偶校验在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。当约定为奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;当约定为偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。接收方与发送方的校验方式应一致。接收字符时,对
17、“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。7.2.3串行通信的错误校验n2代码和校验代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错。7.2.3串行通信的错误校验n3循环冗余校验循环冗余校验是通过某种数学运算,产生简短固定位数校验码的一种散列函数。循环冗余校验同其他差错检测方式一样,通过在要传输的k比特数据D后添加(n-k)比特冗余位F(又称帧检验序列,FrameCh
18、eckSequence,FCS)形成n比特的传输帧T,再将其发送出去,从而实现有效信息与校验位之间的循环校验。7.2.4常见串行通信协议下表列出了常见的串行通信协议的一些性能指标7.3 串行异步通信我们的台式电脑上,一般都会有一个9芯的异步串行通信口,简称串行口或COM口,通常用于2台设备之间的串行通讯。随着USB接口的普及,串行口的地位逐渐降低,但是作为设备间简便的通信方式,在相当长的时间内,串行口还不会消失,在市场上也可很容易购买到USB到串行口的转接器。因为简单且常用的串行通信只需要三根线(发送线、接收线和地线),所以串行通信仍然是MCU与外界通信的简便方式之一。RS-232通信接口RS
19、-232接口一共有9个引脚,我们只需要关心其中的2号引脚RXD(接收线)、3号引脚TXD(发送线)和5号引脚GND(地线)即可。其他为进行远程传输时接调制解调器之用,有的信号也可作为硬件握手信号,初学时可以忽略这些信号的含义。虽然这三个引脚的名字和我们单片机上的串口名字一样,但是却不能直接和单片机连接通信。这是为什么呢?7.3 串行异步通信由于MCU引脚输入输出一般使用TTL(TransistorTransistorLogic)电平,即晶体管-晶体管逻辑电平。而TTL电平的“1”和“0”的特征电压分别为2.4V和0.4V(目前使用3V供电的MCU中,该特征值有所变动),即大于2.4V则识别为“
20、1”,小于0.4V则识别为“0”。它适用于板内数据传输。若用TTL电平将数据传输到5m之外,那么可靠性就很值得考究了。为使信号传输得更远,美国电子工业协会(ElectronicIndustryAssociation,EIA)制订了串行物理接口标准RS-232C。RS-232C采用反逻辑,也叫做负逻辑,-15V-3V为逻辑“1”,+3V+15V为逻辑“0”。低电平代表的是1,而高电平代表的是0,所以称之为负逻辑。因此电脑的9针RS-232串口是不能和单片机直接连接的,需要用一个电平转换芯片MAX232来完成,它提供了两路串行通信接口引脚含义简要说明如下。Vcc(16脚):正电源端,一般接+5V;
21、GND(15脚):地;Vs+(2脚):Vs+2Vcc1.5V4.5V;Vs-(6脚):Vs-2Vcc1.5V-7.5V;C2+、C2-(4、5脚):一般接0.1F的电解电容;C1+、C1-(1、3脚):一般接0.1F的电解电容。MAX232转接图7.4 I2C总线7.4.1I2C总线的历史概况I2C总线是Philips公司于20世纪80年代初提出的,主要用于同一电路板内各集成电路模块(Inter-IntegratedCircuit,IC)之间的连接。I2C总线采用双向二线制串行数据传输方式,支持所有IC制造工艺,极大的简化了IC间的通信连接。其后Philips和其他厂商提供了种类丰富的I2C兼
22、容芯片。目前I2C总线标准已经成为世界性的工业标准,被广泛应用于嵌入式系统的板上通信。从飞利浦公司提出I2C总线标准到现在,I2C已经发展了三十多年。1992年,Philips首次发布I2C总线规范Version1.0,并取得专利。6年后,Philips发布I2C总线规范Version2.0,此时标准模式和快速模式的I2C总线已经获得了广泛应用,标准模式传输速率为100kbps,快速模式传输速率为400kbps。同时,I2C总线也由7位寻址发展到10位寻址,满足了更大寻址空间的需求。随着数据传输速率和应用功能的迅速增加,2001年Philips又发布了I2C总线规范Version2.1,完善和
23、扩展了I2C总线的功能,快速模式下传输速率可达3.4Mbps。这使得I2C总线能够支持现有及将来的高速串行传输,如EEPROM和Flash存储器等。目前I2C总线已经被大多数的芯片厂家所采用,较为著名的有STMicroelectronics、TexasInstruments、Xicor、Intel、Maxim、Atmel、AnalogDevices和InfineonTechnologies等,I2C总线标准已经属于世界性的工业标准。I2C总线始终和先进技术保持同步,版本更迭与时俱进,且仍然保持向下兼容,这对开发者来说非常友好。7.4.2I2C总线的典型电路n下图给出一个由MCU作为主机,通过I
24、2C总线带3个从机的单主机I2C总线系统。这是最常用、最典型的I2C总线连接方式。在物理结构上,I2C系统由一条串行数据线SDA和一条串行时钟线SCL组成,来完成数据的传输及外围器件的扩展。I2C对各器件的寻址是软寻址方式,因此节点上没有必须的片选线,器件地址给定完全取决于器件类型与单元结构。每个器件都有唯一的地址,且可以是单接收的器件(如LCD驱动器),或者是可以接收也可以发送的器件(如存储器)。发送器或接收器可在主或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。另外,I2C总线能在总线竞争过程中进行总线控制权的仲裁和时钟同步,不会造成数据丢失,因此由I2C总线连接的多机系
25、统可以是一个多主机系统。I2C总线的典型连接7.4.3I2C总线数据通信协议n(1)I2C总线上数据的有效性I2C总线以串行方式传输数据,从数据字节的最高位开始传送,每个数据位在SCL上都有一个时钟脉冲相对应。在一个时钟周期内,当时钟线高电平时,数据线上必须保持稳定的逻辑电平状态,高电平为数据1,低电平为数据0。当时钟信号为低电平时,才允许数据线上的电平状态变化,如图。I2C总线上数据的有效性7.4.3I2C总线数据通信协议n(2)I2C总线上的信号类型I2C总线在传送数据过程中共有四种类型信号,分别是开始信号、停止信号、重新开始信号和应答信号。开始信号(START):当SCL为高电平时,SD
26、A由高电平向低电平跳变,产生开始信号。当总线空闲的时候(例如没有主动设备在使用总线,即SDA和SCL都处于高电平),主机通过发送开始信号(START)建立通信。开始、重新开始和停止信号7.4.3I2C总线数据通信协议n(2)I2C总线上的信号类型停止信号(STOP):当SCL为高电平时,SDA由低电平向高电平的跳变,产生停止信号。主机通过发送停止信号,结束时钟信号和数据通信。SDA和SCL都将被复位为高电平状态。重新开始信号(RepeatedSTART):在I2C总线上,由主机发送一个开始信号启动一次通信后,在首次发送停止信号之前,主机通过发送重新开始信号,可以转换与当前从机的通信模式,或是切
27、换到与另一个从机通信。如图7-6所示,当SCL为高电平时,SDA由高电平向低电平跳变,产生重新开始信号,它的本质就是一个开始信号。开始、重新开始和停止信号7.4.3I2C总线数据通信协议n(2)I2C总线上的信号类型应答信号(A):接收数据的IC在接收到8位数据后,向发送数据的IC发出的特定的低电平脉冲。每一个数据字节后面都要跟一位应答信号,表示已收到数据。应答信号在第9个时钟周期出现,这时发送器必须在这一时钟位上释放数据线,由接收设备拉低SDA电平来产生应答信号,由接收设备保持SDA的高电平来产生非应答信号。所以一个完整的字节数据传输需要9个时钟脉冲。如果从机作为接收方向主机发送非应答信号,
28、这样主机方就认为此次数据传输失败;如果是主机作为接收方,在从机发送器发送完一个字节数据后,发送了非应答信号,从机就认为数据传输结束,并释放SDA线。I2C总线的应答信号7.4.3I2C总线数据通信协议n(2)I2C总线上的信号类型开始、重新开始和停止信号都是由主控制器产生的,应答信号由接收器产生,总线上带有I2C总线接口的器件很容易检测到这些信号。但是对于不具备这些硬件接口的MCU来说,为了能准确地检测到这些信号,必须保证在I2C总线的一个时钟周期内对数据线至少进行两次采样。I2C总线的应答信号开始、重新开始和停止信号7.4.3I2C总线数据通信协议n(3)I2C总线上数据传输格式一般情况下,
29、一个标准的I2C通信由四部分组成:开始信号、从机地址传输、数据传输和结束信号。由主机发送一个开始信号,启动一次I2C通信;在主机对从机寻址后,再在总线上传输数据。I2C总线上传送的每一个字节均为8位,首先发送的数据位为最高位,每传送一个字节后都必须跟随一个应答位,每次通信的数据字节数是没有限制的;在全部数据传送结束后,由主机发送停止信号,结束通信。7.4.3I2C总线数据通信协议n(3)I2C总线上数据传输格式如图所示,时钟线为低电平时,数据传送将停止进行。这种情况可以用于当接收器接收到一个字节数据后要进行一些其他工作而无法立即接收下个数据时,迫使总线进入等待状态,直到接收器准备好接收新数据时
30、,接收器再释放时钟线使数据传送得以继续正常进行。例如,当接收器接收完主控制器的一个字节数据后,产生中断信号并进行中断处理,中断处理完毕才能接收下一个字节数据,这时,接收器在中断处理时将钳住SCL为低电平,直到中断处理完毕才释放SCL。I2C总线的数据传输格式7.4.3I2C总线数据通信协议n(4)I2C总线寻址约定为了消除I2C总线系统中主控器与被控器的地址选择线,最大限度地简化总线连接线,I2C总线采用了独特的寻址约定,规定了起始信号后的第一个字节为寻址字节,用来寻址被控器件,并规定数据传送方向,器件地址码高4位(D7D4)为AAAA,是器件的类型,具有固定的定义,如EERROM为1010,
31、A/D转换器为1001。中间的3位(D3D1)为BBB,是片选信号,同类型的器件最多可以在I2C总线上挂载8个。最后一位D0位为读写控制位,方向位为0时,表示主控器将数据写入被控器,为1时表示主控器从被控器读取数据。7.4.3I2C总线数据通信协议n(4)I2C总线寻址约定主机要向从机写1字节数据时,主机首先产生START信号,然后紧跟着发送一个从机地址,这个地址共有7位,紧接着的第8位是数据方向位(R/W),0表示主机发送数据(写),1表示主机接收数据(读),这时候主机等待从机的应答信号(ACK),当主机收到应答信号时,发送要访问的地址,继续等待从机的响应信号,当主机收到响应信号时,发送1字
32、节的数据,继续等待从机的响应信号,当主机收到响应信号时,产生停止信号,结束传送过程,主机向从机写数据7.4.3I2C总线数据通信协议n(4)I2C总线寻址约定当主机要向从机读1字节数据时,主机首先产生START信号,然后紧跟着发送一个从机地址。注意,此时该地址的第8位为0,表明是向从机写命令,这时候主机等待从机的应答信号(ACK),当主机收到应答信号时,发送要访问的地址,继续等待从机的应答信号,当主机收到应答信号后,主机要改变通信模式(主机将由发送变为接收,从机将由接收变为发送),所以主机发送重新开始信号,然后紧跟着发送一个从机地址。注意,此时该地址的第8位为1,表明将主机设置成接收模式开始读
33、取数据,这时主机等待从机的应答信号,当主机收到应答信号时,就可以接收1字节的数据,当接收完成后,主机发送非应答信号,表示不再接收数据,主机进而产生停止信号,结束传送过程,如图所示。主机向从机读取数据7.4.4I2C编程基本方法目前,高性能的嵌入式处理器大多集成了专用的I2C模块,其使用方法也较为简单,对于没有集成I2C模块的嵌入式系统,也可以使用处理器IO口模拟I2C。对I2C模块的操作,主要有初始化、发送数据、接收数据等。初始化的过程一般有以下几个步骤。(1)使能I2C模块时钟,配置I2C引脚。(2)配置I2C通信速率。(3)设置其他工作属性,并使能I2C模块工作。7.4.4I2C编程基本方
34、法发送数据的过程一般按照如下步骤进行。(1)发送开始信号,等待从机应答。(2)从机应答后,发送从机地址并通知从机接收数据,等待从机的应答信号。(3)从机应答后,发送要写入的从机的寄存器地址,等待从机的应答信号。(4)从机应答后,发送一个字节的数据,等待从机应答。(5)从机应答后,发送停止信号,通信结束。7.4.4I2C编程基本方法接收数据的过程一般按照如下步骤进行。(1)发送开始信号,等待从机应答。(2)从机应答后,发送从机地址并通知从机接收数据,等待从机的应答信号。(3)从机应答后,发送要读取的从机的寄存器地址,等待从机的应答信号。(4)从机应答后,发送重新开始信号,通知从机发送数据,等待从
35、机的应答信号。(5)从机应答后,设置主机为接收模式,准备接收从机发来的数据,等待数据接收完成。(6)发送停止信号,读取数据。7.5 SPI总线SPI(SerialPeripheralInterface)和I2C(Inter-IntegratedCircuil)都是嵌入式设计中常用的同步串行通信接口,其中SPI是摩托罗拉公司推出的一种同步串行通信接口,不同于I2C总线,SPI总线主要用于微处理器和外围扩展芯片之间的串行连接,具有比I2C较长的通讯距离。现已发展成为一种工业标准。目前,各半导体公司推出了大量带有SPI接口的芯片,为用户的外围扩展提供了灵活而廉价的选择。如AD公司的AD7811/12
36、、IT公司的TLC1543、TLC2543、TLC5615等AD和D/A转换器,Da1las公司的DS1302/05/06等实时时钟RTC,AD公司的AD7816/17/18;NS公司的LM74等温度传感器,LED控制驱动器MAX7219、HD7279以及集成看门狗、电压监控、E2PROM等功能的X5045都属于常用SPI串行总线接口的器件。7.5 SPI总线SPI一般使用4条线:分别为串行时钟线SCK(SerialClock)、主机输入/从机输出数据线MISO(MasterInput/SlaveOutput)、主机输出/从机输入数据线MOSI(MasterOutput/SlaveInput)
37、和从机选择线SS(SlaveSelect),如图所示。SPI总线的典型连接7.5.1SPI通信时序SPI接口采用了串行通讯协议,数据是在时钟信号SCK(同步信号)的控制下按位传输的,因此至少需要8次时钟信号的改变(上升沿和下降沿为一次),才能完成8位数据的传输。数据传输过程涉及时钟相位与时钟极性两个概念。所谓时钟极性是指时钟信号在空闲时是高电平还是低电平,所谓时钟相位是指接收方从数据线上取数的时刻是在时钟信号SCK的上升沿还是在下降沿。我们使用CPHA表示时钟相位,CPOL表示时钟极性。这样SPI接口组合起来就有四种不同的数据传输时序,如下图所示。7.5.1SPI通信时序SPI时序图注意:SP
38、I主设备的时钟极性和时钟相位选择依据从设备的时钟极性和时钟相位,因此在配置SPI接口时钟时,必须先了解从设备的时钟要求。从设备何时接收发送数据,是第一个时钟跳变沿还是第二个时钟跳变沿,是在时钟的上升沿还是下降沿?由于主设备的接收引脚与从设备的发送引脚相连接,主设备的发送引脚与从设备的接收引脚相连接,即从设备接收的数据是主设备的发送引脚发出的,主设备接收的数据是从设备发送引脚发出的,因此主设备接收数据的极性跟从设备接收数据的极性相反,跟从设备发送数据的极性相同。7.5.1SPI通信时序7.5.2模拟SPI对于不带SPI串行总线接口的MCU来说,可以使用普通IO口配合相应软件来模拟SPI的操作。例
39、如,我们可以使用三个普通I/O口,分别定义为pin_SCK、pin_MISO、pin_MOSI,用来模拟SPI器件的SCK、MISO、MOSI。对于不同的串行接口外围芯片,它们的时钟时序可能有所不同。我们假设某SPI外围芯片在SCK的上升沿输入数据和在下降沿输出数据,则我们初始化pin_SCK1,在MCU正常工作后,置pin_SCK0。这样,MCU在输出1位SCK时钟的同时,SPI外围芯片串行左移一位,从而输出1位数据至MCU的pin_MISO线。然后置SCK为1,则MCU的pin_MOSI线输出1位数据(先高位,后低位)到SPI外围芯片。至此,模拟1位数据输入输出便完成了。此后再置SCK0,
40、模拟下1位数据的输入输出,依此循环8次,即可完成1次通过SPI总线传输8位数据的操作。对于在SCK的下降沿输入数据和上升沿输出数据的器件,则应初始化pin_SCK0,在MCU正常工作后,置SCK1,使SPI器件输出1位数据(MCU接收1位数据),之后再置SCK1,使SPI外围芯片接收1位数据(MCU发送1位数据),从而完成1位数据的传送。7.5.3SPI编程基本方法在进行SPI编程时,首先必须进行SPI系统初始化,主要是对SPI模块配置寄存器SPIx_MCR、SPI时钟与传输属性寄存器SPIx_CTARn进行设置,定义SPI工作模式、时钟的空闲电平及相位、允许SPI等,并根据传送速度计算波特率
41、;其次定义主机发送操作的功能函数;再次定义从机接收操作的功能函数。详细编程方法如下。SPI初始化一般有以下几个步骤。(1)将有SPI功能的引脚复用为SPI功能。(2)设置SPI时钟与传输属性寄存器,定义SPI总线波特率、传输相位、极性。(3)设置SPI控制寄存器,选择主机从机模式。(4)设置SPI状态寄存器,使能传输队列FIFO满标志位。(5)设置SPI中断请求选择及使能寄存器,禁止中断。7.5.3SPI编程基本方法SPI初始化成功后,即可进行数据通信。一般来说,主机发送一个字节需要经过的流程有:(1)设置SPI控制寄存器为主机模式,将HALT位清0,开始传输。(2)将所要发送数据存放到发送队
42、列寄存器中,注意时钟与传输属性选择位的配置。(3)将SPI控制寄存器HALT位置1,结束传输。从机接收一个字节需要的步骤为:(1)设置SPI控制寄存器为从机模式,将HALT位清0,开始接收。(2)当接收队列溢出标志被置位时,将接收数据存放到接收队列寄存器中。(3)将SPI控制寄存器HALT位置1,结束传输。7.5.3SPI编程基本方法SPI具有初始化、接收和发送三种基本操作。按照构件的思想,可将它们封装成几个独立的功能函数,初始化函数完成对SPI模块的工作属性的设定,接收和发送功能函数则完成实际的通信任务。7.6 USB总线I2C与SPI总线由于对时序要求严格,在远距离通信时会产生信号畸变,因
43、此多用于板上、板间通信。下面介绍的就是我们广为熟知、应用广泛、功能强大的USB通信。其具有易于使用、数据传输快速可靠、灵活、成本低和省电等优点,已成为PC与外围设备最主要的数据通信方式。7.6.1USB简介通用串行总线(UniversalSerialBus,USB)是由Intel、Compaq、Microsoft、Digital、IBM以及NorthernTelecom等公司共同提出,是2000年后普遍使用的连接外围设备和计算机的一种新型串行总线标准。与传统计算机接口相比,它克服了对硬件资源独占,限制对计算机资源扩充的缺点,并以较高的数据传输速率和即插即用等优势,逐步发展成为计算机与外设的标准
44、连接方案。现在不但常用的计算机外设如鼠标、键盘、打印机、扫描仪、数码相机、U盘、移动硬盘等使用USB接口,甚至数据采集、信息家电、网络产品等领域也越来越多地使用USB接口。从USB概念产生至今,其协议版本经过了多次升级更新。先后经历了USB1.0版本、USB1.1版本(新增传输类型-中断传输)、USB2.0版本(新增了高速模式)、USB3.0版本(支持超速模式)以及USB3.1版本。且支持多种速度和操作模式,包括低速1.5Mbps、全速12Mbps、高速480Mbps、超速5Gbps及超高速10Gbps。同时USB还支持4种类型的传输模式:块传输、中断传输、同步传输和控制传输,这样可以满足不同
45、外设的功能需求。7.6.2USB硬件接口USB发展至今,提供有如下接口:USBTypeA接口,USBTypeB接口,mini-usb接口,micro-usb接口,以及USBTypeC接口,如下图所示。(a)USBTypeA接口(b)USBTypeB接口(c)mini-usb接口(d)micro-usb接口(e)USBTypeC接口USB硬件接口类型7.6.2USB硬件接口一条USB传输线分别由地线、电源线、D+和D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(与CMOS的5V电平不同)。当数据线D+和D-的电压差大于200mV是表示输出为1,电压差小于200mV输出为0。而电
46、源线和地线可向设备提供5V电压,最大电流为500mA(可以在编程中设置)。使用USB电源的设备称为总线供电设备,而使用自己外部电源的设备叫做自供电设备。为了避免混淆,USB电缆中的线都用不同的颜色标记,如下表所示。USB设备可以直接和Host通信,或者通过Hub和Host通信。一个USB系统中仅有一个USB主机,设备包括USB功能设备和USBHub,最多可以级联127个USB设备,层次最多为7层。USB电缆线引脚7.6.3USB的典型连接USB系统就是外设通过一根USB电缆和PC连接起来。通常把外设称为USB设备,把其所连接的PC称为USB主机。一个USB系统中只能有一个主机。主机内设置了一个
47、根集线器,提供了外设在主机上的初始附着点。包括根集线器上的一个USB端口在内,在USB系统中,将指向USB主机的数据传输方向称为上行通信,把指向USB设备的数据传输方向称为下行通信。USB主机指的是包含USB主控制器,并且能够控制主机和USB设备之间完成数据传输的设备。从开发人员的角度看,USB主机可分为三个不同的功能模块:客户软件、USB系统软件和USB总线接口。7.6.3USB的典型连接(1)客户软件客户软件负责和USB设备的功能单元进行通信,以实现其特定功能。一般由开发人员自行开发。客户软件不能直接访问USB设备,其与USB设备功能单元的通信必须经过USB系统软件和USB总线接口模块才能
48、实现。客户软件一般包括USB设备驱动程序和界面应用程序两部分。USB设备驱动程序负责和USB系统软件进行通信。通常,它向USB总线驱动程序发出I/O请求包(IRP)以启动一次USB数据传输。此外,根据数据传输的方向,它还应提供一个数据缓冲区以存储这些数据。界面应用程序负责和USB设备驱动程序进行通信,以控制USB设备。它是最上层的软件,只能看到向USB设备发送的原始数据和从USB设备接收的最终数据。7.6.4USB通信协议包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。数据在USB总线上的传输以包为单位,包只能在帧内传输。高速USB总线的帧周期为125
49、us,全速以及低速USB总线的帧周期为1ms。帧的起始由一个特定的包(SOF包)表示,帧尾为EOF。EOF不是一个包,而是一种电平状态,EOF期间不允许有数据传输。USB数据包的基本格式如下图所示。USB数据包格式7.6.4USB硬件接口1、同步域(SYNC),八位,值固定为00000001,用于本地时钟与输入同步;2、标识域(PID),由四位标识符+四位标识符反码构成,表明包的类型和格式,这是一个很重要的部分,这里可以计算出,USB的标识码有16种。常见的PID主要包括令牌、数据、握手等类型组成。3、地址域(ADDR):七位地址,代表了设备在主机上的地址,地址0000000被命名为零地址,是
50、任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由此可以知道为什么一个USB主机只能接127个设备的原因。4、端点域(ENDP),四位,由此可知一个USB设备有的端点数量最大为16个。5、帧号域(FRAM),11位,每一个帧都有一个特定的帧号,帧号域最大容量0 x800,对于同步传输有重要意义(同步传输为四种传输类型之一)。6、数据域(DATA):长度为01023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度7、校验域(CRC):对令牌包和数据包中非PID域进行校验的一种方法。7.6.4USB硬件接口7.6.5USB通信中的事务处理USB协议分别提供I