STM32CubeMX的I2C初始化到EEPROM的正常读写

本篇文章来讲解I2C的配置以及EEPROM的调通,还是先来分析我们的原理图,了解要用到哪个引脚

在这里插入图片描述
在这里插入图片描述
IIC对于EEPROM的读取,这里设计到IIC总线和寻址,具体的原理还有什么的可以去百度或者看手册,我就不说了。这里呢A0 A1 A2表示地址,0x00,这里后面要用到来寻址。

了解了之后呢,准备去选择,配置RCC还有SYS的部分别忘了,我就不写了,前两篇文章都有过了

因为要用到UART来打印结果,所以也不要忘记配置UART串口哦,这里可能会有很多的坑,我这篇文章写的比较详细,可以参考。

STM32CubeMX串口通信调试避坑(胎教级教程)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里呢打开之后我就全部默认,没有修改。GPIO口对应上了就行。

然后就是生成这个初始化后的程序,准备去写测试函数进行写入写出的操作。

IIC写函数

 HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi21, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);

参数:

  • hi21 设置使用的是那个IIC 例:&hi2c1
  • DevAddress 写入的地址 设置写入数据的地址 例 0xA0
  • pData 需要写入的数据
  • Size 要发送的字节数
  • Timeout 最大传输时间,超过传输时间将自动退出传输函数

IIC读函数

HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi21, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);

IIC写多个数据


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);
/* 第1个参数为I2C操作句柄
   第2个参数为从机设备地址
   第3个参数为从机寄存器地址
   第4个参数为从机寄存器地址长度
   第5个参数为发送的数据的起始地址
   第6个参数为传输数据的大小
   第7个参数为操作超时时间   */

  • hi2c: I2C设备号指针,设置使用的是那个IIC 例:&hi2c1

  • DevAddress: 从设备地址 从设备的IIC地址 例E2PROM的设备地址 0xA0

  • MemAddress: 从机寄存器地址 ,每写入一个字节数据,地址就会自动+1

  • MemAddSize: 从机寄存器地址字节长度 8位或16位

  • 写入数据的字节类型 8位还是16位

  • I2C_MEMADD_SIZE_8BIT
  • I2C_MEMADD_SIZE_16BIT

stm32f4xx_hal_i2c.h中有定义

在这里插入图片描述
硬件IIC读取
在mian.c文件前面声明,写地址和读地址 ,定义写数据数组,和读数据数组

/* USER CODE BEGIN PV */
#include <string.h>

#define ADDR_24LCxx_Write 0xA0
#define ADDR_24LCxx_Read 0xA1
#define BufferSize 256
uint8_t WriteBuffer[BufferSize],ReadBuffer[BufferSize];
uint16_t i;
/* USER CODE END PV */

UART部分需要重新定义printf函数,算了,重新粘一下吧

在 stm32f4xx_hal.c中包含#include <stdio.h>

#include "stm32f4xx_hal.h"
#include <stdio.h>
extern UART_HandleTypeDef huart1;   //声明串口

在 stm32f4xx_hal.c 中重写fget和fput函数

/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

main.c中添加

  /* USER CODE BEGIN 2 */
	for(i=0; i<256; i++)
    WriteBuffer[i]=i;    /* WriteBuffer init */


		printf("\r\n***************I2C Example 测试*******************************\r\n");
			for (int j=0; j<32; j++)
        {
                if(HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Write, 8*j, I2C_MEMADD_SIZE_8BIT,WriteBuffer+8*j,8, 1000) == HAL_OK)
                {
                                printf("\r\n EEPROM 24C02 Write Test OK \r\n");
                        HAL_Delay(20);
                }
                else
                {
                         HAL_Delay(20);
                                printf("\r\n EEPROM 24C02 Write Test False \r\n");
                }
		}
		/*
		// wrinte date to EEPROM   如果要一次写一个字节,写256次,用这里的代码
		for(i=0;i<BufferSize;i++)
		{
		    HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Write, i, I2C_MEMADD_SIZE_8BIT,&WriteBuffer[i],1,0xff);//使用I2C块读,出错。因此采用此种方式,逐个单字节写入
		  HAL_Delay(5);//此处延时必加,与AT24C02写时序有关
		}
		printf("\r\n EEPROM 24C02 Write Test OK \r\n");
		*/

		HAL_I2C_Mem_Read(&hi2c1, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,ReadBuffer,BufferSize, 0xff);

		for(i=0; i<256; i++)
			printf("0x%02X  ",ReadBuffer[i]);
			
  /* USER CODE END 2 */

注意事项:

  • AT24C02的IIC每次写之后要延时一段时间才能继续写 每次写之后要delay 5ms左右 不管硬件IIC采用何种形式(DMA,IT),都要确保两次写入的间隔大于5ms;
  • 读写函数最后一个超时调整为1000以上 因为我们一次写8个字节,延时要久一点
  • AT24C02页写入只支持8个byte,所以需要分32次写入。这不是HAL库的bug,而是AT24C02的限制,其他的EEPROM可以支持更多byte的写入。

当然,你也可以每次写一个字节,分成256次写入,也是可以的 那就用注释了的代码即可

		/*
		// wrinte date to EEPROM   如果要一次写一个字节,写256次,用这里的代码
		for(i=0;i<BufferSize;i++)
		{
		    HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Write, i, I2C_MEMADD_SIZE_8BIT,&WriteBuffer[i],1,0xff);//使用I2C块读,出错。因此采用此种方式,逐个单字节写入
		  HAL_Delay(5);//此处延时必加,与AT24C02写时序有关
		}
		printf("\r\n EEPROM 24C02 Write Test OK \r\n");
		*/

在这里插入图片描述
经测试,例程正常
在这里插入图片描述
(自己的测试图片当时没截图,就用别人的了,问题不大,结果都一样,这个实验也没有什么太多的坑,体验还比较良好)

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值