搜索
bottom↓
回复: 3

如何配置硬件IIC

[复制链接]

出0入234汤圆

发表于 2022-3-18 11:44:17 | 显示全部楼层 |阅读模式
以下文章来源于:公众号:开源电子网,读取更多技术文章,请扫码关注
讨论发帖图.png


如何配置硬件IIC



       IIC英文全称:Inter Integrated Circuit,集成电路总线,是飞利浦公司在八十年代开发的一种串行、同步、半双工总线。

       IIC总线协议无非就是几样东西:起始信号、停止信号、应答信号、以及数据有效性。大家学习了正点原子的IIC实验,应该很了解IIC时序。正点原子使用的是软件模拟IIC,也就是用IO口模拟出IIC时序去通信。使用硬件IIC,就可以不用管时序信号,配置好之后就可以产生时序。虽说ST的硬件IIC很鸡肋,但是某些方面还是比软件模拟IIC稍微强一点。
关注公众号,回复“硬件IIC”免费获取项目文件

        下面列出一个硬件IIC和软件IIC的对比表

          1.png

        软件IIC整个流程很清晰,假如出了bug,你能很快找到问题,硬件IIC就需要动用DS100示波器去看波形,波形的查看教程可以参考以下推文

      《嵌入式工程师必备技能—如何使用示波器查看IIC波形》
         https://mp.weixin.qq.com/s/lnSORSbXeNJe-QVwW0EVbg

       其实很多时候是在管脚上考量使用软件IIC。硬件IIC虽然被听说吐槽过千百遍,但是有些人还是有兴趣想使用STM32的IIC外设的,那么本文就教一下大家使用硬件IIC,侧重于使用(这里使用的是F1 HAL库)。

       首先,先看HAL库给IIC定义好的结构体,这里主要讲解IIC初始化结构体

          2.png

       ClockSpeed:IIC的传输速率,主要看从机,从机AT24C02是最大为400kHz,低于400kHz即可。

       DutyCycle:SCL线时钟占空比,就是低电平与高电平的比值,没有严格限制,选择2:1或者16:9即可。

       OwnAddress1:STM32的IIC设备的自身地址,挂载在IIC总线上的器件每一个都有自己唯一地址,作为主机也不例外。特别注意:这里地址的设置不要跟从机一样即可。

       AddressingMode:地址的位数是使用7位还是10位,这要看从机了。对于AT24C02来说,直接使用7位。

       DualAddressMode:用来配置是否支持双设备地址,没有用到可以不配置。

       OwnAddress2:STM32的IIC设备的自身地址,是否有效取决于DualAddressMode成员的设置。

       GeneralCallMode:广播呼叫模式,作为从机时使用,通常用不上。

       NoStrethMode:时钟线延长,也是作为从机时使用的,通常用不上。

       在IIC实验例程中,编写hwiic_init如下:

          3.png

       这里是调用HAL_I2C_Init函数对IIC进行初始化,在IIC的初始化回调函数中就要使能I2C1时钟以及对相关引脚进行初始化,特别注意GPIO口的模式(复用开漏输出),这部分代码比较简单就不列出来了。

       初始化完成后,使用HAL库提供的IIC发送和接收函数,函数如下:

          4.png

        hi2c:IIC的句柄结构体地址。

        DevAddress:从机的设备地址,这里并不是通讯地址。

        MemAddress:要写入的地址。

        MemAddSize:地址的长度。

        pData:要写入的数据的地址。

        Size:写入数据的个数

        Timeout:函数执行的超时时间。

        以往的AT24C02的写操作函数和读操作函数,函数体内一堆代码,现在只是几行代码。

       at24c02写一字节函数代码如下:

          5.png

       at24c02读一字节函数代码如下:

          6.png

       假如说直接用HAL_I2C_Mem_Write来编写连续写函数,就有页写限制,也就是最多8字节,当你写入的数据大于8字节时,就会出现错误了。

       所以编写at24c02的连续写函数最好就是调用at24c02_write_one_byte这个函数接口。

       最终可以比对一下相同数据量的传输下,软件模拟IIC和硬件IIC的速度对比。

       硬件IIC的配置使用还是挺简单的,速度上面还是比模拟IIC快,假如说是驱动OLED屏幕的话,可以试用一下硬件IIC提高一下刷新率,得到更好的显示效果。

出0入4汤圆

发表于 2022-3-18 16:13:18 | 显示全部楼层
StrethMode 是为了适配主从机通信速率不同步使用的。一般是在通信主动方还没准备好的时候拉住SCL。被动接收方则释放SCL,等待SCL上升沿来到后取数据。

出675入8汤圆

发表于 2022-3-20 22:48:04 | 显示全部楼层
原子哥有没有基于标准库的硬件IIC配置

出0入0汤圆

发表于 2022-3-21 10:07:58 | 显示全部楼层
xml2028 发表于 2022-3-20 22:48
原子哥有没有基于标准库的硬件IIC配置
(引用自3楼)

ST官方的I2C DEMO,标准库

stsw-stm32020.zip

1.47 MB

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-7-2 03:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表