STM32F10x _硬件I2C读写EEPROM(标准外设库版本)

发布者:qinghong最新更新时间:2023-07-21 来源: elecfans关键字:STM32F10x  硬件I2C  读写EEPROM  标准外设库版本 手机看文章 扫描二维码
随时随地手机看文章

本文主要内容:STM32硬件I2C详细配置、EEPROM(AT24Xxx)多字节读写操作、ST官方I2C存在问题。


实例实验效果:

1、多字节读写:任意地址(66), 写入任意长度(129)、读取并打印出来

2、单字节读写:任意地址(0),写入1字节数据、 读取并打印出来


实验说明:

1.多字节读写

实验为什么是从66地址写? 为什么是写入129字节?

答案:验证对EEPROM多字节“非标准地址、长度”读写的准确性。

我是使用AT24C128芯片,页大小是64字节,我从66地址,就是验证非标准地址(如:0、64、128等)开始读写; 写入长度129字节也是验证非标准长度(如:64、128、256等)的读写。

2.单字节读写

我这样实验的目的,相信大家都能理解。验证每一次写入字节数据 和读出的数据是都一致。

关于本文的更多详情请往下看。

Ⅱ、实例工程下载

笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。

笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。

提供下载的软件工程是基于Keil(MDK-ARM) V5版本、STM32F103ZE芯片,但F1其他型号也适用(适用F1其他型号: 关注微信,回复“修改型号”)。

STM32F10x_硬件I2C读写EEPROM(标准外设库版本)实例源代码工程:

http://yunpan.cn/c6b8d4mCTPpCj访问密码 a371

STM32F107VC_硬件I2C读写EEPROM(标准外设库版本)实例源代码工程:

http://yunpan.cn/c6b8HGnAGG4Mf访问密码 2a18

I2C EEPROM(AT24xx)资料:

https://yunpan.cn/c667rIDPgvwTf访问密码 1099

STM32F1资料:

https://yunpan.cn/crBUdUGdYKam2访问密码 ca90

Ⅲ、硬件I2C配置

硬件I2C的配置其实很简单,RCC时钟、GPIO、I2C配置等。笔者以F1标准外设库(同时也建议初学者使用官方的标准外设库)为基础建立的工程,主要以库的方式来讲述(若您的F1芯片与提供工程不一样,可微信回复“修改型号”)。

1.RCC时钟源


该函数位于bsp.c文件下面;

RCC是很多初学者,甚至已经工作的朋友容易遗漏的地方,有很多朋友觉得它使用的外设不正常,很大部分是没有配置RCC导致的。

重点注意:

A.外设RCC时钟的配置要在其外设初始化的前面;

B.匹配对应时钟。

比如:RCC_APB2外设不要配置在RCC_APB1时钟里面

【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);这样能编译通过,但这是错误的代码】

2.I2C引脚配置


该函数位于i2c_ee.c文件下面;

1.使用硬件I2C:GPIO_Mode_AF_OD复用开漏模式

2.由于使用硬件I2C,不像使用模拟I2C使用IO操作,所以这里引脚定义的比较“死”GPIO_Pin_6 | GPIO_Pin_7。

如果你使用I2C2或者引脚映射,这里的引脚也要跟着改变。

3.I2C配置


该函数位于i2c_ee.c文件下面;

这个函数才是本文的重点:

1.I2C模式:I2C_Mode = I2C_Mode_I2C;

硬件有多种模式:

I2C_Mode_I2C: I2C模式

I2C_Mode_SMBusDevice: SMBus设备(丛机)模式

I2C_Mode_SMBusHost: 主机模式

2.I2C占空比:I2C_DutyCycle = I2C_DutyCycle_2;

这个参数在快速I2C模式下有效,也就是速度大于100KHz。

I2C_DutyCycle_2:2比1占空比

I2C_DutyCycle_16_9:16比9占空比

感兴趣的朋友可以把时钟配置高于100KHz(如:400KHz),用示波器测一下SCL引脚,可以看得出来占空比不一样。

