spi与i2c总线有什么区别

spi与i2c总线有什么区别,第1张

  什么是SPI

  SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议,比如AT91RM9200。

  SPI协议概括

  SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。

  (1)SDI – SerialData In,串行数据输入;

  (2)SDO – SerialDataOut,串行数据输出;

  (3)SCLK – Serial Clock,时钟信号,由主设备产生;

  (4)CS – 从设备使能信号,由主设备控制。

  什么是I2C总线

  I2C--INTER-IC串行总线的缩写,是PHILIPS公司推出的芯片间串行传输总线。它以1根串行数据线(SDA)和1根串行时钟线(SCL)实 现了双工的同步数据传输。具有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点。在主从通信中,可以有多个I2C总线器件同时接到I2C总线 上,通过地址来识别通信对象。

  I2C 接口的协议里面包括设备地址信息,可以同一总线上连接多个从设备,通过应答来互通数据及命令。但是传输速率有限,标准模式下可达到100Kbps,快速模式下可达到400Kbps(我们开发板一般在130Kbps),高速模式下达到4Mbps,不能实现全双工,不适合传输很多的数据。

  I2C总线是一个真正的多主机总线,总线上多个主机初始化传输,可以通过传输检测和仲裁来防止数据被破坏 。

  下来详细了解I2C总线时序:

  1.1 总线数据有效性

  I2C总线是单工,因此同一时刻数据只有一个流向,因此采样有效时钟也是单一的,是在SCL时钟的高电平采样数据。

  I2C总线上SDA数据在SCL时钟低电平是可以发生变化,但是在时钟高电平时必须稳定,以便主从设备根据时钟采样数据,如下图:

  spi与i2c总线有什么区别,spi与i2c总线有什么区别,第2张

  1.2 总线空闲条件

  I2C总线上设备都释放总线(发出传输停止)后,I2C总线根据上拉电阻变成高电平,SDA SCL都是高电平。

  1.3 总线数据传输起始和结束条件

  I2C总线SCL高电平时SDA出现由高到低的跳变,标志总线上数据传输的开始条件

  I2C总线SCL高电平时SDA出现由低到高的跳变,标志总线上数据传输的结束条件

  spi与i2c总线有什么区别,spi与i2c总线有什么区别,第3张

  1.4 总线数据传输顺序以及ACK应答

  I2C总线上数据传输室MSB在前,LSB在后,从示波器上看,从左向右依次读出数据即可

  I2C总线传输的数据不收限制,但是每次发到SDA上的必须是8位,并且主机发送8位后释放总线,从机收到数据后必须拉低SDA一个时钟,回应ACK表示数据接收成功,我们如果示波器上看到的波形就是每次9位数据,8bit+1bit ack。如下:

  spi与i2c总线有什么区别,spi与i2c总线有什么区别,第4张

  从机收到一字节数据后,如果需要一些时间处理,则会拉低SCL,让传输进入等待状态,处理完成,释放SCL,继续传输,如下:

  spi与i2c总线有什么区别,spi与i2c总线有什么区别,第5张

  1.5 总线读写时序

  数据的传输在起始条件之后,发送一个7位的从机地址,紧接着第8位是数据方向(R/ W),0-表示发送数据(写),1-表示接收数据(读)。数据传输一般由主机产生的停止位(P)终止。但是如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr),和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中,可能有不同的读/写格式结合。

  I2C总线主设备读写从设备,一般都是与从设备的寄存器打交道,这个可以通过阅读从设备的datasheet获取。总线写时序如下:

  master start + master addr|w + slave ack + master reg|w + slave ack + master data + slave ack + master restart。。master data + slave nack + master stop

  总线读时序如下:

  master start + master addr|w + slave ack + master reg|w + slave ack + master restart + master addr|r + slave ack + slave data + master nack + master stop

  总线读时序与写的不同之处在于读需要2次传输才能完成一次读取,首先要写寄存器地址到从设备,其实是写到了从设备的控制寄存器或者命令寄存器,从设备内部会根据这个地址来寻址所要 *** 作的寄存器。

  我在读我们的bios和内核时发现,2者在总线读时序上的实现不太一样,在于第一次寄存器地址写入后,一个发的是restart,一个发的是stop,然后再start开始读取数据,示波器抓波形发现读取数据都正确,说明这2种时序都是正确的。

  I2C总线的读写时序比较固定,设备通信严格遵循协议,因此I2C总线设备驱动程序的编写也就相对简单一些。

  主要应用的I2C总线设备有touchscreen rtc 外扩io等

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2492119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-04
下一篇 2022-08-04

发表评论

登录后才能评论

评论列表(0条)

保存