摘要:由于需要实现掉电存储功能,在无线传输模块上增加了一块EEPROM芯片,因为工程使用CubeMx配置并生成,为了方便不再使用IO口模拟I2C,而是使用f1自带的硬件I2C来实现。配置和调试过程和遇到一些问题,在此记录如下。

MCU 储存芯片 CubeMx版本
STM32F103C8T6 AT24C512 5.0.1

关键词:硬件I2C,HAL库,EEPROM存取

一、CubeMx配置

开启I2C1,其余参数默认

在旧版本的CubeMx中,HAL库实现的I2C初始化带有一些BUG,比如需要在I2C引脚复用GPIO配置前加上I2C的时钟使能,不过这些BUG在新版本的CubeMx中似乎得到了解决,直接使用其生成的初始化程序和HAL库的I2C接口就可以实现成功的读写操作

二、读AT24C512DataSheet

AT24Cxx系列芯片内存大小各异,页数和每页字节数也不同,要根据数据手册来确定该型号芯片的内存结构(Memory Organization)

由DS可知AT24C512的内存一共有 512 Pages x 128 Bytes = 65536 Bytes = 512 kbits,同时地址是16位数据字,范围是0x0000~0xFFFF

和同系列其他芯片一样,器件地址为8位,前5位固定,最低位为读/写标志,第二、三位为总线地址。电路中A0、A1引脚接地,故读、写的器件地址分别为0xA1,0xA0

三、调用HAL库接口实现读写

HAL库将I2C操作封装后提供了直接操作EEPROM的接口:

//EEPORM写函数
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
//EEPORM读函数
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

参数表

参数 类型 含义
hi2c I2C_HandleTypeDef * HAL库I2C结构体指针
DevAddress uint16_t 器件地址
MemAddress uint16_t 内存地址
MemAddSize uint16_t 内存地址大小(8或16)
pData uint8_t * 缓冲区头指针
Size uint16_t 缓冲区大小
Timeout uint32_t 超时时间

返回值

HAL_OK 成功
HAL_TIMEOUT 等待超时
HAL_BUSY 总线繁忙
HAL_ERROR 其他错误

读写的实现

#define ADDR_AT24C02_Write 0xA0
#define ADDR_AT24C02_Read 0xA1int16_t AT24C512_Write_nBytes(uint8_t *data, uint16_t addr, uint16_t length)
{if( HAL_I2C_Mem_Write( &hi2c1, ADDR_AT24C02_Write, addr, I2C_MEMADD_SIZE_16BIT, data, length, 1000 ) == HAL_OK )return 0;elsereturn -1;
}int16_t AT24C512_Read_nBytes(uint8_t *data, uint16_t addr, uint16_t length)
{if( HAL_I2C_Mem_Read( &hi2c1, ADDR_AT24C02_Write, addr, I2C_MEMADD_SIZE_16BIT, data, length, 1000 ) == HAL_OK )return 0;elsereturn -1;
}

连续读写测试

