I2C简介
- 这是一种用于数据交互的协议,广泛用于芯片,模组,及涉及到的诸多外设;
- 由两根线构成,一根数据,一根时钟,需要二者相互配合才行,具体的协议下面会介绍;
- 在具体配置的时候,可以由软件模拟,也可以由硬件直接设置;
- 具体代码的位置基本也在hal文件夹中,也是通过操作寄存器来实现的;
交互过程
I2C的通信是基于master(主机)和slave(从机)来进行的,其中从机不能主动发起请求,只能应答主机或不应答主机
- Master发起START
- Master发送I2C addr(7bit)和w操作0(1bit),等待ACK(发送控制指令)
- Slave发送ACK(完成第一次握手)
- Master发送reg addr(8bit),等待ACK(发送具体操作地址)
- Slave发送ACK(完成第二次握手)
- Master发送data(8bit),即要写入寄存器中的数据,等待ACK(发送数据)
- Slave发送ACK
- 第6步和第7步可以重复多次,即顺序写多个寄存器
- Master发起STOP
PS:
- 其中6.7步可以重复多次,多次发送数据,也可以没有,
- 一个例子,在之前的一次硬件实现I2C驱动硬件的过程中,具体使用的第一次握手位置为0x3c,即slave的寄存器地址,第二次握手使用的操作指令为0x40和0x00,分别代表传输数据和命令;
协议
代码相关
- 硬件方式实现
- 首先需要在电路板中确定I2C的实际管脚是哪个,可以查询芯片的管脚,一般是芯片直接接出来的;
- 在找到对应的位置后,在代码中找到对应的标识,通过extern等多种方式进行操作;
- 具体的操作方式还是要看hal文件夹里的内容,如果没有的话需要找更底层的寄存器操作函数,应该是位于regs文件夹下,如果没有就在附近找一找;
- 这里其实最大的问题就是如何将步骤匹配到相应的代码上,因为模型一般是有的,如果没有具体的使用实例可以参考,那就只能先多实践一下,此处在具体处理中便是将六个步骤找到了代码中具体的位置,然后找到了整体的初始化函数,再进行后续操作;
- 硬件实现的优点是稳定性和效率高(其实这个不是很好验证,只是直觉,但是应该是对的);劣势是需要硬件环境较为充裕;
- 需要注意的地方,
(1)对寄存器地址的查询,及后续函数在使用时候的格式是否正确;
(2)对I2C的连接的几步,在代码中具体体现位置的理解(这个其实才是经验体现的地方;
(3)在编译环境下可能有对相关端口进行设置的 地方,这个要格外注意,添加项目文件的时候要把target文件夹也包含进去,保证在搜索相关位置的时候能够充分了解到代码编译和最后生成bin文件的时候会对指定目标(例如相关I2C端口,GPIO接口)做了哪些处理;
(4)如果出现问题,要有较为直接的手段来判断问题的所在,一个是代码中的查BUG,一个是硬件环境下对电平变化的直接测试,需要用到示波器或协议测试仪等等
- 软件模拟实现
- 当设备的硬件已经被占用的情况下,不能实现硬件直接设置的I2C,需要软件的配合,一种方案是使用GPIO模拟;
- 首先需要选定一个GPIO接口,然后是使用该接口生成我们需要的波形,类似协议中描述的;
- 将该GPIO接口通过底层函数生成模仿I2C波形的电压参数,这里需要仔细看,有一定的简单算法来实现,而且具体到波形的话,此处软件模拟的一般都是比较平滑的,类似正弦波,但是硬件直接生成的就不同了,通常是直上直下的;
- 优点的话就是不占用实际的硬件接口,而且相对较为复杂的硬件环境,软件实现更加可控;
- 具体代码添加部分
(1)需要选定一个模拟的端口;
(2)需要在初始化的时候,通常是Init函数
网友评论