3.I2C设备地址:I2C_OwnAddress1 = EEPROM_DEV_ADDR;

这个参数是第一个设备(从机)的地址,EEPROM_DEV_ADDR是我们自己宏定义的设备地址。

4.I2C应答:I2C_Ack = I2C_Ack_Enable;

这个参数的含义请结合上一篇文章“I2C协议”来理解。

5.地址位数:I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

这个参数就是设备地址位数,需要和后面函数“I2C_Send7bitAddress”一致。

6.I2C速度:I2C_ClockSpeed = I2C_SPEED;

这个参数很好理解,I2C_SPEED是我们宏定义的值“100000”,也就是100KHz的意思。

Ⅳ、硬件I2C读写EEPROM配置

上一篇文章简单提及了一下EEPROM单字节的读写,提供了多字节读写实例,但没有具体描述多字节的具体操作。

下面将详细描述一下单字节读写和多字节读写的操作。请下载“I2C EEPROM资料”和“实例工程”作为参考。

在对EEPROM(AT24Cxx)读写操作之前需要理解两个参数(可见源代码i2c_ee.h文件):

A.“数据字”地址长度:也就是存数据的地址有多少位。具体分类(见数据手册)如下:

8位: AT24C01、AT24C02

16位: AT24C04、AT24C08、AT24C16、AT24C32、AT24C64、AT24C128、AT24C256、AT24C512

B.页长度:在进行连续写的时候,最长可写一页,写完这一页之后需要指定下一页地址才行,否则会在上一页循环写。具体分类(见数据手册)如下:

8字节: AT24C01、AT24C02

16字节: AT24C04、AT24C08、AT24C16

32字节: AT24C32、AT24C64

64字节: AT24C128、AT24C256

128字节: AT24C512

1.单字节写

时序图:


截图来自“AT24C128C数据手册”,单字节写主要分5个步骤:

1.开始

2.设备地址/写

3.数据地址

4.写一字节数据

5.停止

源程序:


在操作硬件I2之前需要检测I2C是否处于“忙”状态。数据地址根据长度不同而写入的不同。

2.单字节读(随机)

时序图:


截图来自“AT24C128C数据手册”,单字节读(也是随机读)主要分7个步骤:

1.开始

2.设备地址/写

3.数据地址

4.重新开始

5.设备地址/读

6.读一字节数据

7.停止

源程序:


这里就提醒一点,单字节读和多字节读的应答位,由于不连续读,这里产生非应答。

3.页写

时序图:


截图来自“AT24C128C数据手册”,页写和单字节写的区别在于“连续写”。

注意:这里页写的意思是在指向地址的页写数据,也就是EEPROM内部“地址指针”指向的地址所在页。每次写之前我们都要将“地址指针”指向一个地址(见下面源程序),写的过程中,一旦写到最后一个字节,将会回到该页首地址继续写下去,因此,写完该页,我们需要重新将“地址指针”指向下一页首地址。

【芯片页的大小根据芯片不同而不同,见本章开头描述】

源程序:


写最后一字节独立出来是有原因的:防止HardFault_Handler。

4.多字节写

源程序:


“多字节写”是基于“页写”的基础上写的,从上面页写的描述(写到该页最后一字节会回到该页首地址)可以知道多字节写是要考虑很多情况的,否则会破坏其他数据。

上面源程序截取了简单的一部分:开始写的地址刚好位于该页首地址这种情况。在页首地址开始写数据情况下,要判断需要写的数据的大小是否有多页。

【上面这种情况是比较简单的一种,还有其他情况,我不在这里讲述,希望初学的你多去理解一下,这也是参考ST官方的思路,而且有利于你们编程的思想】

5.多字节读

时序图:


截图来自“AT24C128C数据手册”,多字节读需要注意应答。

在多字节读到最后一位数据之前,必须产生应答位,而最后一位产生非应答位。请结合下面源程序理解。

源程序:


和单字节读比:前面第1步到第5步都是一样的,重点请看第6步,这里产生的应答需要注意。

