Bootstrap

AT24C02读写程序

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个字节后,会重复写入该页。所以在写函数里面切分了一下要写入数据包的长度。

;