GD 32 IIC通信协议

前言:


...


通信方式

通信方式分为串行通信和并行通信。常见的串口就是串行通信的方式

常用的串行通信接口

常用的串行通信方式有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 驱动代码


 


.............


后记:

.............

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值