AT24C02读写程序
单片机:STM32F030F4
编辑环境:keil+stm32cubemx6.6.1
一、硬件配置
二、程序编辑
1、头文件
/**********************
AT24C02特性:
* 容量:32*8*8(2kb)
* 写周期最大5ms;
* 共有32页,每页8Byte,每Byte是8位
* 设备地址
1K/2K
1 0 1 0 A2 A1 A0 RW
* A2,A1,A0与硬件连接电平对应
*********************/
#ifndef __AT24CXX_H
#define __AT24CXX_H
#include "main.h"
#include "i2c.h"
#define AT24_DEV_ADDR 0XA0 /*器件地址*/
#define AT24_WRITE_CYCLE_TIME 5 /*写周期时间,最大5ms*/
typedef enum
{
AT24C01, /*一个8位长的字节地址码*/
AT24C02, /*一个8位长的字节地址码*/
AT24C04, /*一个8位长的字节地址码*/
AT24C08, /*一个8位长的字节地址码*/
AT24C16, /*一个8位长的字节地址码*/
AT24C32, /*两个8位长的字节地址码*/
AT24C64, /*两个8位长的字节地址码*/
AT24C128, /*两个8位长的字节地址码*/
AT24C256, /*两个8位长的字节地址码*/
}at24Type_E;
void AT24_Write(uint32_t addr,uint8_t *pBuff,uint16_t numWrite,at24Type_E eDevType);
void AT24_Read(uint32_t addr,uint8_t *pBuff,uint16_t numRead,at24Type_E eDevType);
#endif
2、C文件
#include "at24cxx.h"
/**
* 函数:AT24C02_Write
* 说明:连续写入AT24C存储器,不能使用单个字节连续写入,
* 连续写入8个字节后,会重复写入该页
**/
void AT24_Write(uint32_t addr,uint8_t *pBuff,uint16_t numWrite,at24Type_E eDevType)
{
uint8_t i;
uint16_t cnt=0;
uint16_t memAddrSize;
if(eDevType > AT24C16)
{
memAddrSize = I2C_MEMADD_SIZE_16BIT;
}
else
{
memAddrSize = I2C_MEMADD_SIZE_8BIT;
}
if(0 == addr%8)/*起始地址刚好是页地址*/
{
if(numWrite <= 8 )/*数据不满一页,直接写入*/
{
HAL_I2C_Mem_Write(&hi2c1,AT24_DEV_ADDR,addr,memAddrSize,pBuff,numWrite,10);
HAL_Delay(AT24_WRITE_CYCLE_TIME);
}
else/*数据超过1页*/
{
for(i=0;i<(numWrite/8);i++)/*先写入整页数据*/
{
HAL_I2C_Mem_Write(&hi2c1,AT24_DEV_ADDR,addr,memAddrSize,&pBuff[cnt],8,10);
HAL_Delay(AT24_WRITE_CYCLE_TIME);
addr += 8;
cnt += 8;
}
/*写入剩余数据*/
HAL_I2C_Mem_Write(&hi2c1,AT24_DEV_ADDR,addr,memAddrSize,&pBuff[cnt],numWrite - cnt,10);
HAL_Delay(AT24_WRITE_CYCLE_TIME);
}
}
else/*起始地址偏离页地址*/
{
/*对于写入的数据大小,分2种情况*/
if(numWrite <= (8-addr%8))/*情况1:数据足够写入该页*/
{
HAL_I2C_Mem_Write(&hi2c1,AT24_DEV_ADDR,addr,memAddrSize,pBuff,numWrite,10);
HAL_Delay(AT24_WRITE_CYCLE_TIME);
}
else/*情况2:数据在本页写不完*/
{
/*步骤1,先写完该页*/
cnt = 8 - addr%8;
HAL_I2C_Mem_Write(&hi2c1,AT24_DEV_ADDR,addr,memAddrSize,pBuff,cnt,10);
HAL_Delay(AT24_WRITE_CYCLE_TIME);
/*步骤2,再写完整页*/
addr += cnt;
for(i=0; i<(numWrite-cnt)/8;i++)
{
HAL_I2C_Mem_Write(&hi2c1,AT24_DEV_ADDR,addr,memAddrSize,&pBuff[cnt],8,10);
HAL_Delay(AT24_WRITE_CYCLE_TIME);
addr += 8;
cnt += 8;
}
/*步骤3,写入剩下的*/
HAL_I2C_Mem_Write(&hi2c1,AT24_DEV_ADDR,addr,memAddrSize,&pBuff[cnt],numWrite - cnt,10);
HAL_Delay(AT24_WRITE_CYCLE_TIME);
}
}
}
/**
* 函数:AT24C_Read
* 说明:连续读取
**/
void AT24_Read(uint32_t addr,uint8_t *pBuff,uint16_t numRead,at24Type_E eDevType)
{
uint16_t memAddrSize;
if(eDevType > AT24C16)
{
memAddrSize = I2C_MEMADD_SIZE_16BIT;
}
else
{
memAddrSize = I2C_MEMADD_SIZE_8BIT;
}
HAL_I2C_Mem_Read(&hi2c1,AT24_DEV_ADDR,addr,memAddrSize,pBuff,numRead,10);
}
结束
没了。
直接使用STM32CUBEMX的硬件IIC,然后调用HAL_I2C_Mem_Write和HAL_I2C_Mem_Read读写即可。
唯一注意的是AT24C02连续写入8个字节后,会重复写入该页。所以在写函数里面切分了一下要写入数据包的长度。