介绍使用硬件IIC接口读写AT24C02,STM32自带硬件IIC,比较好用,没必要千篇一律的使用模拟IIC。作为一个IIC的使用例子,可以适当修改用于其他IIC接口设备通信控制。

一、测试环境

STM32F407+CubeMx(6.1.1)+MDK(5.34)+AT24C02

IIC Pin:PB8 PB9

CubeMx配置如下:

二、I2C驱动代码

CubeMx生成i2c.c i2c.h。读写使用HAL库的IIC操作接口:

/*** @brief  Write an amount of data in blocking mode to a specific memory address* @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains*                the configuration information for the specified I2C.* @param  DevAddress Target device address: The device 7 bits address value*         in datasheet must be shifted to the left before calling the interface* @param  MemAddress Internal memory address* @param  MemAddSize Size of internal memory address* @param  pData Pointer to data buffer* @param  Size Amount of data to be sent* @param  Timeout Timeout duration* @retval HAL status*/
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);/*** @brief  Read an amount of data in blocking mode from a specific memory address* @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains*                the configuration information for the specified I2C.* @param  DevAddress Target device address: The device 7 bits address value*         in datasheet must be shifted to the left before calling the interface* @param  MemAddress Internal memory address* @param  MemAddSize Size of internal memory address* @param  pData Pointer to data buffer* @param  Size Amount of data to be sent* @param  Timeout Timeout duration* @retval HAL status*/
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);

三、AT24C02驱动代码

头文件:at24c02.h

代码里边写了一个测试用例的宏开关,测试阶段打开AT24CXX_TEST_ENABLE,配置需要测试的起始地址AT24CXX_TEST_ADDR和测试读写长度AT24CXX_TEST_SIZE,调用AT24C02_Test()进行测试,返回值表示读写出错的数据个数。

例如:

OS_msgPrintf("AT24C02_Test err = %d\r\n",AT24C02_Test());

打印:AT24C02_Test err = 0

表示指定测试地址和长度读写成功。

/******************************************************************************** File Name          : at24c02.h* Description        : this code is used for at24c02 application* Author             : JackWang* Date               : 2019-05-07******************************************************************************
*/#ifndef __AT24C02_H
#define __AT24C02_H#ifdef __cplusplusextern "C" {
#endif/*! -------------------------------------------------------------------------- */
/*! Include headers */
#include <stdint.h>#define AT24CXX_TEST_ENABLE     0/*! -------------------------------------------------------------------------- */
/*! Public functions prototype */
int AT24C02_write(uint8_t addr, uint8_t* dataPtr, uint16_t dataSize);
int AT24C02_read (uint8_t addr, uint8_t* dataPtr, uint16_t dataSize);#if (1 == AT24CXX_TEST_ENABLE)
/*! -------------------------------------------------------------------------- */
/*! Public test functions prototype */
#define AT24CXX_TEST_ADDR       39
#define AT24CXX_TEST_BUFF_SIZE  255
#define AT24CXX_TEST_SIZE       90int AT24C02_Test(void);
#endif#ifdef __cplusplus
}
#endif#endif
/*! end of the file */

实现文件:at24c02.c

读写采用了扇区Page读写方式,可以给定任意有效地址和有效长度进行操作,方便应用层调用。

移植代码时注意头文件sysdelay.h换成自己的延时函数文件。主要是实现delayms。

