【HM】STM32F407 HAL库 I2C读写EEPROM AT24C02

配置SYS和时钟

https://blog.csdn.net/hmxm6/article/details/136636793

配置I2C

I2C Speed Mode: IIC模式设置 快速模式和标准模式。实际上也就是速率的选择。

I2C Clock Speed:I2C传输速率,默认为100KHz

Fast Mode Duty Cycle:快速模式下的I2C占空比

Clock No Stretch Mode: 时钟没有扩展模式

Primary Address Length selection: 从设备地址长度 设置从设备的地址是7bit还是10bit 大部分为7bit

Dual Address Acknowledged: 双地址确认

Primary slave address:  从设备初始地址
在这里插入图片描述

查看原理图对应引脚

在这里插入图片描述

在这里插入图片描述

注意事项

AT24C02有不同型号,对应每页的字节不同

型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数
AT24C3232k4K12832A2A1A0812/2
AT24C6464k8K25632A2A1A0813/2
AT24C128128k16K25664A1A0414/2
AT24C256256k32K51264A1A0415/2
AT24C512512k64K512128A2A1A0816/2

I2C设备地址

76543210
1010A2A1A0R/~W

写入数据

每次写入数据不得超过页字节数

测试代码

头文件

#ifndef __BSP_I2C_EEPROM_H__
#define __BSP_I2C_EEPROM_H__

#ifdef __cplusplus
extern "C" {
#endif
	
#include "stm32f4xx.h"
	
#define EEPROM_ADDRESS        0xA0
#define EEPROM_MAX_TRIALS     300
#define I2Cx_TIMEOUT_MAX      300
#define EEPROM_PAGESIZE 	   	8

// 初始化
void I2C_EEPROM_Init(I2C_HandleTypeDef i2cHandle);

	

// 写入页数据
void I2C_EEPROM_BufferWrite(uint8_t* pBuffer, uint8_t DeviceAddress, uint8_t WriteAddr, uint16_t NumByteToWrite);
// 写入数据
uint32_t I2C_EEPROM_PageWrite(uint8_t* pBuffer, uint8_t DeviceAddress, uint8_t WriteAddr, uint8_t NumByteToWrite);
// 读取数据
uint32_t I2C_EEPROM_BufferRead(uint8_t* pBuffer,uint8_t DeviceAddress, uint8_t ReadAddr, uint16_t NumByteToRead);
#ifdef __cplusplus
}
#endif

#endif /* __BSP_I2C_EEPROM_H__ */

初始化函数

I2C_HandleTypeDef I2C_Handle;

void I2C_EEPROM_Init(I2C_HandleTypeDef i2cHandle)
{
	I2C_Handle = i2cHandle;
}

EEPROM读取函数

uint32_t I2C_EEPROM_BufferRead(uint8_t* pBuffer,uint8_t DeviceAddress, uint8_t ReadAddr, uint16_t NumByteToRead)
{
	HAL_StatusTypeDef status = HAL_OK;
	
	status=HAL_I2C_Mem_Read(&I2C_Handle, DeviceAddress, ReadAddr, I2C_MEMADD_SIZE_8BIT, (uint8_t *)pBuffer, NumByteToRead, 1000);

	return status;
}

EEPROM单页写入函数

uint32_t I2C_EEPROM_PageWrite(uint8_t* pBuffer, uint8_t DeviceAddress, uint8_t WriteAddr, uint8_t NumByteToWrite)
{
	HAL_StatusTypeDef status = HAL_OK;
	
	// 写入数据
	status=HAL_I2C_Mem_Write(&I2C_Handle, DeviceAddress, WriteAddr, I2C_MEMADD_SIZE_8BIT, (uint8_t*)(pBuffer),NumByteToWrite, 100);
	
	// 检查总线是否准备好
	while (HAL_I2C_GetState(&I2C_Handle) != HAL_I2C_STATE_READY)
	{
		
	}

	// 检查设备是否准备好
	while (HAL_I2C_IsDeviceReady(&I2C_Handle, DeviceAddress, EEPROM_MAX_TRIALS, I2Cx_TIMEOUT_MAX) == HAL_TIMEOUT);

	// 检查总线是否准备好
	while (HAL_I2C_GetState(&I2C_Handle) != HAL_I2C_STATE_READY)
	{
		
	}
	
	return status;
}

