## I2C
战舰 F103ZET6
24C02 的 SCL 和 SDA 分别连在 STM32F1 的 PB6 和 PB7 上， 对应IIC1

考虑更16bit的 EEPROM， 时钟模块等

可以考虑 LL库配置， Project 管理里面可以选择 HAL  LL库

### 配置
I2C1  PB6 和 PB7 不需要重映射
400000 快速  
开启中断

配置生成代码后  ，

### 库函数
库函数 参考  stm32f1xx_hal_i2c.h
包含  polling IT  DMA  三种模式，以及事件处理

	LL_I2C_Enable(I2C2);
	LL_I2C_EnableIT_EVT(I2C2);
	status = HAL_I2C_Master_Transmit(&hi2c1,32,i2c_master_buff,6,1000);
	status = HAL_I2C_Master_Receive(&hi2c1,32,rx_buff,10,1000);

	返回状态码为1 

 
### 结构体如何写入 EEPROM

###  代码
对AT24CXX 不同型号的封装
```C
#ifndef __HAL_AT24CXX_H__
#define __HAL_AT24CXX_H__
#include "stm32f1xx_hal.h"
#define AT24C01		127
#define AT24C02		255
#define AT24C04		511
#define AT24C08		1023
#define AT24C16		2047
#define AT24C32		4095
#define AT24C64	  8191
#define AT24C128	16383
#define AT24C256	32767  
//我使用的是AT24C02
#define EE_TYPE AT24C02

void AT24CXX_Init(void);

void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite);

void AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead);

uint8_t AT24CXX_Check(void);
 
#endif
```


```C
#include "HAL_AT24CXX.h"

extern I2C_HandleTypeDef hi2c1;
#define AT24CXX_HANDLE	(&hi2c1)	//IIC接口
#define AT24C_DEV_ADDR  (0XA0) //设备地址

void AT24CXX_Init(void)
{
	//IIC_Init();//IIC初始化
	AT24CXX_Check();
}

/*****************************************
函数名：void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite)
参数：WriteAddr :要写入数据的地址  pBuffer：要写入的数据的首地址 NumToWrite：要写入数据的长度
功能描述：从指定地址开始写入多个字节数据
返回值：无
*****************************************/
void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite)
{
	if(EE_TYPE < AT24C16)
		HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,WriteAddr,I2C_MEMADD_SIZE_8BIT,pBuffer,NumToWrite,HAL_MAX_DELAY);
	else
		HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,WriteAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,NumToWrite,HAL_MAX_DELAY);
}
/*****************************************
函数名：AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
参数： ReadAddr：要读取数据的地址 pBuffer：回填数据首地址 NumToRead:数据长度
功能描述：从指定地址开始读取多个个字节数据
返回值：无
*****************************************/
void AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
{
	if(EE_TYPE < AT24C16)
		HAL_I2C_Mem_Read(AT24CXX_HANDLE,AT24C_DEV_ADDR,ReadAddr,I2C_MEMADD_SIZE_8BIT,pBuffer,NumToRead,HAL_MAX_DELAY);
	else
		HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,ReadAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,NumToRead,HAL_MAX_DELAY);
} 
/*****************************************
函数名：uint8_t AT24CXX_Check(void)
参数：无
功能描述：检查AT24CXX是否正常，这里用了24XX的最后一个地址(255)来存储标志字.如果用其他24C系列,这个地址要修改
返回值：检测成功返回0 失败返回1
*****************************************/
uint8_t AT24CXX_Check(void)
{
	uint8_t temp;
	uint8_t data = 0XAB;
	AT24CXX_Read(EE_TYPE,&temp,1);//避免每次开机都写AT24CXX			   
	if(temp != 0XAB)
		return 1;		   
	else//排除第一次初始化的情况
	{
		AT24CXX_Write(EE_TYPE,&data,1);
	    AT24CXX_Read(EE_TYPE,&temp,1);;	  
		if(temp != 0XAB)
			return 1;
	}
	return 0;											  
}
 
```