/******************************************************************************** File Name          : at24c02.c* Description        : this code is used for at24c02 application* Author             : JackWang* Date               : 2019-05-07******************************************************************************
*//*! -------------------------------------------------------------------------- */
/*! Include headers */
#include "at24c02.h"
#include "sysdelay.h"
#include "i2c.h"/*! -------------------------------------------------------------------------- */
/*! Private macros define */
#define AT24CXX_Write_ADDR 0xA0
#define AT24CXX_Read_ADDR  0xA1
#define AT24CXX_MAX_SIZE   256
#define AT24CXX_PAGE_SIZE  8
#define AT24CXX_PAGE_TOTAL (AT24CXX_MAX_SIZE/AT24CXX_PAGE_SIZE)/*! -------------------------------------------------------------------------- */
/*! Public functions list */
int AT24C02_write(uint8_t addr, uint8_t* dataPtr, uint16_t dataSize);
int AT24C02_read (uint8_t addr, uint8_t* dataPtr, uint16_t dataSize);/*! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
int
AT24C02_write(uint8_t addr, uint8_t* dataPtr, uint16_t dataSize)
{if (0 == dataSize) { return -1; }int res = HAL_OK;int selectPage_idx  = addr % AT24CXX_PAGE_SIZE;int selectPage_rest = AT24CXX_PAGE_SIZE - selectPage_idx;if (dataSize <= selectPage_rest) {res = HAL_I2C_Mem_Write(&hi2c1, AT24CXX_Write_ADDR, addr,I2C_MEMADD_SIZE_8BIT, dataPtr,dataSize,0xFF);if (HAL_OK != res) { return -1; }sysDelay_ms(10);} else {/*! 1 write selectPage rest*/res = HAL_I2C_Mem_Write(&hi2c1, AT24CXX_Write_ADDR, addr,I2C_MEMADD_SIZE_8BIT, dataPtr,selectPage_rest,0xFF);if (HAL_OK != res) { return -1; }addr     += selectPage_rest;dataSize -= selectPage_rest;dataPtr  += selectPage_rest;sysDelay_ms(5);/*! 2 write nextPage full */int fullPage = dataSize/AT24CXX_PAGE_SIZE;for (int iPage = 0; iPage < fullPage; ++iPage) {res = HAL_I2C_Mem_Write(&hi2c1, AT24CXX_Write_ADDR, addr,I2C_MEMADD_SIZE_8BIT, dataPtr,AT24CXX_PAGE_SIZE,0xFF);if (HAL_OK != res) { return -1; }sysDelay_ms(5);addr     += AT24CXX_PAGE_SIZE;dataSize -= AT24CXX_PAGE_SIZE;dataPtr  += AT24CXX_PAGE_SIZE;}/*! 3 write rest */if (0 != dataSize) {res = HAL_I2C_Mem_Write(&hi2c1, AT24CXX_Write_ADDR, addr,I2C_MEMADD_SIZE_8BIT, dataPtr,dataSize,0xFF);if (HAL_OK != res) { return -1; }sysDelay_ms(5);}}return 0;
}/*! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
int
AT24C02_read(uint8_t addr, uint8_t* dataPtr, uint16_t dataSize)
{int res = HAL_I2C_Mem_Read(&hi2c1,AT24CXX_Read_ADDR,addr,I2C_MEMADD_SIZE_8BIT,dataPtr,dataSize,0xFF);if (HAL_OK != res) { return -1; }return 0;
}#if (1 == AT24CXX_TEST_ENABLE)
/*! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
#include <string.h>
static uint8_t AT24CXX_testBuff[AT24CXX_TEST_BUFF_SIZE];int
AT24C02_Test(void)
{    for (int idx = 0; idx < AT24CXX_TEST_BUFF_SIZE; ++idx) {AT24CXX_testBuff[idx] = idx;}AT24C02_write(AT24CXX_TEST_ADDR, AT24CXX_testBuff+AT24CXX_TEST_ADDR, AT24CXX_TEST_SIZE);memset(AT24CXX_testBuff, 0, AT24CXX_TEST_BUFF_SIZE);AT24C02_read(AT24CXX_TEST_ADDR, AT24CXX_testBuff, AT24CXX_TEST_SIZE);  int err = 0;for (int idx = 0; idx < AT24CXX_TEST_SIZE; ++idx) {if ((AT24CXX_TEST_ADDR+idx) != AT24CXX_testBuff[idx]) err++;}return err;}
#endif

总体上代码还算简洁,供大家参考使用。

STM32CubeMx HAL库使用硬件IIC读写AT24C02相关推荐

  1. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)

    [STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...

  2. 【STM32cubeMX+HAL库】US100超声波模块原理篇

    [STM32cubeMX+HAL库]US100超声波模块的使用 1.原理简介 US-100超声波测距模块可实现2cm4.5m的非接触测距功能,拥有2.45.5V的宽电压输入范围,静态功耗低于2mA,自 ...

  3. STM32硬件IIC读写EEPROM

    前面一篇写了软件模拟IIC读写EEPROM. 本篇介绍硬件IIC读写EEPROM.平台是STM32F103+AT24C04N.SDA和SCL接5K上拉电阻到3.3v. 首先介绍AT24C04N的基本特 ...

  4. STM32CubeMX | HAL库的ADC多通道数据采集(轮训、DMA、DMA+TIM)、读取内部传感器温度

    STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+TIM).读取内部传感器温度 目录 STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+ ...

  5. STM32 (基于HAL库) 硬件IIC读写任意AT24CXX芯片

    HAL任意AT24Cxx芯片读写: 原理我就不讲了,直接实操: 一.配置 1.使用STM32CUBEMX进行引脚配置,IIC配置如下: 2.利用串口进行数据查看,串口配置如下: 3.时钟我们选择最高7 ...

  6. STM32H7系列使用硬件IIC读写EEPROM(HAL库配置源码)

    记得在使用STM32F103系列时,好多人说其硬件IIC通讯不稳定.后来我们用到了STM32H743的单片机,使用了其硬件IIC对EEPROM进行读写.硬件IIC使用并不麻烦,而且相比于I/O模拟的I ...

  7. STM32基于HAL工程硬件I2C读写AT24C02/04/08数据

    STM32基于HAL工程硬件I2C读取AT24C02数据 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!

  8. DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信

    本篇详细的记录了如何使用STM32CubeMX配置STM32F103C8T6的硬件SPI外设与DW1000通信,为移植DW1000官方驱动打下基础. 1. 准备工作 硬件准备 开发板 首先需要准备一个 ...

  9. STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用

    此为软件模拟IIC,可以直接移植到HAL库使用..h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论. 使用的时候只需要更改SDA 和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是 ...

最新文章

  1. GOF23设计模式(创建型模式)建造者模式
  2. mysql 5.7 编译_Mysql5.7版本编译安装及配置
  3. 基于转移学习的图像识别
  4. Android 实现歌曲播放时歌词同步显示
  5. python的工资为什么这么低-你拿着3k的工资,不明白为什么别人年薪 200万
  6. python中一些特殊方法的作用
  7. 王道 —— 进程互斥的软件实现方法
  8. LinuxCentos7 防火墙开放端口,查看状态,查看开放端口
  9. Github的README中插入图片,Github仓库项目主页显示图片
  10. vue报错RangeError: Maximum call stack size exceeded
  11. wps怎么免费导出简历_WPS表格办公—一键添加简历模板
  12. 微信小程序网络请求服务器php接口获取数据库数据信息
  13. (10.1.4)拟物设计
  14. c语言百分号-5.2f什么意思,c语言中的%d跟%5.2f有什么区别
  15. 一起来自制水果甜品吧
  16. 从1万到100万的理财法则
  17. 多边形颜色填充-X扫描线算法
  18. echart图表(自定义提示框) 鼠标移动到数据展示区自定义展示提示框 天/时/分/秒
  19. 星来客机器人餐厅_星战来客——韩国“机器人士兵”小记
  20. 新浪微博开发之微博主页的实现

热门文章

  1. k均值例子 数据挖掘_人工智能、数据挖掘、机器学习和深度学习的关系
  2. django国际化与html语言,Django 国际化
  3. 华为OV小米鸿蒙,华为鸿蒙开源,小米OV们会采用吗?
  4. incc与oracle连接_Oracle 连接和会话的区别
  5. C++从0到1的入门级教学(二)——数据类型
  6. ad如何设置pcb板子形状_手把手教你在PCB上添加泪滴
  7. Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法
  8. 本地搭建wp,更新升级时需要ftp的解决办法
  9. VS2010删除所有断点时不弹出提示窗口
  10. 前端学习(3267):js中this在类中的表现