| 【HAL库每天一例】系列例程从今天开始持续更新。。。。。 我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
 该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
 同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
 例程下载:
 资料包括程序、相关说明资料以及软件使用截图
 链接:https://pan.baidu.com/s/1i574oPv
 密码:r3s3
 (硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-050. I2C-EEPROM)
 /**
 ******************************************************************************
 *                           硬石YS-F1Pro开发板例程功能说明
 *
 *  例程名称: 1. EEPROM(AT24C02)-硬件I2C
 *
 ******************************************************************************
 * 说明:
 * 本例程配套硬石stm32开发板YS-F1Pro使用。
 *
 * 淘宝:
 * 论坛:www ing10bbs com
 * 版权归硬石嵌入式开发团队所有,请勿商用。
 ******************************************************************************
 */
 
 【1】例程简介
 I2C总线是飞利浦公司开发的两线式串行总线。用于连接微控制器和外围设备。它是同步通信的一
 种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。通过串行数据
 (SDA)线和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识
 别,而且都可以作为一个发送器或接收器。
 EEPROM(Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储
 器--一种掉电后数据不丢失的存储芯片。EEPROM可以擦除已有信息,重新编程。一般用在即插即用。
 YS-F1Pro开发板上集成一个型号为AT24C02的EEPROM,本例程实现对它的读写操作。
 
 【2】跳线帽情况
 ******* 为保证例程正常运行,必须插入以下跳线帽 **********
 丝印编号     IO端口      目标功能引脚        出厂默认设置
 JP1        PA10        TXD(CH340G)          已接入
 JP2        PA9         RXD(CH340G)          已接入
 
 【3】操作及现象
 使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口(需要安装驱动),
 在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序之后,在串口调试助手窗口
 可接收到信息。
 
 /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
 
 
   
   
   
 bsp_EEPROM.h文件内容
 
 复制代码#ifndef __I2C_EEPROM_H__
#define        __I2C_EEPROM_H__
/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
/* 类型定义 ------------------------------------------------------------------*/
/* 宏定义 --------------------------------------------------------------------*/
#define I2C_OWN_ADDRESS                            0x0A              // stm32本机I2C地址
#define I2C_SPEEDCLOCK                             400000            // I2C通信速率(最大为400K)
#define I2C_DUTYCYCLE                              I2C_DUTYCYCLE_2   // I2C占空比模式:1/2 
#define EEPROM_I2Cx                                I2C1
#define EEPROM_I2C_RCC_CLK_ENABLE()                __HAL_RCC_I2C1_CLK_ENABLE()
#define EEPROM_I2C_RCC_CLK_DISABLE()               __HAL_RCC_I2C1_CLK_DISABLE()
#define EEPROM_I2C_GPIO_CLK_ENABLE()               __HAL_RCC_GPIOB_CLK_ENABLE()
#define EEPROM_I2C_GPIO_CLK_DISABLE()              __HAL_RCC_GPIOB_CLK_DISABLE()   
#define EEPROM_I2C_GPIO_PORT                       GPIOB   
#define EEPROM_I2C_SCL_PIN                         GPIO_PIN_6
#define EEPROM_I2C_SDA_PIN                         GPIO_PIN_7
/* 
 * EEPROM 2kb = 2048bit = 2048/8 B = 256 B
 * 32 pages of 8 bytes each
 *
 * Device Address
 * 1 0 1 0 A2 A1 A0 R/W
 * 1 0 1 0 0  0  0  0 = 0XA0
 * 1 0 1 0 0  0  0  1 = 0XA1 
 */
/* EEPROM Addresses defines */ 
#define EEPROM_I2C_ADDRESS                         0xA0
/* 扩展变量 ------------------------------------------------------------------*/
extern I2C_HandleTypeDef hi2c_eeprom;
/* 函数声明 ------------------------------------------------------------------*/
void               MX_I2C_EEPROM_Init(void);
void               I2C_EEPROM_WriteData(uint16_t Addr, uint8_t Reg, uint8_t Value);
HAL_StatusTypeDef  I2C_EEPROM_WriteBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);
uint8_t            I2C_EEPROM_ReadData(uint16_t Addr, uint8_t Reg);
HAL_StatusTypeDef  I2C_EEPROM_ReadBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);
HAL_StatusTypeDef  I2C_EEPROM_IsDeviceReady(uint16_t DevAddress, uint32_t Trials);
#endif /* __I2C_EEPROM_H__ */
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
bsp_EEPROM.c文件内容
 
 复制代码/**
  ******************************************************************************
  * 文件名程: bsp_EEPROM.c 
  * 作    者: 硬石嵌入式开发团队
  * 版    本: V1.0
  * 编写日期: 2015-10-04
  * 功    能: 板载EEPROM(AT24C02)底层驱动程序
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  * 
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */
/* 包含头文件 ----------------------------------------------------------------*/
#include "i2c/bsp_EEPROM.h"
/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
#define EVAL_I2Cx_TIMEOUT_MAX                   3000
/* 私有变量 ------------------------------------------------------------------*/
I2C_HandleTypeDef hi2c_eeprom;
uint32_t I2cxTimeout = EVAL_I2Cx_TIMEOUT_MAX;
/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
/* 函数体 --------------------------------------------------------------------*/
/**
  * 函数功能: I2C外设初始化
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
void MX_I2C_EEPROM_Init(void)
{
  hi2c_eeprom.Instance             = EEPROM_I2Cx;
  hi2c_eeprom.Init.ClockSpeed      = I2C_SPEEDCLOCK;
  hi2c_eeprom.Init.DutyCycle       = I2C_DUTYCYCLE;
  hi2c_eeprom.Init.OwnAddress1     = 0;
  hi2c_eeprom.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;
  hi2c_eeprom.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c_eeprom.Init.OwnAddress2     = 0;
  hi2c_eeprom.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c_eeprom.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLE;
  HAL_I2C_Init(&hi2c_eeprom);
}
/**
  * 函数功能: I2C外设硬件初始化配置
  * 输入参数: hi2c:I2C句柄类型指针
  * 返 回 值: 无
  * 说    明: 该函数被HAL库内部调用
  */
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  if(hi2c->Instance==EEPROM_I2Cx)
  {  
    /* 使能外设时钟 */
    EEPROM_I2C_RCC_CLK_ENABLE();        
    EEPROM_I2C_GPIO_CLK_ENABLE();
    
    /**I2C1 GPIO Configuration    
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA 
    */
    GPIO_InitStruct.Pin = EEPROM_I2C_SCL_PIN|EEPROM_I2C_SDA_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(EEPROM_I2C_GPIO_PORT, &GPIO_InitStruct);
  }
}
/**
  * 函数功能: I2C外设硬件反初始化配置
  * 输入参数: hi2c:I2C句柄类型指针
  * 返 回 值: 无
  * 说    明: 该函数被HAL库内部调用
  */
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
{
  if(hi2c->Instance==EEPROM_I2Cx)
  {
    /* 禁用外设时钟 */
    EEPROM_I2C_GPIO_CLK_DISABLE();
  
    /**I2C1 GPIO Configuration    
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA 
    */
    HAL_GPIO_DeInit(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SCL_PIN|EEPROM_I2C_SDA_PIN);
  }
}
/**
  * 函数功能: I2C通信错误处理函数
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 一般在I2C通信超时时调用该函数
  */
