STM32HAL库学习笔记--硬件I2C读写AT24C512
摘要:由于需要实现掉电存储功能,在无线传输模块上增加了一块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相关推荐
- STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ.写在前面 上一篇文章是"STM32F10x_模拟I2C读写EEPROM",讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要 ...
- STM32 HAL库学习笔记4-SPI
STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...
- STM32F407霸天虎HAL库学习笔记——使用ADC采集MQ135的数据并通过OLED显示
STM32F407霸天虎HAL库学习笔记--使用ADC采集MQ135的数据并通过OLED显示 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil MQ135.c MQ135.h main函 ...
- python xlwings 切片_Python xlwings库学习笔记(1)
Python xlwings库学习笔记(1) Python是最近几年很火的编程语言,被办公自动化的宣传吸引入坑,办公自动化必然绕不开Excel的操作,能操作Excel的库有很多,例如: xlrd xl ...
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
- STM32学习笔记:FLASH读写之二
因为关于STM32的Flash相关的知识点比较多,所以该内容的学习我们分为以下4个部分 1.RAM和ROM的一些基本概念 -- STM32学习笔记:FLASH读写之一 2.STM32的Flash寄存器 ...
- STM32F407霸天虎HAL库学习笔记——串口发送
STM32F407霸天虎HAL库学习笔记--串口收发 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 main函数 五.实验效果 一.软件准备 软件准备 二.硬件准备 ...
- STM32 HAL库学习笔记2 HAL库介绍
STM32 HAL库学习笔记2 HAL库介绍 CMSIS标准 一.再次认识HAL库 HAL库设计思想 HAL库实现方式 以GPIO模块为例 GPIO外设数据类型 GPIO外设接口函数 二.使用HAL库 ...
- python标准库学习笔记
原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...
最新文章
- contentProvider的使用总结
- 2018 年值得关注的 Web 设计趋势
- java中分支_[Java教程]JavaScript中的分支结构
- x学校计算机及网络维护方案,校园计算机网络常见故障的处理与维护
- vs2017编译QT with ssl
- 使用 vue 一套功能 UI 全面 的 后台管理系统
- 客户和顾客是一个意思吗_履约保证金和投标保证金是一个意思吗?
- [渝粤教育] 中国地质大学 职业健康管理体系 复习题
- 自定义简单控件之标题控件
- 如何检测VC运行库是否安装
- 若依框架使用总结说明
- linux 命令打印,Linux终端打印命令使用介绍
- Halcon教程八:简单的语法介绍
- Vs2010激活 系统延长期限
- 安全公司发现雄迈数字摄像机的主控口令“已泄露”
- hdu 1862 EXCEL排序
- oracle IF_Oracle实时同步大数据平台解决方案
- Neo4j-Cypher
- 教你如何查看Ubuntu版本
- Openpyxl操作Excel教程
热门文章
- 笔记本蓝牙突然消失了
- linux内存不足宕机,记一次linux机器内存占用太多导致的服务宕机
- 恢复你的IE-对某些网站恶意修改的恢复方法
- [学习笔记·翻译稿] Video Based Face Recognition by Using Discriminatively Learned Convex Models
- JAVA珠宝首饰进销存管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
- 8-LTE EMM and ECM States
- 江苏电子税务局黑科技1
- java calendar 天_Java Calendar getTime()用法及代码示例
- 【PR】一键删除所有间隙
- python的核心数据类型_UC头条:python的核心数据类型有哪些?