Ⅴ、ST官方I2C读写问题

说到ST的I2C这个问题,网上有很多人说也存在严重的I2C问题,我个人倒不觉得存在太大问题(或许是我研究的还不够)。

我从开始至今,使用ST芯片I2C也做过几个项目(控制EEPROM、时钟芯片、温度传感器、触摸芯片),项目中也使用多个中断,我至今还没有发现它的问题。我只知道ST提供的标准外设库例程有些地方不严谨或不规范,我也从没使用ST官方的例程(当然,我自己写的例程很多思路是参考ST的)。

我个人观点:有问题比不可怕,可怕的是不知道如何去解决问题。由于我没有真正的发现I2C硬件真实存在的问题,可以参考一下官方提到是资料,可以下载(第二节)我整理的STM32F1资料 “STM32F10xxCDE勘误手册V14(英文)2015-11”查看。

1.官方标准外设库例程介绍

标准库例程关于I2C读写EEPROM0的例程很多都一样或类似(F1、F2、F4等),感兴趣的可以下载查看。但是,都存在不规范的地方。

2.标准库I2C例程介绍

我大概说一下这个标准库I2C例程中读写相关函数吧。

位置位于STM32F10x_StdPeriph_Lib_V3.5.0UtilitiesSTM32_EVALCommon:

stm32_eval_i2c_ee.c

A.sEE_ReadBuffer读函数

A1.同样注释,不同语句,写地址之后的标志处理;(见265行处)


这个地方其实是处理一下标志位,我也测试过,使用两种语句都可以通过的。只是提出来以下是,我个人举得更应该使用“I2C_EVENT_MASTER_BYTE_TRANSMITTED”(在我的例程中也是使用这个)。

A2.读数据之前,发送停止条件;(见316行处)


这个地方经过我反复测试,没有测试通过(也就是在读之前发送停止条件)。 我个人觉得这是程序上的一个BUG.

B.sEE_WriteBuffer写函数

写页函数暂时还没有发现什么问题,但在综合的写函数(多字节写)中发现了一个问题(如下图),这个地方的count永远都不可能等于0,而这里加了一个判断条件。


关键字:STM32F10x  硬件I2C  读写EEPROM  标准外设库版本 引用地址:STM32F10x _硬件I2C读写EEPROM(标准外设库版本)

上一篇:STM32F0xx_ DMA收发USART数据配置详细过程
下一篇:STM32F10x_硬件I2C主从通信 (轮询发送,中断接收)

推荐阅读最新更新时间:2024-11-11 10:14

