0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32的硬件I2C设计有BUG

GReq_mcu168 来源:硬件攻城狮 作者:硬件攻城狮 2022-04-26 15:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

坊间一直流传着一个传说~STM32的硬件I2C设计有BUG,最好不要用,用软件I2C比较靠谱。长久以来,为了不必要的麻烦,我也一直没有用过硬件I2C,主要是软件I2C也比较方便,基本上任意端口都可以用。

最近画了块板子,正好用到了I2C,就顺便来测试一下硬件I2C是不是真的像有些人说的不好用。

测试硬件:STM32F407VET6+AT24C64测试软件:STM32CubeMX v6.1.1HAL库:STM32CubeF4 Firmware Package V1.25.2

STM32CubeMX配置 使用STM32CubeMX配置很方便,时钟等基础配置不再详细介绍,直接看I2C配置如下:

c3060f02-c3b9-11ec-bce3-dac502259ad0.png

这里的速度模式选择为标准模式,时钟为100K。要求高的可以选择Fast模式,400K时钟。 配置完成后生成代码。

编写代码 代码生成后,直接调用读写数据的函数即可: HAL_I2C_Mem_Read HAL_I2C_Mem_Write 函数参数可参考代码注释。 24CXX系列的EEPROM进行写操作时需要注意,跨页写入时,要有一定的延时,否则会写入不成功。不同容量的页大小也不一样。 另外,24C16以下容量的地址为8位,24C32以上容量的地址为16位,在调用读写函数时需要注意,选择I2C_MEMADD_SIZE_8BIT或者I2C_MEMADD_SIZE_16BIT。测试使用的是24C64,所以选择I2C_MEMADD_SIZE_16BIT。 为了方便操作,将读写函数再封装一层,将跨页写入的各种情况都考虑到,实现任意地址连续写入。程序如下:

#include “at24c64.h”#include “i2c.h”

#define AT24CXX_ADDR_READ

0xA1#define AT24CXX_ADDR_WRITE

0xA0#define PAGE_SIZE

32/** * @brief

AT24C64任意地址连续读多个字节数据 * @param

addr —— 读数据的地址(0-65535) * @param

dat —— 存放读出数据的地址 * @retval

成功 —— HAL_OK*/uint8_t At24cxx_Read_Amount_Byte(uint16_t addr, uint8_t* recv_buf, uint16_t size){

return HAL_I2C_Mem_Read(&hi2c2, AT24CXX_ADDR_READ, addr, I2C_MEMADD_SIZE_16BIT, recv_buf, size, 0xFFFFFFFF);}

/** * @brief

AT24C64任意地址连续写多个字节数据 * @param

addr —— 写数据的地址(0-65535) * @param

dat —— 存放写入数据的地址 * @retval

成功 —— HAL_OK*/uint8_t At24cxx_Write_Amount_Byte(uint16_t addr, uint8_t* dat, uint16_t size){

uint8_t i = 0; uint16_t cnt = 0;

//写入字节计数

/* 对于起始地址,有两种情况,分别判断 */

if(0 == addr % PAGE_SIZE )

{

/* 起始地址刚好是页开始地址 */

/* 对于写入的字节数,有两种情况,分别判断 */

if(size 《= PAGE_SIZE)

{

//写入的字节数不大于一页,直接写入

return HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, dat, size, 0xFFFFFFFF);

}

else

{

//写入的字节数大于一页,先将整页循环写入

for(i = 0;i 《 size/PAGE_SIZE; i++)

{

HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, &dat[cnt], PAGE_SIZE, 0xFFFFFFFF);

HAL_Delay(3);

addr += PAGE_SIZE;

cnt += PAGE_SIZE;

}

//将剩余的字节写入

return HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, &dat[cnt], size - cnt, 0xFFFFFFFF);

}

}

else

{

/* 起始地址偏离页开始地址 */

/* 对于写入的字节数,有两种情况,分别判断 */

if(size 《= (PAGE_SIZE - addr%PAGE_SIZE))

{

/* 在该页可以写完 */

return HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, dat, size, 0xFFFFFFFF);

}

else

{

/* 该页写不完 */

//先将该页写完

cnt += PAGE_SIZE - addr%PAGE_SIZE;

HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, dat, cnt, 0xFFFFFFFF);

addr += cnt;

HAL_Delay(3);

//循环写整页数据

for(i = 0;i 《 (size - cnt)/PAGE_SIZE; i++)

{

HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, &dat[cnt], PAGE_SIZE, 0xFFFFFFFF);

HAL_Delay(3);

addr += PAGE_SIZE;

cnt += PAGE_SIZE;

}

//将剩下的字节写入

return HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, &dat[cnt], size - cnt, 0xFFFFFFFF);

}

}}

测试结果经过测试硬件I2C读写EEPROM正常。没有发现所谓的BUG,当然这只是M4内核的针对EEPROM一种器件的测试,对于其它内核(M3等)和其它I2C器件,还有待验证。

总结硬件I2C使用起来比较简单,不需要自己去调节时序,但是只能使用固定的几个引脚。软件模拟I2C可以使用任意引脚,针对不同的MCU,移植起来比较方便,但对于不同频率的MCU,时序调节比较麻烦。

两者各有其优缺点,需要根据实际需求去选择。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2313

    文章

    11191

    浏览量

    374598
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1562

    浏览量

    131725
  • 函数
    +关注

    关注

    3

    文章

    4421

    浏览量

    67826

