STM32I2C读写EEPROM实验

         I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。

以下是STM32 I2C的一些特点和使用方式:

1)支持多主机模式:STM32 I2C总线支持多主机模式,可以进行多个设备之间的通信。

2)支持多种数据传输方式:STM32 I2C总线支持不同的数据传输方式,如使用7位或10位地址、读取或写入数据,以及使用不同的数据传输模式(如批处理、字节模式等)。

3)支持高速模式:STM32 I2C总线支持高达400kHz的高速模式,这使得它非常适合数据传输速度较快的应用。

4)易于使用:STM32 I2C总线通过硬件支持,使得I2C通信的配置和操作非常简单。通常使用I2C库函数实现数据传输。

5)支持嵌套式架构:STM32 I2C总线是为嵌入式应用程序设计的,适用于不同的嵌套式架构。

2,EEPROM (Electrically Erasable Programmable read only memory),带电可擦可编程只读存储器,一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。EEPROM常用来存储一些配置信息,以便系统重新上电的时候加载之。EEPOM 芯片最常用的通讯方式就是 I2C 协议。

在此,以经典的24C65举例。

原理图:

24C65读写手册:

写时序:(每次写一位)

读时序:(每次可以读取n位)

步骤:

(1)PB6,PB7设置为I2C;使能I2C

(2)使能串口1(USART1)

(3)使能时钟:外部晶振,配置时钟

程序:

#define ReadAddr  0xA1  //定义读地址
#define WriteAddr 0xA0  //定义写地址

uint8_t Wbuf[20] = "EEPROM TEST OK!";
uint8_t Rbuf[20] = {0};

void Eeprom_Write(uint16_t MemAddr, uint8_t *Wbuf, uint16_t len) //24C65写数据函数
{                  //写内存的地址,写的内容数据,写的长度
	while(len--)
	{
		while(HAL_I2C_Mem_Write(&hi2c1, WriteAddr, MemAddr, I2C_MEMADD_SIZE_16BIT, Wbuf, 1, 100) != HAL_OK); //判断写的操作是否正确
							//句柄,写的地址,从设备地址,地址单元的大小,写的数据(参数),每次写1个数据,超时时间
		MemAddr++;  //内存地址往上加
		Wbuf++;     //写下一个内容
	}
}

void Eeprom_Read(uint16_t MemAddr, uint8_t *Rbuf, uint16_t len) //24C65读数据函数
{     			//读设备的哪一个地址,读的地址放Rbuf里面,读取长度
	while(HAL_I2C_Mem_Read(&hi2c1, ReadAddr, MemAddr, I2C_MEMADD_SIZE_16BIT, Rbuf, len, 100) != HAL_OK);
				 //句柄,读的设备地址,上层接口传递的地址,地址单元的宽度,读取数据存放地方,读取长度,超时时间
}	

int main()
{
    printf("this is I2C_EEPROM test\n");

    Eeprom_Write(0, Wbuf, sizeof(Wbuf));//0地址写数据,要写的数据,数据长度
	
	HAL_Delay(500);
	
	Eeprom_Read( 0, Rbuf, sizeof(Rbuf));//从0地址读,读到的数据存放Rbuf,读取长度
	
	printf("READ: %s\n",Rbuf);
}

运行结果:

注意:在使用STM32 I2C时,需要对总线空闲状态进行检测,以确保读写操作的成功。STM32 I2C总线还支持DMA传输方式,可以更方便地传输大量数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用STM32的HAL库来实现I2C读写EEPROM。首先,确保已经正确配置了I2C外设和相关引脚。然后,按照以下步骤进行操作: 1. 初始化I2C外设:使用`HAL_I2C_Init()`函数初始化I2C外设。 2. 配置EEPROM地址:在发送I2C读写请求之前,需要设置EEPROM的地址。这可以通过向I2C外设发送一个写入EEPROM地址的I2C Start信号,然后发送EEPROM地址字节来实现。 3. 发送数据:如果要向EEPROM写入数据,可以使用`HAL_I2C_Master_Transmit()`函数发送数据。如果要从EEPROM读取数据,可以使用`HAL_I2C_Master_Receive()`函数接收数据。 下面是一个示例代码,演示如何使用HAL库进行I2C读写EEPROM: ```c #include "stm32xxxx.h" // 根据具体的芯片型号选择头文件 #define EEPROM_ADDRESS 0xA0 // EEPROM的I2C地址 // 初始化I2C外设 void I2C_Init(void) { // I2C外设初始化代码 // ... } // 向EEPROM写入数据 void EEPROM_Write(uint16_t address, uint8_t* data, uint16_t size) { // 发送I2C Start信号和EEPROM地址 HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS, (uint8_t*)&address, 2, HAL_MAX_DELAY); // 发送数据到EEPROM HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS, data, size, HAL_MAX_DELAY); } // 从EEPROM读取数据 void EEPROM_Read(uint16_t address, uint8_t* data, uint16_t size) { // 发送I2C Start信号和EEPROM地址 HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS, (uint8_t*)&address, 2, HAL_MAX_DELAY); // 从EEPROM接收数据 HAL_I2C_Master_Receive(&hi2c1, EEPROM_ADDRESS, data, size, HAL_MAX_DELAY); } ``` 请注意,上述代码中的`hi2c1`是I2C外设的句柄,具体根据你的芯片型号和使用的外设进行修改。此外,还需要根据EEPROM的具体规格和通信协议进行相应的配置。 希望以上信息对你有所帮助!如有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值