前言:
...
通信方式
通信方式分为串行通信和并行通信。常见的串口就是串行通信的方式
常用的串行通信接口
常用的串行通信方式有USART,IIC,USB,CAN总线
同步与异步
同步通信:IIC是同步通信,有两个线一个是时钟信号线,一个数数据信号线,不需要约定特定的通信频率。
异步通信:约定一个特定的频率,根据这个频率接收和解析数据,对时序的要求比较严格。
单工和双工
IIC总线设计成开漏输出,可以解决电路短路问题
与运算
通0与结果是0,同1与结果是1
为什么使用开漏输出,以下是使用开漏输出的原理,开漏输出配合上拉电阻,解决短路问题
线与的概念
IIC 数据格式
主机向从机写数据
起始位和停止位:主机发送的,来控制数据什么时候开始什么时候结束
接下来是从机地址和写控制位,前7位置是地址后面一位控制是写数据还是读数据 写如数据将控制位设置为 ‘0’表示写数据
发送数据之后就是从机应答位,需要从机给一个反馈信号,主机发送数据需要从机给一个应答,从机返回数据需要主机给一个应答
主机向从机读数据
首先是起始位:然后是从机的地址和 + 读控制位(设置为 “1” 表示主机向从机读数据)
从机接收到信号之后给主机一个应答,然后是从机返回的实际数据,主机接收到一个数据之后给一个
主机的应答,在主机接收完最后一个数据之后会跟着一个非应答位,然后是停止位
主机先发送再接收
从机地址
高7位表示从机的地址,低一位表示从机的方向为,是用于控制方向的,1表示主机向从机读数据
0 表示主机向从机写数据。
数据的地址高7位中的前面4位是固定在芯片的内部的是没法改变的,低3位是可以改变的(可以通过硬件电路去配置)。
3 个地址线支持在一个总线上挂载8个设备也就是2的三次方
IIC 总线的实现
IIC 通信协议中SCL线是主机控制输出的,SDA信号线是主机和从机都可以控制输出,IIC总线空闲时SDA 和 SCL 都是处于高电平的状态,数据是按照字节的方式进行传输的
IIC 电器协议
IIC起始信号
IIC 停止信号
IIC 主机发送数据格式
SCL 在高电平的时候数据不能有变化,这和时候从机读取数据
IIC 主机读取返回的数据
从机在SCL低电平的时候将数据放到SDA线上,在主机把SCL线变为高电平的时候,从机不能改变SDA上的数据,这个时候主机获取SDA上的数据。
注:在主机接收数据之前要在主机这一侧器释放SDA也就是将IO口释放为高电平
IIC 接收应答
IIC 发送应答 0 表示应答,1表示接收应答
存储器协议
存储器的分类
存储器的分类一种是易失性存储器RAM这是一种掉电丢失存储器,一种是非易失性存储器ROM
EEPROM 电可擦除可编程存储器
FLASH 存储器
FLASH,相比较EEPROM,擦除时不再以字节为单位,而是以块为单位,一次简化了电路,数据密度更高,降低了成本。上M的ROM一般都是Flash,如GD25Q16,有2M个字节;
FLASH分为NOR FLASH 和 NAND FLASH:
NOR FLASH,芯片内部的数据线和地址线分开,可以实现 RAM一样的随机寻址功能,可以读取任何一个字节。但是擦除仍要按块来擦。如GD25Q16;
NAND FLASH,同样是按块擦除,但是数据线和地址线复用,不能利用地址线随机寻址。读取只能按页来读取。(NANDFLASH 按块来擦除,按页来读,NOR FLASH 没有页)。如W29N01HVSINA;NAND FLASH 引脚上复用,因此读取速度比NOR FLASH慢一点,但是擦除和写入速度比NOR FLASH快很多;
NAND FLASH内部电路更简单,因此数据密度大,体积小,成本也低。因此大容量的FLASH都是 NAND型 的。小容量的2~12M 的 FLASH多是NOR型的;
使用寿命上,NAND FLASH的擦除次数是NOR的数倍。而且NANDFLASH可以标记坏块,从而使软件跳过坏块。
NORFLASH一旦损坏便无法再用:在使用中:因为 NOR FLASH可以进行字节寻址,所以程序可以在NOR FLASH中运行。
24C02 写数据
单个字节写
1:先发送一个起始信号
2:发送24C02的地址和写控制位
3:24C02 返回应答信号
4:主机发送数据的地址(24C02)有256个字节的空间可以写入数据,每个字节有对应地址的空间,地址的范围是0-256个,需要告诉24C02我们需要向那个地址写入数据
5:24C02 返回一个应答
6:写入数据
7:应答
8:结束
连续写
24C02 这款芯片有32页,每一页可以写8个字节256 / 8 = 32,0 - 255
0 是第一页的起始地址,8是第二页的起始地址,16是第三页的起始地址
如果从0开始只能写8个字节,如果从1开始只能写7个字节
如果数据超过一页,不做特殊处理,到达页边界的地址时后面的数据会到页首的地址
页面的首部数据会被覆盖。
24C02 读数据
单字节读
主机发送一个起始信号给从机,然后发送一个从机的地址和写控制位,“相当于是告诉从机我要找谁”这个时候从机发送一个ACK相应位,告诉主机“我收到了”,然后主机在发送一个字节的地址,和从机说我要写的是哪一部分的内存,从机ACK回应主机收到,然后再来一个起始为,地址和控制位设置读,从机ACK回应,然后主机读内存地址中的数据,不回应ACK,停止位 = 读数据结束。
多字节连续读
在24C02内部有一个地址计数器,对于这种数据格式,只要给一个起始地址24C02就会将这个地址后面的数据一页一页的返回回来。
IIC 信号实现
IIC起始信号实现
IIC 的起始信号,刚开始SCL和SDA都是高电平,表示初始的状态,信号开始时:先将SDA(数据线)电平设置为低电平,然后将SCL(时钟线设置为低电平)。注:两者的先后顺序要严格按照时序图的要求,否则后面会导致程序出现错误,然后延时5ms左右,然后在每一个环节的最后都将SCL设置为低电平(停止信号除外),这样做的目的是为了兼顾后面的信号(然后面的发送和接收能够同步起来)。
信号之间间隔协议的时间顺序,具体查考24C02的数据手册,手册上的建议是0.4us时间是非常快的,我们在此处采用的是4us已经足够
IIC 停止信号实现
首先将SDA设置为低电平然后延时4us,然后将SCL设置为高电平延时4us,然后将SDA设置为高 电平。
主机给从机发送字节
发送字节:SCL低电平期间,主机将数据位依次放到SDA线上,然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。
主机读取从机字节
读取字节:SCL低电平期间,从机将数据位依次放到SDA线上,然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)。
注:主机在接收数据之前需要将SDA数据线上的数据释放,不然接收到数据就是 0
按位左移和按位右移
注意:左移就是左边移出去多少位,右边就补充
几个0,
右移就是右边移出去多少位,左边就补充几个0
左移演示:1110 0101 << 1
= 11 00 1010
接收应答
做一个程序反馈,防止程序出现错误卡在这个位置,这是保证程序的健壮性和可靠性,加上异常的处理。
主机发送应答
SCL在前面的时序当中已经是低电平的状态,这个时候SDA应答的话设置为0,然后延时4us,然后将SCL设置为高电平,延时4us,这个时候再将SDA设置为高电平释放SDA(一定要设置)。
IIC 驱动代码
.............
后记:
.............