嵌入式软件开发学习笔记
-常用总线通信协议部分-
1.SPI协议
Motorola SPI协议是一个4线、全双工的串口协议。根据串口时钟的相位和极性的不同,有4种组合。在主设备处于不使能或者空闲的状态下,主设备输出的从设备选择信号保持高电平。
时钟相位参数决定数据传输是在从设备使能信号的下降沿开始还是在串口时钟的第一个变化沿开始。
时钟极性参数决定串口时钟在无效的状态下是高电平还是低电平。
在使用Motorola SPI协议进行传输之前,主设备和从设备必须配置相同的时钟相位参数和时钟极性参数。
4线分别是
SDI - 主设备数据输出,从设备数据输入
SDO - 主设备数据输入,从设备数据输出
SCK - 时钟信号线,用于通讯同步,由主设备给出,最高通信速率为所挂载总线速率的一半。
CS/SS - 片选信号线,用于选择通讯的从设备。
2.I2C协议
I2C是2线串行接口,一条是数据线SDA,一条是时钟线SCL。可以工作在标准模式、快速模式和高速模式下,高速模式和快速模式向下兼容。
一条I2C总线上可以存在多个主从设备,每次通讯结束后,主设备都可以成为从设备。
1)传输开始信号和结束信号
当I2C总线空闲时,SDA和SCL均为高电平。当主设备准备进行数据传输时,SCL保持高电平,SDA实现高电平到低电平的跳转。当主设备决定结束数据传输时,SCL保持高电平,SDA实现低电平到高电平的跳转。
2)Slave寻址
I2C协议包括两种地址格式,7bit格式和10bit格式。格式如下图:
3)数据传输
数据的发送以字节为单位,对于字节数没有限制。在Master发送地址和读写控制位或者数据之后,Slave、必须发送ACK,否则Master会发出结束标志中止此次数据传输。
如果Master接收数据,会在其接收到一个字节数据之后,发出ACK。若没有发送ACK,Master以这种方式通知Slave此字节位最后一个字节。而Slave会释放SDA使得Master可以发送结束标志。
4)多Master总线仲裁和时钟同步
时钟同步:
当多个设备工作在I2C总线上时,SCL线从高到低会引起主机开始计算它的低电平周期,一旦主机时钟变低,它会保持SCL线处于这种状态直到时钟到达高电平。然而如果另一个主机的时钟依旧是低电平,则前一个主机的时钟从低到高的变化并不会引起SCL的变化。SCL拉低的时间由最长的低电平周期决定,短些的低电平周期主机会进入HIGH wait-state。
当所有主机的低电平周期都结束了,时钟线才回到高电平。这时主机始终和SCL状态一致。
总线仲裁:
只有当I2C总线空闲时,主机才可以开始一个传输。两个主机可能在开始条件规定的最小保持时间内产生一个开始条件,结果总线上产生一个有效的开始条件。这个时候就需要仲裁来决定哪个主机来完成它的传输,仲裁是在建立在总线具有线“与”逻辑的原理下才可以进行的。
仲裁处理是逐个bit进行的。在每个bit,当SCL为高时,每个主机都会check一下来看看SDA的电平是否和它发送的电平吻合。只要传输是同一的,那么两个主机都可以无误的完成完整的传输。当一个主机试着发送高的,但是检测SDA为低,那么这个主机知道自己失去仲裁然后关掉自己的SDA输出,另外的主机就会去完成它的传输。
在仲裁处理过程中没有信息丢失,失去仲裁的主机在它失去仲裁的字节末尾处产生时间脉冲,当总线空闲时必须重启它的传输。
如果一个主机包括从机的功能,当它在寻址阶段丢失仲裁,呢么赢得仲裁的主机可能会寻址它,丢失仲裁的主机必须立即切换到它的从模式。