作单片机开发时UART,SPI和I2C都是咱们最常用到的硬件接口,我收集了相关的具体材料对这三种接口进行了详细的解释。编程
UART是一种通用串行数据总线,用于异步通讯。该总线双向通讯,能够实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通讯,如汽车音响与外接AP之间的通讯,与PC机通讯包括与监控调试器和其它器件,如EEPROM通讯。数组
将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。能够处理计算机与外部串行设备的同步管理问题。有一些比较高档的UART还提供输入输出数据的缓冲区,比较新的UART是16550,它能够在计算机须要处理数据前在其缓冲区内存储16字节数据,而一般的UART是8250。异步
在单片机中UART能够说是一种最基本的配置,不少与电脑进行通讯的设备都采用到它,按计算机最常规的说法就是串行通讯。模块化
两个设备间将TX与RX相连,RX与TX相连便可正常工做。最经常使用到的就是咱们电脑上的USB那就是个最典型的UART接口。函数
发送逻辑对从发送FIFO 读取的数据执行“并→串”转换。控制逻辑输出起始位在先的串行位流,而且根据控制寄存器中已编程的配置,后面紧跟着数据位(注意:最低位 LSB 先输出)、奇偶校验位和中止位。
在检测到一个有效的起始脉冲后,接收逻辑对接收到的位流执行“串→并”转换。此外还会对溢出错误、奇偶校验错误、帧错误和线停止(line-break)错误进行检测,并将检测到的状态附加到被写入接收FIFO 的数据中。oop
波特率除数(baud-rate divisor)是一个22 位数,它由16 位整数和6 位小数组成。波特率发生器使用这两个值组成的数字来决定位周期。经过带有小数波特率的除法器,在足够高的系统时钟速率下,UART 能够产生全部标准的波特率,而偏差很小。编码
发送时,数据被写入发送FIFO。若是UART 被使能,则会按照预先设置好的参数(波特率、数据位、中止位、校验位等)开始发送数据,一直到发送FIFO 中没有数据。一旦向发送FIFO 写数据(若是FIFO 未空),UART 的忙标志位BUSY 就有效,而且在发送数据期间一直保持有效。BUSY 位仅在发送FIFO 为空,且已从移位寄存器发送最后一个字符,包括中止位时才变无效。即 UART 再也不使能,它也能够指示忙状态。BUSY 位的相关库函数是UARTBusy( )
在UART 接收器空闲时,若是数据输入变成“低电平”,即接收到了起始位,则接收计数器开始运行,而且数据在Baud16 的第8 个周期被采样。若是Rx 在Baud16 的第8 周期仍然为低电平,则起始位有效,不然会被认为是错误的起始位并将其忽略。
若是起始位有效,则根据数据字符被编程的长度,在 Baud16 的每第 16 个周期(即一个位周期以后)对连续的数据位进行采样。若是奇偶校验模式使能,则还会检测奇偶校验位。
最后,若是Rx 为高电平,则有效的中止位被确认,不然发生帧错误。当接收到一个完整的字符时,将数据存放在接收FIFO 中。设计
出现如下状况时,可以使UART 产生中断:调试
因为全部中断事件在发送到中断控制器以前会一块儿进行“或运算”操做,因此任意时刻 UART 只能向中断产生一个中断请求。经过查询中断状态函数UARTIntStatus( ),软件能够在同一个中断服务函数里处理多个中断事件(多个并列的if 语句)。接口
FIFO 是“First-In First-Out”的缩写,意为“先进先出”,是一种常见的队列操做。 Stellaris 系列ARM 的UART 模块包含有2 个16 字节的FIFO:一个用于发送,另外一个用于接收。能够将两个FIFO 分别配置为以不一样深度触发中断。可供选择的配置包括:1/八、 1/四、1/二、3/4 和7/8 深度。例如,若是接收FIFO 选择1/4,则在UART 接收到4 个数据时产生接收中断。
发送FIFO的基本工做过程: 只要有数据填充到发送FIFO 里,就会当即启动发送过程。因为发送自己是个相对缓慢的过程,所以在发送的同时其它须要发送的数据还能够继续填充到发送 FIFO 里。当发送 FIFO 被填满时就不能再继续填充了,不然会形成数据丢失,此时只能等待。这个等待并不会好久,以9600 的波特率为例,等待出现一个空位的时间在1ms 上下。发送 FIFO 会按照填入数据的前后顺序把数据一个个发送出去,直到发送 FIFO 全空时为止。已发送完毕的数据会被自动清除,在发送FIFO 里同时会多出一个空位。
接收FIFO的基本工做过程: 当硬件逻辑接收到数据时,就会往接收FIFO 里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接收FIFO 里被自动删除的过程,所以在接收 FIFO 里同时会多出一个空位。若是在接收 FIFO 里的数据未被及时取走而形成接收FIFO 已满,则之后再接收到数据时因无空位能够填充而形成数据丢失。
收发FIFO 主要是为了解决UART 收发中断过于频繁而致使CPU 效率不高的问题而引入的。在进行 UART 通讯时,中断方式比轮询方式要简便且效率高。可是,若是没有收发 FIFO,则每收发一个数据都要中断处理一次,效率仍然不够高。若是有了收发FIFO,则能够在连续收发若干个数据(可多至14 个)后才产生一次中断而后一并处理,这就大大提升了收发效率。
彻底没必要要担忧FIFO 机制可能带来的数据丢失或得不到及时处理的问题,由于它已经帮你想到了收发过程当中存在的任何问题,只要在初始化配置UART 后,就能够放心收发了, FIFO 和中断例程会自动搞定一切。
UART 能够进入一个内部回环(Loopback)模式,用于诊断或调试。在回环模式下,从Tx 上发送的数据将被Rx 输入端接收。
在某些 Stellaris 系列 ARM 芯片里,UART 还包含一个 IrDA 串行红外(SIR)编码器/ 解码器模块。IrDA SIR 模块的做用是在异步UART数据流和半双工串行SIR 接口之间进行转换。片上不会执行任何模拟处理操做。SIR 模块的任务就是要给UART 提供一个数字编码输出和一个解码输入。UART 信号管脚能够和一个红外收发器链接以实现IrDA SIR物理层链接。
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只须要两根线便可在链接于总线上的器件之间传送信息。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。若是主机要发送数据给从器件,则主机首先寻址从器件,而后主动发送数据至从器件,最后由主机终止数据传送;若是主机要接收从器件的数据,首先由主器件寻址从器件.而后主机接收从器件发送的数据,最后由主机终止接收过程。在这种状况下.主机负责产生定时时钟和终止数据传送。
SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需经过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平,链接总线的外同器件都是CMOS器件,输出级也是开漏电路.在总线上消耗的电流很小,所以,总线上扩展的器件数量主要由电容负载来决定,由于每一个器件的总线接口都有必定的等效电容.而线路中电容会影响总线传输速度.当电容过大时,有可能形成传输错误.因此,其负载能力为400pF,所以能够估算出总线容许长度和所接器件数量。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。若是主机要发送数据给从器件,则主机首先寻址从器件,而后主动发送数据至从器件,最后由主机终止数据传送;若是主机要接收从器件的数据,首先由主器件寻址从器件.而后主机接收从器件发送的数据,最后由主机终止接收过程。在这种状况下.主机负责产生定时时钟和终止数据传送。
I2C总线特色能够归纳以下:
发送到SDA 线上的每一个字节必须为8 位,每次传输能够发送的字节数量不受限制。每一个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),若是从机要完成一些其余功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续。
数据传输必须带响应,相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间发送器释放SDA 线(高)。
在响应的时钟脉冲期间,接收器必须将SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。
一般被寻址的接收器在接收到的每一个字节后,除了用CBUS 地址开头的数据,必须产生一个响应。当从机不能响应从机地址时(例如它正在执行一些实时函数不能接收或发送),从机必须使数据线保持高电平,主机而后产生一个中止条件终止传输或者产生重复起始条件开始新的传输。
若是从机接收器响应了从机地址,可是在传输了一段时间后不能接收更多数据字节,主机必须再一次终止传输。这个状况用从机在第一个字节后没有产生响应来表示。从机使数据线保持高电平,主机产生一个中止或重复起始条件。
若是传输中有主机接收器,它必须经过在从机发出的最后一个字节时产生一个响应,向从机发送器通知数据结束。从机发送器必须释放数据线,容许主机产生一个中止或重复起始条件。
全部主机在SCL线上产生它们本身的时钟来传输I2C总线上的报文。数据只在时钟的高电平周期有效,所以须要一个肯定的时钟进行逐位仲裁。
时钟同步经过线与链接I2C 接口到SCL 线来执行。这就是说SCL 线的高到低切换会使器件开始数它们的低电平周期,并且一旦器件的时钟变低电平,它会使SCL 线保持这种状态直到到达时钟的高电平。可是若是另外一个时钟仍处于低电平周期,这个时钟的低到高切换不会改变SCL 线的状态。所以SCL 线被有最长低电平周期的器件保持低电平。此时低电平周期短的器件会进入高电平的等待状态。
当全部有关的器件数完了它们的低电平周期后,时钟线被释放并变成高电平。以后,器件时钟和SCL线的状态没有差异,并且全部器件会开始数它们的高电平周期。首先完成高电平周期的器件会再次将SCL线拉低。
这样产生的同步SCL 时钟的低电平周期由低电平时钟周期最长的器件决定,而高电平周期由高电平时钟周期最短的器件决定。
快速模式器件能够在400kbit/s 下接收和发送。最小要求是:它们能够和400kbit/s 传输同步,能够延长SCL 信号的低电平周期来减慢传输。快速模式器件都向下兼容,能够和标准模式器件在0~100kbit/s 的I2C 总线系统通信。可是,因为标准模式器件不向上兼容,因此不能在快速模式I2C 总线系统中工做。快速模式I2C 总线规范与标准模式相比有如下特征:
高速模式(Hs 模式)器件对I2C 总线的传输速度有巨大的突破。Hs 模式器件能够在高达3.4Mbit/s 的位速率下传输信息,并且保持彻底向下兼容快速模式或标准模式(F/S 模式)器件,它们能够在一个速度混合的总线系统中双向通信。
Hs 模式传输除了不执行仲裁和时钟同步外,与F/S 模式系统有相同的串行总线协议和数据格式。
高速模式下I2C 总线规范以下:
SPI接口的全称是"Serial Peripheral Interface",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器之间。
SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通讯,数据传输速度整体来讲比I2C总线要快,速度可达到几Mbps。
在点对点的通讯中,SPI接口不须要进行寻址操做,且为全双工通讯,显得简单高效。在多个从器件的系统中,每一个从器件须要独立的使能信号,硬件上比I2C系统要稍微复杂一些。
SPI接口在内部硬件其实是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。