at24c64 IIC库函数 读写程序
时间: 2024-12-27 11:26:29 浏览: 9
### 关于AT24C64 IIC库函数读写示例代码
对于基于不同MCU平台上的AT24C64 EEPROM的操作,可以利用各自的标准库或硬件IIC模块实现其读写功能。
#### STM32F4系列下的AT24C64单次/连续读写操作
针对STM32F4系列微控制器而言,可以通过标准库中的`HAL_I2C_Master_Transmit()` 和 `HAL_I2C_Master_Receive()` 函数完成对AT24C64设备的数据传输过程[^1]。下面给出一段简单的例子用于说明如何执行一次性的数据写入以及从指定地址处获取多个字节:
```c
#include "stm32f4xx_hal.h"
// 假设已经初始化好I2C句柄hi2c1, 并定义好了相应的参数配置.
#define AT24C64_ADDRESS (0xA0 << 1) // 设备7位地址左移一位得到8位格式.
void WriteToAT24C64(uint16_t MemAddress, uint8_t* pData, uint16_t Size){
HAL_StatusTypeDef status;
/* 发送起始条件并发送器件地址 */
status = HAL_I2C_Mem_Write(&hi2c1, AT24C64_ADDRESS, MemAddress,
I2C_MEMADD_SIZE_16BIT, pData, Size, 100);
}
uint8_t ReadFromAT24C64(uint16_t MemAddress, uint8_t *pData, uint16_t Size){
HAL_StatusTypeDef status;
/* 发送起始条件并发送器件地址 */
status = HAL_I2C_Mem_Read(&hi2c1, AT24C64_ADDRESS, MemAddress,
I2C_MEMADD_SIZE_16BIT, pData, Size, 100);
return status;
}
```
这段代码展示了基本的写入和读取方法,其中包含了内存地址指针传递给目标芯片以便定位具体存储位置的功能。
#### 雅特力AT32F421下IIC读写EEPROM AT24C64实例
当涉及到雅特力AT32F421 MCU时,则会依赖特定版本SDK所提供的API来进行通信控制[^2]。以下是简化版的读写流程示意:
```c
#include "at32f4xx_iic.h"
#include "at32f4xx_rcc.h"
/* 定义全局变量 */
static i2c_handle_type DefHandle;
void AT24C64_Init(void){
// 初始化IIC外设...
}
void AT24C64_WriteByte(uint16_t Addr,uint8_t Data){
uint8_t buffer[2];
buffer[0]=(Addr>>8)&0xFF; //高字节
buffer[1]=Addr&0XFF; //低字节
i2c_start_send(DefHandle.Instance, AT24C64_ADDRESS_WRITE);
i2c_write_data(DefHandle.Instance,&buffer[0],sizeof(buffer));
i2c_write_data(DefHandle.Instance,&Data,sizeof(Data));
i2c_stop();
}
uint8_t AT24C64_ReadByte(uint16_t Addr){
uint8_t data=0;
uint8_t addr_buffer[2];
addr_buffer[0]=(Addr>>8)&0xFF; //高字节
addr_buffer[1]=Addr&0XFF; //低字节
i2c_start_send(DefHandle.Instance, AT24C64_ADDRESS_WRITE);
i2c_write_data(DefHandle.Instance,&addr_buffer[0], sizeof(addr_buffer));
i2c_start_send(DefHandle.Instance, AT24C64_ADDRESS_READ);
i2c_read_data(DefHandle.Instance,&data,1,I2C_NO_STOP);
i2c_stop();
return data;
}
```
上述片段体现了通过设置不同的寄存器值来启动停止信号、传送命令序列等细节处理方式。
#### HC32F460硬件IIC驱动AT24C64案例分享
HC32F460作为另一款高性能ARM Cortex-M4内核处理器同样支持使用内置的硬件IIC接口与外部串行EEPROM交互工作[^3]。下面是部分核心逻辑摘录:
```c
#include "hc32f460_iic.h"
#define SLAVE_ADDR_AT24C64 ((uint8_t)(0xA0 >> 1)) // 注意这里的地址右移了一位!
void AT24C64_Write(uint16_t u16MemAdd, const uint8_t *pu8Buf, uint16_t u16Len){
uint8_t au8WriteBuff[3];
au8WriteBuff[0] = (u16MemAdd & 0xFF00)>>8;
au8WriteBuff[1] = u16MemAdd & 0x00FF;
memcpy(&(au8WriteBuff[2]), pu8Buf, u16Len);
M4_I2Cx->START(); // 开启总线访问
while(I2C_GetFlagStatus(M4_I2Cx, I2C_FLAG_SB)==RESET){};//等待开始标志置位
I2C_Send7bitAddress(M4_I2Cx,SLAVE_ADDR_AT24C64,I2C_Direction_Transmitter);//发地址
...
}
uint8_t AT24C64_Read(uint16_t u16MemAdd, uint8_t *pu8Buf, uint16_t u16Len){
uint8_t au8ReadBuff[2];
au8ReadBuff[0] = (u16MemAdd & 0xFF00)>>8;
au8ReadBuff[1] = u16MemAdd & 0x00FF;
M4_I2Cx->START();
while(I2C_GetFlagStatus(M4_I2Cx, I2C_FLAG_SB)== RESET){}
I2C_Send7bitAddress(M4_I2Cx,SLAVE_ADDR_AT24C64,I2C_Direction_Transmitter);
...
}
```
这些代码段揭示了如何运用HC32特有的指令集去构建完整的事务链路,并确保每次请求都能被正确解析和响应。
阅读全文