刚学STM32的时候就听闻STM32的硬件I2C存在重大bug,会导致运行卡死在等待ACK的过程中,所以一直以来对其避而远之,转而以模拟I2C取代之。最近这段时间一直在用STM32 CubeMX,图形化设置界面屡试不爽,连USB这种复杂外设都能轻易完成初始化,想来I2C还算是比较简单的,而硬件I2C的时序又比较准,无论成败,还是值得一试的。为了简单起见,就先用AT24C64这种最基础的IIC设备进行测试。

CubeMX的配置

下面这些是我修改过的地方,只要注意I2C和系统时钟等基础配置即可,不想说太多,以图为言




AT24C64的自制库

AT24C64.c

#include "AT24C64.h"
#include "i2c.h"void AT24CXX_Write(u16 reg_address,u8 data)
{static HAL_StatusTypeDef i;i = HAL_I2C_Mem_Write(&hi2c1,AT24CXX_DEV_ADDRESS,reg_address,I2C_MEMADD_SIZE_16BIT,&data,1,100);AT24CXX_DELAY_MS(5);    //AT24C64的最长写入时间是5ms
}u8 AT24CXX_Read(u16 reg_address)
{u8 data = 0;u8 temp[2];temp[0] = reg_address>>8;temp[1] = reg_address;//HAL_I2C_Master_Transmit(&hi2c1,AT24CXX,temp,2,100);//HAL_I2C_Master_Receive(&hi2c1,AT24CXX,&data,1,100);HAL_I2C_Mem_Read(&hi2c1,AT24CXX_DEV_ADDRESS,reg_address,I2C_MEMADD_SIZE_16BIT,&data,2,100);return data;
}

AT24C64.h

/* * File:   AT24C64.h* Author: Administrator* AT24C64相关函数,需要制定IIC基本函数* Created on 2015年8月7日, 下午3:52*/#ifndef __AT24C64_H
#define __AT24C64_H#include "bsp.h"#define AT24CXX_DEV_ADDRESS     0xA0
#define AT24CXX_DELAY_MS        osDelaytypedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;void AT24CXX_Write(u16 reg_address,u8 data);
u8 AT24CXX_Read(u16 reg_address);#endif  /* __AT24C64_H */

值得注意的是AT24C64的地址是16位的,并且内部写EPPROM空间的时间最长为5ms,之前被这里坑了很久,差点以为I2C的库函数存在问题,所以上方的代码中尝试了多种读取参数的方式。

主循环代码

/* Infinite loop */for(;;){AT24CXX_Write(0x0001,0xA2);osDelay(4);i = AT24CXX_Read(0x0001);i = i+1;if(0 != i)    usb_printf((const char*)&i);osDelay(100);}

USB转串口的数据输出如下

STM32的硬件I2C与AT24C16相关推荐

  1. STM32单片机硬件I2C读取AHT10温湿度传感器数据

    STM32使用硬件IIC读取AHT10温湿度传感器的数据并显示在0.96寸OLED屏上. 我用的单片机是STM32F103C8T6,程序用的是ST标准库写的. STM32使用硬件I2C读取SHTC3温 ...

  2. STM32单片机硬件I2C驱动程序(查询方式)

    本文章原始地址:http://feotech.com/?p=69 本程序主要用于驱动STM32单片机芯片的硬件I2C寄存器,实现通过使用芯片自带的I2C寄存器进行数据的发送与接收. 本例程中采用I2C ...

  3. 关于 STM32 的硬件I2C

    首先转两个帖子 http://blog.csdn.net/mcu_hong/article/details/8149311 http://bbs.21ic.com/icview-184741-1-1. ...

  4. STM32单片机硬件I2C驱动程序(软件轮询方式)---摘自:FeoTech

    感谢原作者:FeoTech   原文网址:http://feotech.com/?p=69 本程序主要用于驱动STM32单片机芯片的硬件I2C寄存器,实现通过使用芯片自带的I2C寄存器进行数据的发送与 ...

  5. STM32通信硬件 I2C

    20.1关于 I2C STM32F103系列的I²C控制器,可作为通信主机或从机,因此有四种工作模式可选择:主机发送模式.主机接收模式.从机发送模式.从机接收模式. 传输速度上,支持标准模式(Stan ...

  6. 关于STM32使用硬件i2c读写AT24C256实验遇到的问题

    硬件环境:XNUCLEO开发板(STM32F411RCT6芯片).MiniSTM32 V3.41开发板(STM32F103RCT6芯片) 软件环境:IAR for ARM 8.30.1.Keil5 现 ...

  7. STM32 HAL 硬件I2C HTU21D

    主要用到stm32自带的库函数,因为库函数没有等待时间,所以不兼容,把程序拷贝出来重写,"I2C_RequestMemoryRead"函数的 "/* Generate R ...

  8. STM32硬件I2C的一点心得(AT24C32C和AT24C64C)

    前言 网上有些人说STM32的硬件I2C使用起来有问题,我用起来一点问题都没有,下面大致说一下最近做这个的心得 CubeMX设置 软件采用最新的CubeMX和SDK生成,芯片型号STM32F107RC ...

  9. stm32硬件I2C测试例程,亲测可用

    对于stm32的硬件I2C确实有不尽人意的地方.但是还是可以实现的,毕竟使用stm32的硬件I2C确实比使用IO口来模拟简单的多.下面的程序代码是使用stm32F03ZET6的I2C1(PB6,PB7 ...

最新文章

  1. 商汤提基于贪心超网络的One-Shot NAS,达到最新SOTA | CVPR 2020
  2. UA MATH565C 随机微分方程III Ito积分的构造
  3. java画个半径为1地圆_java - 绘制一个半径为圆的圆并围绕边缘指向 - 堆栈内存溢出...
  4. 使用ML.NET实现情感分析[新手篇]
  5. html首页 slider图片切换效果,jQuery插件Slider Revolution实现响应动画滑动图片切换效果...
  6. Java命令行界面(第30部分):观察
  7. python高手之路第三版_《Python高手之路(第3版)》——1.3 版本编号-阿里云开发者社区...
  8. 逻辑人渴望控制那些让他们感兴趣的东西
  9. android基础开发 书,Android 开发基础
  10. python字符串查找的四种方法_Python中的字符串查找操作方法总结
  11. Hibernate与MyBatis的区别
  12. 【sql server】“已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行“ 解决方案
  13. python装饰器 廖雪峰_python装饰器的一个妙用
  14. PHP二维数组:统计某个键名的相同键值个数
  15. 卧槽!华为工程师总结的Java笔记,太优秀了!
  16. 2019icpc计算机程序设计大赛,关于开展西安理工大学2019年程序设计竞赛暨ACM-ICPC大赛选拔赛的通知...
  17. HTML css把图片变圆,HTML+CSS:圆形和圆角图片格式
  18. 一键激活windows系统与office(绿色无捆绑装机员激活工具)
  19. Window平台Git-Bash的主题配置
  20. 终端模拟器编译c语言,开源一个Flutter编写的完整终端模拟器

热门文章

  1. amixer: Unable to find simple control 'Master',0
  2. 一套打通 Github 搜索语法
  3. 分治策略时间复杂度计算
  4. 区块链开发之windows环境配置
  5. 零基础想学习Web安全,如何入门?
  6. liunx更改root@后面的主机名
  7. 静态代理,JDK动态代理,Cglib动态代理详解
  8. 多元函数链导法则的理解
  9. PDN建立失败场景(二)
  10. 网络设备配置与管理-综合实验2