STM32F10x系列的MCU配置PB3和PB4为普通IO口
对于初学习者来说为什么用到PB3和PB4时无法控制输出呢? 下面就这一问题进行分析讲解。 首先,STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些 端口设置为普通I/O口。具体方法如下: 在GPIO_Configuration(); // 配置使用的 GPIO 口: 注意:不要忘记在RCC_Configuration()中开启AFIO时钟, //AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SW
[单片机]
STM32F10x_硬件I2C读写EEPROM(标准外设版本)
Ⅰ、写在前面 上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程。 上一篇文章主要内容:I2C协议、模拟I2C底层驱动、EEPROM(AT24Xxx)单字节读写操作。 本文主要内容:STM32硬件I2C详细配置、EEPROM(AT24Xxx)多字节读写操作、ST官方I2C存在问题。 实例实验效果: 1、多字节读写:任意地址(66), 写入任意长度(129)、读取并打印出来 2、单字节读写:任意地址(0),写入1字节数据、 读取并打印出来 实验说明: 1.多字节读写 实验为什么是从66地址写? 为什么
[单片机]
STM32F10x_<font color='red'>硬件</font><font color='red'>I2C</font><font color='red'>读写</font><font color='red'>EEPROM</font>(<font color='red'>标准</font><font color='red'>外设</font><font color='red'>库</font><font color='red'>版本</font>)
STM32F10x 学习笔记10(基本定时器)
大容量的STM32F101xx、STM32F103xx系列和互联型产品中包含了两个基本定时器,TIM6和TIM7。这两个定时器功能非常简单,基本上和SysTick 定时器相当。 但是我在使用的时候确是费了一番周折才调试通过,所以还是应该将这两个定时器的使用方法好好的写一写。 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。简单的说两个定时器是从0计数到N(由自动装载计数器来确定N的具体值),然后复位回0 重新计数。每次复位到0 的时候可以产生对应的中断信号,或者产生DMA 请求,还可以触发DAC 同步电路。不过这次笔记不讨论触发DAC 的问题,等写到DAC 的使用时在讲解如何用这两定时器驱动
[单片机]
<font color='red'>STM32F10x</font> 学习笔记10(基本定时器)
STM8L052C6硬件I2C调试:PCF8563/BM856时钟芯片
网上基本都提倡用软件模拟I2C,之前读温湿度传感器也是用模拟的。这次有时间和机会再次用上I2C,固决定用硬件I2C调试下,目前看来没有问题,读写设备都正常。 一、注意事项 1、I2C硬件上需要外部上拉,单纯软件上拉不行。 2、如连续读个字节如8563的second~years数据共7 bytes,中间需要delay。否则只能成功读取前两个byte, clock会断掉。具体delay时间没有确切的验证,用如下实例代码测试OK。 3、查看是否有time定时中断,读写过程最好先关中断。 二、工程下载 https://download.csdn.net/download/xqw19891201/11267260
[单片机]
STM32中FSMC与硬件I2C冲突
ST官网勘误表中列到,FSMC与I2C不能同时开启。解决的办法可以有 1:将I2C映射到PB9,PB8. 2:使用模拟的I2C. I/O重映射步骤:(以串口为例) 1.打开重映射时钟和USART重映射后的I/O口引脚时钟, RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RC C_APB2Periph_AFIO,ENABLE); 2.I/O口重映射开启. GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); 3.配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置.(映射的引脚是固定的,查手册可得) GPIO_InitStruct
[单片机]
STM32F10x 学习笔记7(独立看门狗IWDG 模块)
按照STM32参考手册的说法: 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。 简单的说,STM32 中的IWDG 其核心就是一个12bits的向下递减的计数器,当计数器计数到零时就会触发系统复位。因此,要在每次计数到零之前将其复位到一个初始值。这个初始值就在重装载寄存器(IWDG_RLR)中存放,其默认值为0xFFF,我们也可以将其改为其他值。 计数器的时钟由LSI时钟经过分频后提供,预分频因子由预分频寄存器(IWDG
[单片机]
<font color='red'>STM32F10x</font> 学习笔记7(独立看门狗IWDG 模块)
单片机模拟I2C总线读写EEPROM(24CXX)程序二
昨天实现了字节的读写操作(前一篇程序一),今天实现了页写和连续读的操作。 电路不变,下面是仿真电路,只不过P2口的数码管由观测程序执行到哪一步改为查看接收缓冲区的数据。 程序如下: #include reg51.h #define unit unsigned int #define uchar unsigned char uchar num=4; uchar idata sendbuf ={0x96,0x84,0xd5,0x63}; uchar idata recivebuf ; sbit scl=P0^0; sbit sda=P0^1; sbit led0=P2^0; sbit led1=P2^1; sbi
[单片机]
单片机模拟<font color='red'>I2C</font>总线<font color='red'>读写</font><font color='red'>EEPROM</font>(24CXX)程序二
【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设,读取SHT30温湿度传感器的数据并通过串口发送。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): SHT30温湿度传感器 SHT30温湿度传感器是一个完全校准的、现行的、带有温度补偿的数字输出型传感器,具有 2.4V-5.5V 的宽电压支持,使用IIC接口进行通信,最高速率可达1M并且有两个用户可选地址,除此之外,它还具有8个引脚的DFN超小封装,如图: SHT30的原理图如下: 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载
[单片机]
【STM32Cube_15】使用<font color='red'>硬件</font><font color='red'>I2C</font>读取温湿度传感器数据(SHT30)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved