LcdTools如何编写初始化代码之--IIC指令

首先查看LcdTools帮助文档或者博客文章LcdTools指令集 - XKphone--15002088355 - 博客园 (cnblogs.com)中了解IIC通信指令的详细描述和应用例子。

 

在了解IIC指令应用之前我们先回顾一下IIC通信协议的构成:

IIC由时钟线(SCL)和数据线(SDA)两根线构成通信线路,接口类型为开漏(或开集)输出,需要上拉电阻,总线空闲状态 IIC总线总线的SDA和SCL两条信号线同时处于高电平。IIC是一种主从结构(Master/Slave)总线,总线上每个设备都可以作为主机或从机,主设备通常是CPU,用来产生传输的时钟信号,并初始化总线的数据传输,而从设备只能被动响应主机请求。

因为一个IIC总线可以接多个从设备,这就需要主机通过地址来确定与哪个从机进行通信。IIC总线上的每个从设备都有一个唯一的7bit物理识别地址。因为IIC地址全0表示广播地址,所以一个IIC总线理论最多能挂载2^7 - 1=127个从设备。

IIC总线上传送的每一个位数据都由一个同步时钟脉冲相对应,即在SCL时钟线的配合下,数据线SDA通过MSB的方式串行传送每一位数据,IIC每次收发一个字节响应一个应答信号。
起始信号/从机地址/读写位/应答/数据/应答/…/应答/停止信号

(1)起始位/停止位
IIC总线空闲时,由上拉电阻拉成高电平状态,当主机要开始一次I2C通信,就发送一个START(起始S)信号告诉所有的从机,准备开始通信,当要结束一个I2C通信时,则发送一个STOP(停止P)信号告诉从机。

起始信号:当SCL保持高电平,SDA产生下降沿
停止信号:当SCL保持高电平,SDA产生上升沿

(2)读写地址
主机在发送START信号后,必须接着发送从机的物理地址。因为IIC是可实现半双工通信,所以主机对从机必须具有读和写的功能。

在7bit的物理地址后面,接着1bit的读写标识,0表示写操作,1表示读操作。

(3)应答信号
主机往IIC总线传输地址后,所有从机接收到次地址与自己的地址进行比较,若相同则发出一个ACK应答信号,主机收到这个应答信号表示通讯连接建立成功,主机若没收到应答信号则表示寻址失败。

SCL一直由Master控制,在发送数据的时候,SDA发送端控制的,发送完8位数据后,发送方释放SDA线,就变成了接收端控制SDA线。

应答位(ACK):表示继续,当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=0;
否应答位(NACK):表示不希望继续,当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=1。

(4)数据位收发
主机收到从机应答后,开始向对应的从机发送数据,SDA数据线上的每个字节8位,每个字节发送完成后,从机必须回一个应答信号,一次完整的通信传输的字节数量没有限制。

数据传输采用MSB的方式,数据位传输必须在SCL高电平之间,SDA高电平表示发送1,SDA低电平表示发送0。在数据位传输过程种,SDA的数据位在SCL高电平时刻要保持稳定不变,不然就变成了起始信号或停止信号了。

(5)数据读写操作

a) 主机向从机写入N个字节

 b) 主机从从机读出N个字节

 c) 混合读写

1、IIC写指令I2cWrite()

<从机地址> 从设备地址,7bit模式,读写位PG自动补齐,比如设备7bit地址为0x30,实际发送时PG自动补最低位写(bit[0] 0),则实发设备地址为0x60。

<子地址> 子地址为16位数,低8位为一级子地址,高8位为二级子地址,当需要发两个子地址时,高8位子地址先发;对于IIC写操作,子地址只是便于标识,从发送过程来讲,和其他发送数据一样,可以当作数据发送,没有区别。

<子地址模式> 如果需要使用子地址,则需要设置子地址模式,用“SUBADDR0”、“SUBADDR1”、“SUBADDR2”来标识无子地址、一个字节子地址、两个字节子地址,如果不需要使用子地址,用“SUBADDR0”标识,则<子地址>数据会被忽略。

<参数...> 子地址模式数据后面跟随的就是需要写的数据,每个数据8位,数据个数最大支持256个。

举例说明:

a) 往设备0x30(7bit addr)无子地址模式发送N个参数

I2cWrite (0x30,0x00, SUBADDR0, 0xa0,0x03,0x55,.....);

b) 往设备0x30(7bit addr)子地址0x50中写N个数

I2cWrite (0x30,0x50, SUBADDR1, 0xa0,0x03,0x55,.....);

实际等效于:I2cWrite (0x30,0x00, SUBADDR0, 0x50,0xa0,0x03,0x55,.....);

c) 往设备0x30(7bit addr)子地址0xF050中写N个数

I2cWrite (0x30,0xF050, SUBADDR2, 0xa0,0x03,0x55,.....);

等效于:I2cWrite (0x30,0x00, SUBADDR0, 0xF0,0x50,0xa0,0x03,0x55,.....);

2、IIC读指令I2cRead()

<从机地址> 从设备地址,7bit模式,读写位PG自动补齐,比如设备7bit地址为0x30,实际发送时PG自动补最低位写(bit[0] 0),则实发设备地址为0x60。

<子地址> 子地址为16位数,低8位为一级子地址,高8位为二级子地址,当需要发两个子地址时,高8位子地址先发;如果读取操作需要发送子地址,则在发送完子地址后IIC自动Repeat Start,再启动读取,参考上面的 混合读写。

<子地址模式> 如果需要使用子地址,则需要设置子地址模式,用“SUBADDR0”、“SUBADDR1”、“SUBADDR2”来标识无子地址、一个字节子地址、两个字节子地址,超过2个子地址写则用“SUBADDRN”来标识;如果不需要使用子地址,用“SUBADDR0”标识,则<子地址>数据会被忽略。当使用超过两个子地址模式时,<子地址>参数会被忽略,把需要发送的多个子地址放到<子地址模式>之后当数据发送出去。

<读取个数> 指令参数中,最后一个参数用于表示读取数据个数。

举例说明:

a) 从设备0x30(7bit addr)无子地址模式读取2个参数

I2cRead(0x30,0x00, SUBADDR0, 2);

b) 从设备0x30(7bit addr)子地址0x50中读取2个数

I2cRead(0x30,0x50, SUBADDR1, 2);

c) 从设备0x30(7bit addr)子地址0xF050中读取2个数

I2cRead (0x30,0xF050, SUBADDR2, 2);

d) 从设备0x30(7bit addr)先发送0x50 0xfe 0x3f 0x02 0x12 0x00 0x08后,再读取5个参数

I2cRead (0x30,0x00, SUBADDRN, 0x50,0xfe,0x3f,0x02,0x12,0x00,0x08, 5);

下面举实例演示LcdTools怎么写初始化代码:

1。给出的设备地址位8bit模式(注意:如果给出的设备地址大于0x7f,那就是8bit地址)

先把8bit sla地址转成7bit模式,0xB8右移一位为0x5C,用LcdTools实现上述代码如下图

 

posted @ 2022-11-25 19:55  XKphone--15002088355  阅读(382)  评论(0编辑  收藏  举报