static void I2C_EEPROM_Error (void)
{
  /* 反初始化I2C通信总线 */
  HAL_I2C_DeInit(&hi2c_eeprom);
  
  /* 重新初始化I2C通信总线*/
  MX_I2C_EEPROM_Init();
  printf("EEPROM I2C通信超时!!! 重新启动I2C...\n");
}
/**
  * 函数功能: 通过I2C写入一个值到指定寄存器内
  * 输入参数: Addr:I2C设备地址
  *           Reg:目标寄存器
  *           Value:值
  * 返 回 值: 无
  * 说    明: 无
  */
void I2C_EEPROM_WriteData(uint16_t Addr, uint8_t Reg, uint8_t Value)
{
  HAL_StatusTypeDef status = HAL_OK;
  
  status = HAL_I2C_Mem_Write(&hi2c_eeprom, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, &Value, 1, I2cxTimeout);
  
  /* 检测I2C通信状态 */
  if(status != HAL_OK)
  {
    /* 调用I2C通信错误处理函数 */
    I2C_EEPROM_Error();
  }
}
/**
  * 函数功能: 通过I2C写入一段数据到指定寄存器内
  * 输入参数: Addr:I2C设备地址
  *           Reg:目标寄存器
  *           RegSize:寄存器尺寸(8位或者16位)
  *           pBuffer:缓冲区指针
  *           Length:缓冲区长度
  * 返 回 值: HAL_StatusTypeDef:操作结果
  * 说    明: 在循环调用是需加一定延时时间
  */
