STM32CubeMx HAL库使用硬件IIC读写AT24C02
介绍使用硬件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相关推荐
- 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)
[STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...
- 【STM32cubeMX+HAL库】US100超声波模块原理篇
[STM32cubeMX+HAL库]US100超声波模块的使用 1.原理简介 US-100超声波测距模块可实现2cm4.5m的非接触测距功能,拥有2.45.5V的宽电压输入范围,静态功耗低于2mA,自 ...
- STM32硬件IIC读写EEPROM
前面一篇写了软件模拟IIC读写EEPROM. 本篇介绍硬件IIC读写EEPROM.平台是STM32F103+AT24C04N.SDA和SCL接5K上拉电阻到3.3v. 首先介绍AT24C04N的基本特 ...
- STM32CubeMX | HAL库的ADC多通道数据采集(轮训、DMA、DMA+TIM)、读取内部传感器温度
STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+TIM).读取内部传感器温度 目录 STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+ ...
- STM32 (基于HAL库) 硬件IIC读写任意AT24CXX芯片
HAL任意AT24Cxx芯片读写: 原理我就不讲了,直接实操: 一.配置 1.使用STM32CUBEMX进行引脚配置,IIC配置如下: 2.利用串口进行数据查看,串口配置如下: 3.时钟我们选择最高7 ...
- STM32H7系列使用硬件IIC读写EEPROM(HAL库配置源码)
记得在使用STM32F103系列时,好多人说其硬件IIC通讯不稳定.后来我们用到了STM32H743的单片机,使用了其硬件IIC对EEPROM进行读写.硬件IIC使用并不麻烦,而且相比于I/O模拟的I ...
- STM32基于HAL工程硬件I2C读写AT24C02/04/08数据
STM32基于HAL工程硬件I2C读取AT24C02数据 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
- DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信
本篇详细的记录了如何使用STM32CubeMX配置STM32F103C8T6的硬件SPI外设与DW1000通信,为移植DW1000官方驱动打下基础. 1. 准备工作 硬件准备 开发板 首先需要准备一个 ...
- STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用
此为软件模拟IIC,可以直接移植到HAL库使用..h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论. 使用的时候只需要更改SDA 和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是 ...
最新文章
- GOF23设计模式(创建型模式)建造者模式
- mysql 5.7 编译_Mysql5.7版本编译安装及配置
- 基于转移学习的图像识别
- Android 实现歌曲播放时歌词同步显示
- python的工资为什么这么低-你拿着3k的工资,不明白为什么别人年薪 200万
- python中一些特殊方法的作用
- 王道 —— 进程互斥的软件实现方法
- LinuxCentos7 防火墙开放端口,查看状态,查看开放端口
- Github的README中插入图片,Github仓库项目主页显示图片
- vue报错RangeError: Maximum call stack size exceeded
- wps怎么免费导出简历_WPS表格办公—一键添加简历模板
- 微信小程序网络请求服务器php接口获取数据库数据信息
- (10.1.4)拟物设计
- c语言百分号-5.2f什么意思,c语言中的%d跟%5.2f有什么区别
- 一起来自制水果甜品吧
- 从1万到100万的理财法则
- 多边形颜色填充-X扫描线算法
- echart图表(自定义提示框) 鼠标移动到数据展示区自定义展示提示框 天/时/分/秒
- 星来客机器人餐厅_星战来客——韩国“机器人士兵”小记
- 新浪微博开发之微博主页的实现
热门文章
- k均值例子 数据挖掘_人工智能、数据挖掘、机器学习和深度学习的关系
- django国际化与html语言,Django 国际化
- 华为OV小米鸿蒙,华为鸿蒙开源,小米OV们会采用吗?
- incc与oracle连接_Oracle 连接和会话的区别
- C++从0到1的入门级教学(二)——数据类型
- ad如何设置pcb板子形状_手把手教你在PCB上添加泪滴
- Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法
- 本地搭建wp,更新升级时需要ftp的解决办法
- VS2010删除所有断点时不弹出提示窗口
- 前端学习(3267):js中this在类中的表现