void E2PROMTestTask(void const * argument)
{uint8_t write_buff[18] = "read & write test";uint8_t read_buff[18] = {0};AT24C512_Write_nBytes( &write_buff[0], 0, 10 );HAL_Delay( 10 ); //这里的延时是必要的AT24C512_Write_nBytes( &write_buff[10], 10, 8 );HAL_Delay( 10 );AT24C512_Read_nBytes( read_buff, 0, 18 );printf( "%s\r\n", read_buff );uint8_t long_write_buff[256];uint8_t long_read_buff[256] = {0};for( size_t i = 0; i < 256; ++i ){long_write_buff[i] = i;}//写入有页限制AT24C512_Write_nBytes( &long_write_buff[0], 0, 128 );HAL_Delay( 10 );AT24C512_Write_nBytes( &long_write_buff[128], 128, 128 );HAL_Delay( 10 );//读出没有页限制AT24C512_Read_nBytes( long_read_buff, 0, 256 );for( size_t i = 0; i < 256; ++i ){printf("0x%02X  ",long_read_buff[i]);}}

四、需要注意的问题

1. 写操作结束后,MCU会向EEPROM发送一个停止位,在发出下一个起始位之前,EEPORM芯片会进入写周期(internally-timed write cycle),这段时间内不能进行任何输入,所以在两个写操作或写操作与读操作之间需要有一个保证wirte cycle的延时,一般5~10ms即可

2. 调用HAL库自带的HAL_I2C_Mem_Write函数时,需要注意一次写入的字节数不能大于EEPROM芯片的页字节数,否则会回滚覆盖低位地址的数据

STM32HAL库学习笔记--硬件I2C读写AT24C512相关推荐

  1. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)

    Ⅰ.写在前面 上一篇文章是"STM32F10x_模拟I2C读写EEPROM",讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要 ...

  2. STM32 HAL库学习笔记4-SPI

    STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...

  3. STM32F407霸天虎HAL库学习笔记——使用ADC采集MQ135的数据并通过OLED显示

    STM32F407霸天虎HAL库学习笔记--使用ADC采集MQ135的数据并通过OLED显示 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil MQ135.c MQ135.h main函 ...

  4. python xlwings 切片_Python xlwings库学习笔记(1)

    Python xlwings库学习笔记(1) Python是最近几年很火的编程语言,被办公自动化的宣传吸引入坑,办公自动化必然绕不开Excel的操作,能操作Excel的库有很多,例如: xlrd xl ...

  5. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  6. STM32学习笔记:FLASH读写之二

    因为关于STM32的Flash相关的知识点比较多,所以该内容的学习我们分为以下4个部分 1.RAM和ROM的一些基本概念 -- STM32学习笔记:FLASH读写之一 2.STM32的Flash寄存器 ...

  7. STM32F407霸天虎HAL库学习笔记——串口发送

    STM32F407霸天虎HAL库学习笔记--串口收发 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 main函数 五.实验效果 一.软件准备 软件准备 二.硬件准备 ...

  8. STM32 HAL库学习笔记2 HAL库介绍

    STM32 HAL库学习笔记2 HAL库介绍 CMSIS标准 一.再次认识HAL库 HAL库设计思想 HAL库实现方式 以GPIO模块为例 GPIO外设数据类型 GPIO外设接口函数 二.使用HAL库 ...

  9. python标准库学习笔记

    原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...

最新文章

  1. contentProvider的使用总结
  2. 2018 年值得关注的 Web 设计趋势
  3. java中分支_[Java教程]JavaScript中的分支结构
  4. x学校计算机及网络维护方案,校园计算机网络常见故障的处理与维护
  5. vs2017编译QT with ssl
  6. 使用 vue 一套功能 UI 全面 的 后台管理系统
  7. 客户和顾客是一个意思吗_履约保证金和投标保证金是一个意思吗?
  8. [渝粤教育] 中国地质大学 职业健康管理体系 复习题
  9. 自定义简单控件之标题控件
  10. 如何检测VC运行库是否安装
  11. 若依框架使用总结说明
  12. linux 命令打印,Linux终端打印命令使用介绍
  13. Halcon教程八:简单的语法介绍
  14. Vs2010激活 系统延长期限
  15. 安全公司发现雄迈数字摄像机的主控口令“已泄露”
  16. hdu 1862 EXCEL排序
  17. oracle IF_Oracle实时同步大数据平台解决方案
  18. Neo4j-Cypher
  19. 教你如何查看Ubuntu版本
  20. Openpyxl操作Excel教程

热门文章

  1. 笔记本蓝牙突然消失了
  2. linux内存不足宕机,记一次linux机器内存占用太多导致的服务宕机
  3. 恢复你的IE-对某些网站恶意修改的恢复方法
  4. [学习笔记·翻译稿] Video Based Face Recognition by Using Discriminatively Learned Convex Models
  5. JAVA珠宝首饰进销存管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  6. 8-LTE EMM and ECM States
  7. 江苏电子税务局黑科技1
  8. java calendar 天_Java Calendar getTime()用法及代码示例
  9. 【PR】一键删除所有间隙
  10. python的核心数据类型_UC头条:python的核心数据类型有哪些?