HAL_StatusTypeDef I2C_EEPROM_WriteBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length)
{
  HAL_StatusTypeDef status = HAL_OK;
  
  status = HAL_I2C_Mem_Write(&hi2c_eeprom, Addr, (uint16_t)Reg, RegSize, pBuffer, Length, I2cxTimeout); 
  /* 检测I2C通信状态 */
  if(status != HAL_OK)
  {
    /* 调用I2C通信错误处理函数 */
    I2C_EEPROM_Error();
  }        
  return status;
}
/**
  * 函数功能: 通过I2C读取一个指定寄存器内容
  * 输入参数: Addr:I2C设备地址
  *           Reg:目标寄存器
  * 返 回 值: uint8_t:寄存器内容
  * 说    明: 无
  */
uint8_t I2C_EEPROM_ReadData(uint16_t Addr, uint8_t Reg)
{
  HAL_StatusTypeDef status = HAL_OK;
  uint8_t value = 0;
  
  status = HAL_I2C_Mem_Read(&hi2c_eeprom, Addr, Reg, I2C_MEMADD_SIZE_8BIT, &value, 1, I2cxTimeout);
 
  /* 检测I2C通信状态 */
  if(status != HAL_OK)
  {
    /* 调用I2C通信错误处理函数 */
    I2C_EEPROM_Error();
  
  }
  return value;
}
/**
  * 函数功能: 通过I2C读取一段寄存器内容存放到指定的缓冲区内
  * 输入参数: Addr:I2C设备地址
  *           Reg:目标寄存器
  *           RegSize:寄存器尺寸(8位或者16位)
  *           pBuffer:缓冲区指针
  *           Length:缓冲区长度
  * 返 回 值: HAL_StatusTypeDef:操作结果
  * 说    明: 无
  */
HAL_StatusTypeDef I2C_EEPROM_ReadBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length)
{
  HAL_StatusTypeDef status = HAL_OK;
  status = HAL_I2C_Mem_Read(&hi2c_eeprom, Addr, (uint16_t)Reg, RegSize, pBuffer, Length, I2cxTimeout);
  
  /* 检测I2C通信状态 */
  if(status != HAL_OK)
  {
    /* 调用I2C通信错误处理函数 */
    I2C_EEPROM_Error();
  }        
  return status;
}
/**
  * 函数功能: 检测I2C设备是否处于准备好可以通信状态
  * 输入参数: DevAddress:I2C设备地址
  *           Trials:尝试测试次数
  * 返 回 值: HAL_StatusTypeDef:操作结果
  * 说    明: 无
  */
HAL_StatusTypeDef I2C_EEPROM_IsDeviceReady(uint16_t DevAddress, uint32_t Trials)
{ 
  return (HAL_I2C_IsDeviceReady(&hi2c_eeprom, DevAddress, Trials, I2cxTimeout));
}
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
  
 
 
 
 | 
bsp_EEPROM.h文件内容
bsp_EEPROM.c文件内容