EEPROM多页写函数

void I2C_EEPROM_BufferWrite(uint8_t* pBuffer, uint8_t DeviceAddress, uint8_t WriteAddr, uint16_t NumByteToWrite)
{
  uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;

  Addr = WriteAddr % EEPROM_PAGESIZE;
  count = EEPROM_PAGESIZE - Addr;
  NumOfPage =  NumByteToWrite / EEPROM_PAGESIZE;
  NumOfSingle = NumByteToWrite % EEPROM_PAGESIZE;
 
  /* If WriteAddr is I2C_PageSize aligned  */
  if(Addr == 0) 
  {
    /* If NumByteToWrite < I2C_PageSize */
    if(NumOfPage == 0) 
    {
      I2C_EEPROM_PageWrite(pBuffer, DeviceAddress, WriteAddr, NumOfSingle);
    }
    /* If NumByteToWrite > I2C_PageSize */
    else  
    {
			for(int i=0;i<NumOfPage;i++)
			{
				I2C_EEPROM_PageWrite(pBuffer+(i*EEPROM_PAGESIZE), DeviceAddress, WriteAddr+(i*EEPROM_PAGESIZE), EEPROM_PAGESIZE); 
			}

      if(NumOfSingle!=0)
      {
        I2C_EEPROM_PageWrite(pBuffer, DeviceAddress, WriteAddr, NumOfSingle);
      }
    }
  }
}

main函数

#define  DATA_Size	256
uint8_t I2c_Buf_Write[DATA_Size] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
uint8_t I2c_Buf_Read[DATA_Size];

I2C_EEPROM_Init(hi2c1);
	
printf("\r\n AT24C02 I2C Test \r\n");
	
printf("write Data \r\n");
	
I2C_EEPROM_BufferWrite( I2c_Buf_Write, EEPROM_ADDRESS, 0x00, DATA_Size);
	
printf("read Data \r\n");
	
I2C_EEPROM_BufferRead(I2c_Buf_Read, EEPROM_ADDRESS, 0x00, DATA_Size); 
	
for (int i=0; i<DATA_Size; i++)
{	
	printf("[%d]:%d \r\n", i, I2c_Buf_Read[i]);
}

测试

在这里插入图片描述
测试程序下载
https://download.csdn.net/download/hmxm6/88969827

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在使用HAL库进行STM32的IIC读写AT24C02时,你可以参考以下步骤: 1. 首先,你需要在你的工程中包含AT24CXX.c文件,并在代码中引用该文件。该文件中定义了一些常量和函数,用于初始化AT24CXX芯片、写入数据和读取数据等操作。 2. 在AT24CXX.c文件中,你可以看到定义了一些常量,如AT24C02的地址为255。这些常量可以根据你所使用的芯片型号进行修改。 3. 在AT24CXX.c文件中,还定义了一些函数,如AT24CXX_Init()用于初始化AT24CXX芯片,AT24CXX_Write()用于写入数据,AT24CXX_Read()用于读取数据,AT24CXX_Check()用于检查AT24CXX芯片是否正常工作。你可以根据需要调用这些函数来实现对AT24C02读写操作。 4. 在配置STM32的引脚时,你需要将IIC的引脚与AT24C02芯片的引脚相连接。具体的引脚配置可以参考AT24CXX.c文件中的注释。 5. 在配置串口时,你可以选择使用串口进行数据查看,以便调试和验证读写操作的结果。 6. 最后,根据你的需求选择适当的时钟频率,生成Keil工程代码。 综上所述,你可以使用HAL库的函数和AT24CXX.c文件中定义的函数来实现对AT24C02芯片的读写操作。 #### 引用[.reference_title] - *1* *3* [STM32 (基于HAL库) 硬件IIC读写任意AT24CXX芯片](https://blog.csdn.net/weixin_56565733/article/details/124401443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32系列(HAL库)——F103C8T6通过IIC/I2C方式读写AT24C02—(EEPROM 存储模块)](https://blog.csdn.net/lwb450921/article/details/124394615)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值