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

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

3天内不再提示

在一个I2C例程上面修改代码来实现24C02的读写

冬至配饺子 来源:TopSemic嵌入式 作者:TopSemic 2022-08-16 10:29 次阅读

1.24C02介绍

24C02 现在基本是开发板的标配,对于需要掉电存储的应用来说确是不二选择。现在单片机因为内部集成了Flash存储器,一般也都支持数据的掉电保存,但相对于 24C02 这种 EEPROM 来说,使用单片机内部的 Flash 有一些需要注意的问题:

a.Flash 写入数据之前需要先执行擦除操作,而且擦除以扇区为单位。

b.Flash读写次数比 EEPROM 少很多。

c.容易误操作,把 Flash 内部的代码擦除掉。

d.影响中断的响应时间。

24C02 有 256 字节的数据,一般说来也够用了。它的地址是可以通过引脚配置的,这样一条 I2C 总线上就可以挂多个 24C02。如下:

pYYBAGL7AACAYNEWAABapDi8x0k434.png

我们把 A2,A1,A0 都接地,这样地址为 A0。然后 SCL,SDA 脚接 MCU 的 PB8 和 PB9。需要注意 SCL,和 SDA 需要加上拉电阻

pYYBAGL7ABOAXgsKAABsue0eduU211.png

2.代码

下面我们在一个 I2C 例程上面修改代码来实现 24C02 的读写。大家可以看到使用库函数的好处,基本上不用看 STM32F030 的手册,很快就能实现我们想要实现的功能。我们用 Keil 打开下面这个工程:

STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\I2C\I2C_TwoBoards_ComPolling\MDK-ARM\Project.uvprojx

Step 1, 把 I2C 地址改为跟我们硬件一致:

poYBAGL7ACWAeH2nAABYV1lkpic757.png

Step 2, 根据实际使用的 I2C 模块和引脚进行配置:

pYYBAGL7ADaAKk4GAAEXOPV0b6w844.png

Step 3, 把地址模式改为 7BIT:

poYBAGL7AEeAVqI4AADGkqL7aVA486.png

Step 4, 操作EEPROM,我们不使用例子中的 HAL_I2C_Master_Transmit 和 HAL_I2C_Master_Receive,这两个函数适用于两个 I2C 器件之间进行数据传输。我们这里要用的是下面这两个函数:

poYBAGL7AG2AB_bwAAE9YeH73_Q187.pngpYYBAGL7AHSAAv2GAABpt6Ygca4396.png

在此我们写入数据用的 24C02 的 Page Write 命令,每次写入 8个字节的数据,然后存储器写入地址加 8。要注意每次执行完写入命令后,需要有一个延时,等待 EEPROM 内部处理完该指令后才能继续写入。这个延时要查手册,不同的厂家可能有不同的数值。读出时可以连续的读出数据,无需等待。

poYBAGL7AIWAVg14AABJTAEjObc118.png

下面是写入数据的波形,0xA0 是器件地址,0x28 是 24C02 内部存储器地址,之后是 8个字节数据。

poYBAGL7AJWAMaIcAABVbpfBu7A630.png

读出数据的波形:

poYBAGL7AKSASnwjAABVoDhhay0295.png

注意:

在使用硬件 I2C 操作时,有时候会遇到死锁问题。在此情况下,可以把 SCL,SDA 引脚初始化为 GPIO,如此例中的 PB8, PB9 然后连续翻转 SCL 引脚送出 9 个时钟脉冲,既可以使 I2C 从死锁的状态复位。然后再重新初始化 I2C 模块,进入正常 I2C 操作。



审核编辑:刘清

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

    关注

    9

    文章

    928

    浏览量

    80329
  • Flash存储器
    +关注

    关注

    3

    文章

    104

    浏览量

    25513
  • GPIO
    +关注

    关注

    16

    文章

    1135

    浏览量

    50578
  • STM32F030
    +关注

    关注

    1

    文章

    33

    浏览量

    6465
收藏 人收藏

    评论

    相关推荐

    24C02读写操作程序(C语言)

    =P1^7;//狗uchar x24c02_read(uchar address);//从24c02的地址address中读取一个字节数据void x24c02_write(uchar
    发表于 04-22 09:02

    24c02

    24c02程序,要求将数据存入24c02,然后读出,送P2口,用led显示,在网上试了好多,都不能用。。。。
    发表于 11-26 15:24

    【问题汇总】关于STM32的I2C问题

    ,复位后即正常,有可能是什么原因?问:I2C1总线上挂有24C02(Addr:0xA0)和另一个I2C总线器件(Addr:0xAC),上
    发表于 03-14 09:45

    关于stm32 野火开发板I2C的问题

    正在学习野火的STM32板子,I2C部分自己写的代码,读取24c02的时候会死应答中,代码如下while (
    发表于 03-15 14:00

    请教24c02的数据读写问题,谢谢大家了

    我想通过24c02,led1602实现按K1键写数(数的大小要求0到9999,这个程序是自己基于之前能正常
    发表于 03-03 22:43

    AT24C02存储器读写测试程序

    本帖最后由 chenxuyang1991 于 2012-9-6 14:24 编辑本程序利用Ginkgo I2C适配器底层接口函数对AT24C02存储器进行读写控制,程序将写入的数据显示
    发表于 10-23 11:52

    求F0系列的24c02I2C读写程序

    跪求STM32 F0系列的24c02I2C读写程序,谢谢了。希望有朋友能帮帮我,在此谢过了。
    发表于 01-10 09:02

    请问24C02是16Byte缓冲的吗?

    众所周知,I2C EEPROM可以按字节访问,也可以按页访问。24C02般缓冲区是8Byte,24C04以上的大容量ROM缓冲区有16/32Byte等。那么,有人用过
    发表于 09-16 23:41

    分享嵌入式linux读写24c02i2c程序

    这里分享嵌入式linux读写24c02i2c程序ioctl函数的使用:原型:struct ioctl(struct file *fil
    发表于 11-04 07:53

    怎样去解决I2C多字节读取24C02只读出第一个正确数的问题

    今天用51单片机驱动AT24C02I2C是用I/O口模拟的,出现了问题:I2C多字节读取24C02
    发表于 12-08 06:29

    如何解决AT24C02数据读取问题的

    出现错误。通过查找网上的各种资料,发现这个问题很多小伙伴都有遇到,但是楼下的评论不是说时序有问题就是说函数有问题,却没有具体的指出来到底哪里有问题。下面我就以我的I2C驱动24C02为例来说说我
    发表于 01-12 07:08

    24C02芯片的相关资料分享

    202007每月练 的板子上还有24C02芯片没有写教程,今天介绍24C02这个芯片的
    发表于 01-21 11:51

    MindSDK下的I2C读写24c02测试学习资料分享

    1、MindSDK下的I2C读写24c02测试学习  * 硬件电路  开发板上I2C硬件电路  使用PC6和PC7端口的I2C1接口  原作
    发表于 09-02 15:47

    测试I2C程序出现24C64不可以正常读写是何原因?如何解决?

    你好,测试I2C程序出现,24C02可以正常读写,但24C64却不可以。阅读代码,咨询下问题,
    发表于 04-17 17:03

    24c02读写程序(已通过测试),24C02 read / write process

    24c02读写程序(已通过测试),24C02 read / write process 关键字:24c02读写
    的头像 发表于 09-20 19:41 2278次阅读