不含stm32 底层的代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
MyStm32Code/DOC/10_I2C.md

122 lines
3.5 KiB

## 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;
}
```