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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2013农业银行存款利率表

From: http://www.southmoney.com/yinhang/cunkuan/473061.html 2013农业银行存款利率表 中国人民银行决定&#xff0c;自2012年7月6日起下调金融机构人民币存贷款基准利率。金融机构一年期存款基准利率下调0.25个百分点&#xff0c;一年期贷款基准利率下调0.31个百分点&#…

第十篇 PO核心功能及流程详解

详见链接&#xff1a;http://bbs.erp100.com/thread-272866-1-1.html1. P2P lifecycleP2P是procure to pay的缩写&#xff0c;p2p循环值得就是采购到付款的周而复始&#xff0c;循环往复的过程。主要包含六个大的环节&#xff0c;需求&#xff08;demand&#xff09;&#xff0…

[react] react中调用setState会更新的生命周期有哪几个?

[react] react中调用setState会更新的生命周期有哪几个&#xff1f; (>16.4之后&#xff0c;与props的更新一致&#xff0c; <16.4的版本没有static getDerivedStateFromProps) static getDerivedStateFromPropsshouldComponentUpdaterendergetSnapshotBeforeUpdatecom…

Qt ModbusTCP ModbusRTU 使用同步读和异步写

使用Qt自带的库开发&#xff0c;添加相关头文件 #include <QModbusTcpClient> #include <QModbusReply> #include <QSerialPort> #include <QModbusDataUnit> #include <QModbusRtuSerialMaster> 一、寄存器说明 Modbus寄存器的操作包括读写和…

最新银行存款利率表2013

From: http://www.southmoney.com/yinhang/cunkuan/469894.html 最新银行存款利率表2013 中国人民银行决定&#xff0c;自2012年7月6日起下调金融机构人民币存贷款基准利率。金融机构一年期存款基准利率下调0.25个百分点&#xff0c;一年期贷款基准利率下调0.31个百分点&#…

STM32F407 CubeMx使用定时器测量信号频率 分辨率0.001Hz

一、需求 使用STM32F407 测量外部输入方波信号的周期&#xff0c;信号变化范围&#xff1a;45HZ~55HZ&#xff0c;测量分辨率0.001HZ。 二、配置 stm32Cubemx&#xff1a;version 6.1.1HAL库&#xff1a;1.25.2MDK&#xff1a;5.34C Compiler&#xff1a;ARMCC 6.16 三、分…

[react] 你有在项目中使用过Yeoman脚手架吗?

[react] 你有在项目中使用过Yeoman脚手架吗&#xff1f; 前端工程化脚手架部分必备的依赖&#xff0c;用于初始化生成规范的项目目录 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣…

中移M5310A NBIoT模组通信测试命令

总结一下中移M5310A NBIoT模组的常用测试命令&#xff0c;这个命令是个脚本&#xff0c;可以编辑&#xff0c;在自己开发的串口软件上可用&#xff0c;有需要的请留言。 脚本是.ini格式的文件&#xff0c;可以直接编辑文件然后加载到脚本区。字段用\t分割。 [General] msg0don…

Ubuntu中输入apt-get找不到安装包怎么办?

今天租了一台阿里云ECS&#xff0c;在输入apt-get install mysql-client安装mysql-client时&#xff0c;终端却给我提醒404错误&#xff0c;找不到该软件包。唉呀我去&#xff0c;心中一万头草泥马奔腾而过。根据我玩了一年的Linux经验来看&#xff0c;因为ECS到手了&#xff0…

[react] react中修改prop引发的生命周期有哪几个?

[react] react中修改prop引发的生命周期有哪几个&#xff1f; static getDerivedStateFromPropsshouldComponentUpdaterendergetSnapshotBeforeUpdatecomponentDidUpdate个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。…

11月中30个精心设计的网站案例精选

如果你开始设计一个网站&#xff0c;首先你需要在你的头脑构思的是如何使网站有丰富的视觉感应和排版。现在每天的网络竞争太激烈&#xff0c;如果你的网站设计的一般般&#xff0c;恐怕很难把访问者的目光定睛在你的网站上。因此网站有美丽和创意设计的不仅能吸引游客&#xf…

undefined reference to `vtable for XX::XX'

From: http://mylovejsj.blog.163.com/blog/static/386739752009010043162/ 在Qt中会一不小心遇到一个编译错误&#xff1a;"undefined reference to vtable for...", 如果你是第一次遇到这种问题还真不知怎么办&#xff1f;到网上一搜&#xff0c;很多什么关于解…

Qt定时器的精度问题

一、场景 一个网络音频采集场景如下&#xff1a; 数据发送端&#xff1a;嵌入式设备按照16kHz 16Bit连续不断采集音频数据&#xff0c;通过Socket进行发送 数据接受端&#xff1a;QT上位机开一个tcpserver&#xff0c;数据readReady后由QByteArray进行追加&#xff0c;音频波…

ConcurrentModificationException异常解决办法

今天在写一个带缓存功能的访问代理程序时出现了java.util.ConcurrentModificationException异常&#xff0c; 因为该异常是非捕获型异常而且很少见&#xff0c;所以费了些时间才找到问题所在&#xff0c;原来在通过Iterator进行遍历的时候&#xff0c;如果直接对HashMap进行操作…

[react] React.createClass和extends Component的区别有哪些?

[react] React.createClass和extends Component的区别有哪些&#xff1f; 1.语法 React.createClass和extends采用函数构造 extends Component采用类构造 2.propType 和 getDefaultProps React.createClass&#xff1a;通过proTypes对象和getDefaultProps()方法来设置和获取p…

iperf 测试局域网速度

介绍 iperf使用cs架构&#xff0c;启用一台设备作为server&#xff0c;另一台设备作为client&#xff0c;测试server和lclient的网络速度。 linux 安装 sudo apt install iperf 使用方法 &#xff08;1&#xff09;服务器端 iperf -s 启用tcp连接&#xff0c;默认监控端口…

纯虚函数--抽象类中的this到底指的是哪个子类实例呢

抽象类中的this到底指的是哪个子类实例呢&#xff1f;请看代码&#xff1a; thread.h #ifndef __THREAD_H__ #define __THREAD_H__#include <iostream>#define PATTERN_SINGLETON_DECLARE(classname) \ private: \classname(); \ public: \st…

NHibernate初学者指南(6):映射模型到数据库之方式二

使用Fluent NHibernate自动映射 使用Fluent NHibernate自动映射&#xff0c;首先要将映射的实体放到一个命名空间中&#xff0c;这使得通知AutoMapper哪些实体和值对象包含在映射中更容易。建议在你的项目中创建一个Domain文件夹&#xff0c;将需要映射的实体和值对象放到这个文…

解决升级mac os X EI Capitan后遇到LibclangError: dlopen(libclang.dylib, 6): image not found.的问题...

打开文件./frameworks/cocos2d-x/tools/bindings-generator/clang/cindex.py 把第 3395 行 改为 &#xff1a; library cdll.LoadLibrary("../bindings-generator/libclang/" self.get_filename())转载于:https://www.cnblogs.com/HemJohn/p/4978859.html

[react] 高阶组件(HOC)有哪些优点和缺点?

[react] 高阶组件(HOC)有哪些优点和缺点&#xff1f; HOC 优点 通过传递props去影响内层组件的状态&#xff0c;不直接改变内层组件的状态&#xff0c;降低了耦合度 缺点 组件多层嵌套&#xff0c; 增加复杂度与理解成本 ref隔断&#xff0c; React.forwardRef 来解决 高阶组件…