串行是嵌入式过程中最常用的通信方式,除之前的I/O接口串行以外,还有I2C即串行总线。在嵌入式中,这种方式主要用于板级之间的硬件通信,即通信的成员基本都在板子内,而非作为工业总线。
同步半双工总线,
同步:有时钟线
半双工:能实现接收与发送,但同一时间内只能接收或发送。这种双引脚的方式,非常有利于节省资源。I2C通信过程中,并不是时钟线的某一点对应采样,今天主要就是介绍通信过程中的情况。
I2C在通信过程中主要是一主多从形式,也存在多主多从。
当两根总线都处于高电平,则通信的设备都处于空闲状态。所以两个通信总线都有上拉电阻,保证上电之初所有设备处于空闲状态。
I2C在嵌入式开发过程中非常常用,温湿度传感器、触摸屏等都可以挂在同一总线
传输协议:
起始:SCL高电平,SDA下降沿,
校验:
引入概念:握手
应答与非应答方式,
应答:主设备在I2C通信过程中占统治地位,所以可以使主设备发送数据,从设备应答,每发送完一帧都要进入空闲状态,即“主动释放”,以便进行应答,而非应答方式的通信则不需要拉低信号线。
非应答:从设备在硬件有问题或者不在线时,会产生非应答信号,从而主设备可以停止发送信号,另外,从向主发期间,主设备可以主动产生非应答信号,从而结束本次通信。
结束:SCL高电平,SDA上升沿
通信过程:
1.主设备产生下降沿,开始通信;
2.寻找通信目标的通信从设备:发送7位的从设备地址,加一位数据的传输方向(最低位0代表主向从发,1代表从向主发),
3.校验
4.结束信号
通信过程中,在时钟线的低电平进行数据线的电平变换,以避免通信期间出现结束信号,时钟线高电平期间锁存。
串行通信过程中,有两种数据构成:
LSB:低位在前
MSB:高位在前
I2C是采用高位在前的方式构成数据,所以发送数据时要从高位开始发送。即每一个数据的读取要与0x80然后向左移位
设备号(设备地址):
设备内地址:给出首地址或者从默认0地址开始存储后,每一个数据储存之后都会进行指针自走。
存储设备E2PROM/EEPROM:
存储分支:
刚有计算机模型时,尚未有集成电路,使用纸带进行存储,纸带打孔之后不能再改,称为只读存储器,即ROM
PROM可改的
EPROM可擦写的,开窗单片机,用光特性进行擦除
E2PROM可擦写,利用电特性进行擦写,例如一卡通里面的卡芯片都是使用E2PROM存储量小,造价高
ROM系列的存储皆是掉电不丢失,
随着半导体器件出现,有了可以改写的RAM随机性存储设备(读、写)
SRAM:静态随机性存储器,其实就是半导体硬件,写入数据后只要还上电,就一直不变,造价高
DRAM:动态随机性存储器,以电容的方式存储数据位,不能一直保持有效,需要定时刷新,即充电
SDRAM
DDR:最新的,目前台式机常用的内存
RAM存储掉电丢失,所以一般制作内存。
以上统称NORflash
块设备,都会有坏块和物理磨损,存储设备一般称为块设备,擦除过程以块为单位进行操作。
此外,还有NANflash,有坏块管理,稍微复杂一些。
端序:
多字节的数据类型存在端序概念,比如int型,32位存储,类似于高位在前和低位在前,不过是把字节之间进行排序,高位在低地址,叫做大端序,高位在高地址,叫做小端序,即看起来跟通常情况下相似,即为大端序。
端序问题一般在跨平台时产生,比如ARM一般是小端序,Interl一般大端序。
我们的机器上,片内有一个flash和一个SRAM
片外有一个SPIflash、一个SDRAM
底板上还有一个E2PROM
写:
起始
+控制字节(7位设备号+1位传输方向0)+应答(1位)
+从设备内地址(8位)+应答
+数据(8位)+应答(1位)
+数据+应答
。
。
。
。
结束信号
读:
起始
+控制字节(7位设备号+1位传输方向0)+应答(1位)
+从设备内地址(8位)+应答
(对同一个设备调整方向时,此时可以省略结束位)
+起始位
+控制字节(7位设备号+1位传输方向1)+应答
+从设备发送数据(8位)+主设备应答
+从设备发送数据+主设备应答
。
。
。
+主设备发送非应答信号
+结束信号
利用I2C实现芯片和E2PROM通信,
所需资源:
1. 设备号:1010000即0x50,所以握手时发送的是10100000即0xA0,若接收则发送0xA1
2. 怎么读:
3. 怎么写:
管脚:I2C1