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.
122 lines
3.5 KiB
122 lines
3.5 KiB
2 years ago
|
## 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;
|
||
|
}
|
||
|
|
||
|
```
|