原文标题:STM32的硬件I2C有BUG吗?

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RK平台I2C开发:从硬件原理到实战排查

    在嵌入式开发中,I2C 总线是连接外设的 “桥梁”—— 小到传感器、EEPROM,大到 LCD 驱动器、音频芯片,都离不开它的控制。而瑞芯微(Rockchip)系列芯片作为主流嵌入式方案,其 I2C 控制器的开发是很多工程师的必备技能。
    的头像 发表于 02-05 13:42 2386次阅读
    RK平台<b class='flag-5'>I2C</b>开发:从<b class='flag-5'>硬件</b>原理到实战排查

    I2C 为什么只要两根线就能搞定通信?

    到目前为止,我们已经讨论了SPI通信和UART通信的基础知识,现在让我们讨论本系列的最后一个协议,即集成电路间协议(I2C)。如果您曾经构建过使用OLED显示器、气压传感器或陀螺仪/加速度计模块
    的头像 发表于 01-04 09:14 2041次阅读
    <b class='flag-5'>I2C</b> 为什么只要两根线就能搞定通信?

    基于FPGA的I2C控制模块设计

    I2C_WRITE_WDATA.v模块实现I2C写时序,I2C_Controller (I2C控制器)例化了I2C_WRITE_WDATA.
    的头像 发表于 12-26 09:48 5931次阅读
    基于FPGA的<b class='flag-5'>I2C</b>控制模块设计

    AS32X601的I2C模块操作EEPROM详解

    国科安芯推出的AS32X601系列MCU芯片内置的I2C模块提供了符合工业标准的两线串行制接口,可用于MCU和外部I2C设备的通讯。I2C总线使用两条串行线:串行数据线SDA和串行时钟线SCL
    的头像 发表于 12-21 21:39 1580次阅读
    AS32X601的<b class='flag-5'>I2C</b>模块操作EEPROM详解

    CW32的I2C是否好用?照比ST的来说?

    最初STM32F103的硬件I2C是有bug的,容易出现超时等待,那么请问,CW32的I2C有没有类似于
    发表于 12-04 06:02

    I2C死锁的问题

    在实际使用过程中,I2C比较容易出现的一个问题就是死锁 ,死锁在I2C中主要表现为:I2C死锁时表现为SCL为高,SDA一直为低。 在I2C主设备进行读写操作的过程中,主设备在开始信
    发表于 12-04 06:00

    深入剖析I2C协议

    I2C是由Philips开发的简单的双向两线总线,在深入浅出理解SPI协议中,我们区分了单工,半双工,全双工协议数据流向的区别,根据特征,I2C协议属于半双工协议(即同一时刻,数据单向流动)。此外
    的头像 发表于 08-21 15:10 3877次阅读
    深入剖析<b class='flag-5'>I2C</b>协议

    STM32有哪些MCU能支持I2C HS模式和同时支持I3C 的吗?

    如题,想请问下STM32有哪些产品,能支持I2C HS模式,速率3.4Mbit/s。同时又支持I3C的(SDR12.5M),现在有个外设 分别支持I2C HS slave,
    发表于 08-04 06:06

    第十八章 I2C通信测试

    本章介绍了I2C协议,其物理层用SDA和SCL双线,支持多设备:协议层含起始/停止信号、应答机制等。还讲解W55MH32的I2C外设及初始化,并进行了通信测试代码的分析。
    的头像 发表于 06-19 17:07 1463次阅读
    第十八章 <b class='flag-5'>I2C</b>通信测试

    STM32H7CubeMX配置硬件I2C,读写失败是什么问题呀?

    STM32H7CubeMX配置硬件I2C,读写失败什么问题呀,同样的操作F4和F1都能正常使用,应该不存在i2c地址错误,操作都是一样的,但H7就是用不了。
    发表于 06-12 06:21

    SPC574s如何使用SPC5Studio自带的I2C库实现I2C通信?

    SPC574s并没有硬件I2C外设,可以使用SPC5Studio自带的SW I2C库来实现,但是由于SPC5Studio软件资料太少,I2C一直没有数据,各位有相关的资料吗?
    发表于 06-09 06:22

    SPC574s如何使用SPC5Studio自带的I2C库实现I2C通信?

    SPC574s并没有硬件I2C外设,可以使用SPC5Studio自带的SW I2C库来实现,但是由于SPC5Studio软件资料太少,I2C一直没有数据,各位有相关的资料吗?
    发表于 06-05 08:17

    SPC574s如何使用SPC5Studio自带的I2C库实现I2C通信?

    SPC574s并没有硬件I2C外设,可以使用SPC5Studio自带的SW I2C库来实现,但是由于SPC5Studio软件资料太少,I2C一直没有数据,各位有相关的资料吗?
    发表于 05-14 07:10

    简单了解I2C接口

    在电子电路的复杂世界里,各种电路模块设备需要相互通信才能协同工作 ,I2C接口就像是电路模块设备间的沟通桥梁,今天就带大家深入了解它。
    的头像 发表于 05-08 14:15 2812次阅读
    简单了解<b class='flag-5'>I2C</b>接口

    基于RT-Thread的I2C(软件) 实践 | 技术集结

    一、软硬件介绍(一)I2C(软件)I2C是一种广泛应用于嵌入式系统中的短距离串行通信协议,支持多主多从设备模式,主机通过时钟信号SCL和数据线SDA与从机进行数据交互。在RT-Thread操作系统中
    的头像 发表于 05-06 18:44 1214次阅读
    基于RT-Thread的<b class='flag-5'>I2C</b>(软件) 实践 | 技术集结