首先说明下开发条件:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V4.23(F1 V1.60库)

3、硬件:AT24C02 256KByte

问题描述:Cubemx生成IIC代码会出现死机问题,或者压根运行不了!

问题原因:

1、ST为了规避飞利浦IIC专利问题,将STM32的硬件IIC设计的比较复杂,而且稳定性不怎么好,所以一般教程都不推荐使用。

2、Cubemx生成的代码有Bug!

解决办法:

1、设置

2、IIC的回调函数里面需要将时钟初始化放在引脚初始化之前!

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)

{

GPIO_InitTypeDef GPIO_InitStruct;

if(hi2c->Instance==I2C1)

{

/* USER CODE BEGIN I2C1_MspInit 0 */

__HAL_RCC_I2C1_CLK_ENABLE(); //默认生成的放在了引脚初始化后面!

/* USER CODE END I2C1_MspInit 0 */

/**I2C1 GPIO Configuration

PB6     ------> I2C1_SCL

PB7     ------> I2C1_SDA

*/

GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;

GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* Peripheral clock enable */

/* USER CODE BEGIN I2C1_MspInit 1 */

/* USER CODE END I2C1_MspInit 1 */

}

}

3、函数的具体应用需要结合AT24C02的数据手册,符合AT24C02的要求!

我们在读写IIC时,即使不知道IIC的协议是什么,直接调用 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) 这个函数就可以对IIC的设备进行读写,这就是Cubemx的优势!

我先解释下这个函数里面的几个变量:

I2C_HandleTypeDef *hi2c IIC的句柄

uint16_t DevAddress IIC设备的外部地址

uint16_t MemAddress IIC设备的内部地址

uint16_t MemAddSize 读写内部地址的方式,一般使用I2C_MEMADD_SIZE_8BIT方式

注意只有两种选择:I2C_MEMADD_SIZE_8BIT 或者 I2C_MEMADD_SIZE_16BIT

uint8_t *pData 写入的数组或者指针

uint16_t Size 写入的字节数!

注意:如果是AT24C02,这个字节数不能超过8!!!!!这也叫AT24C02的页写入!当然这是为了提高速度,如果你想不出错也不在乎速度,你可以将字节数设置为1,这样肯定不会出错!

    uint32_t Timeout 时间超时

4、程序实现

注意:需要在写函数后面加入短延时!

uint8_t I2c_Buf_Write[256];

uint8_t I2c_Buf_Read[256];

uint8_t I2C_Test(void)

{

uint16_t i;

i2cStatus=HAL_I2C_IsDeviceReady(&hi2c1, 0xA0, 256, 1000);  //0表示ready

printf("i2cStatus = %d\r\n ", i2cStatus);

i2cStatus1=HAL_I2C_GetState(&hi2c1);//32表示ready  HAL_I2C_STATE_READY  = 0x20U,   /*!< Peripheral Initialized and ready for use  */

printf("i2cStatus1 = %d\r\n ", i2cStatus1);

printf("写入的数据\n\r");

for ( i=0; i<256; i++ ) //填充缓冲

{

I2c_Buf_Write[i] = i;

HAL_I2C_Mem_Write(&hi2c1, (uint16_t)EEPROM_Block0_ADDRESS, i, I2C_MEMADD_SIZE_8BIT, (uint8_t*)(&(I2c_Buf_Write[i])), 1, 10000);//一个字节一个字节写,如果需要页写入(不超过8),使用40行的函数

// HAL_I2C_Mem_Write(&hi2c1, (uint16_t)EEPROM_Block0_ADDRESS, 0x00, I2C_MEMADD_SIZE_8BIT,(uint8_t*)I2c_Buf_Write, 8, 10000);//不能超过8个字节,如果超过需要分开写,for循环里面改为i=i+8

printf("0xX ", I2c_Buf_Write[i]);

HAL_Delay(5);//不能少

}

EEPROM_INFO("\n\r写成功\n\r");

HAL_Delay(500);

EEPROM_INFO("\n\r读出的数据\n\r");

//将EEPROM读出数据顺序保持到I2c_Buf_Read中

//if(HAL_I2C_GetState(&hi2c1) == 0x20 ) //加入检测

if( HAL_I2C_IsDeviceReady(&hi2c1, 0xA0, 256, 1000) == HAL_OK)//另外一种检测方法

{

HAL_I2C_Mem_Read(&hi2c1, (uint16_t)(EEPROM_Block0_ADDRESS+1 ),0x00, I2C_MEMADD_SIZE_8BIT,(uint8_t *)I2c_Buf_Read, 256, 10000); //读对字节数没有限制

}

//将I2c_Buf_Read中的数据通过串口打印

for (i=0; i<256; i++)

{

printf("0xX ", I2c_Buf_Read[i]);

if(I2c_Buf_Read[i] != I2c_Buf_Write[i])

{

EEPROM_ERROR("0xX ", I2c_Buf_Read[i]);

EEPROM_ERROR("错误:I2C EEPROM写入与读出的数据不一致\n\r");

return 0;

}

}

EEPROM_INFO("I2C(AT24C02)读写测试成功\n\r");

return 1;

}

5、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕!

2020.08.22重新学习记录:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V6.01(F1 V1.80库)

还有IIC的7bit地址是0x50,但是调用的函数需要的是8bit表示的这个地址应该是0xA0

很遗憾IIC的BUG还存在,而且如果使用FSMC的时候,IIC的配置会影响FSMC,两者一起用的时候要注意。

linux i2c dev.h freq,STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+IIC+AT24C02(修复官方例程读写死机bug)...相关推荐

  1. STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复官方例程日期不更新bug)

    首先说明下开发条件: 1.开发板:秉火霸道,STM32F103ZET 2.软件:Cubemx V4.23(F1 V1.60库) 问题描述:Cubemx生成RTC代码会出现时间可以更新,日期复位以后就不 ...

  2. linux i2c dev.h freq,Linux I2C总线控制器驱动(S3C2440)

    s3c2440的i2c控制器驱动(精简DIY),直接上代码,注释很详细: #include #include #include #include #include #include #include ...

  3. 基于全志A33开发板linux系统移植学习记录(Boot0)

    基于全志A33开发板linux系统移植学习记录 第一章 Boot0基于ARMGCC的编译与修改 文章目录 基于全志A33开发板linux系统移植学习记录 前言 一.全志A33简介以及上电引导流程 二. ...

  4. Linux 5.4 rc1发布: 正式支持Leez P710开发板(转载)

    在Linux 5.3 正式版本发布两周后,Linus发布了Linux 5.4的第一个候选版本.在这个版本中我们看到新增了Lockdown这一系统安全相关的重大特性,还增加了对 Microsoft  e ...

  5. 嵌入式Linux系统环境搭建全流程-4412友善之臂开发板

    4412友善之臂开发板-Linux系统环境搭建全流程 ​ 没错,这篇确实值得一看!可能是由于我稍微会一点点哈,就有好多小伙伴就找我帮他们搭建环境,但Linux中的以及开发版连接,与烧写程序中的整个环境 ...

  6. 基于stm32物联网开发板(1)

    基于stm32物联网开发板(1)   本开发板采用了STM32F103RET6作为核心CPU,72MHZ工作频率,512KB flash,64KB Sram.本开发平台外设模块有ESP8266 WIF ...

  7. 基于STM32战舰开发板的USMART调试组件的使用

    基于STM32战舰开发板的USMART调试组件的使用 USMART调试组件是什么? USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具.具体工作过程是通过串 ...

  8. 基于Arduino Uno开发板的红外遥控开发

    基于Arduino Uno开发板的红外遥控开发 1 准备 1.1 硬件与软件 1.2 走线 2 代码 2.1 ReceiveDump 2.2 SendRawDemo 1 准备 1.1 硬件与软件 单片 ...

  9. 基于ShineBlink物联网开发板和机智云平台开发的“针对短期内宠物无人照顾的智能宠物屋”系统

    正式介绍作品前先说明一下,我是湖南文理学院计算机与电气工程学院的一名大三学生,我叫陈海涛.作品全部内容均为个人创意.个人设计并手工制作,后期会考虑写论文投期刊,So!!严禁抄袭!抄袭必究! 该作品是用 ...

最新文章

  1. HTML5 学习笔记(一)- video
  2. COMET | 概念学习使机器具有人的思维方式
  3. 人工智能的恶意用途:预测、预防和缓解
  4. Laravel 手记(连接mysql)
  5. 彻底删除SharePoint 2010 Content Database
  6. jdbc mysql 远程数据库_jdbc 连接远程mysql数据库的有关问题
  7. db2 springboot 整合_[SpringBoot]快速配置多数据源(整合MyBatis)
  8. 阿维·阿斯平纳尔的闹钟——亨利·劳森
  9. PHP23 AJAX分页
  10. C Tricks(十六)—— 复制字符串
  11. animate改变背景颜色_3D MAX2016视口背景设置里各参数的含义详解 - 3dmax基础操作入门教程-3dmax材质教程,3d材质贴图教程参数,vray材质参数,3dmax贴图教程...
  12. 华中师范大学计算机学院郑,郑年亨-华中师范国家数字化研究中心
  13. 压缩JavaScript的宏
  14. vscode好用的扩展及常用的快捷键
  15. 希尔密码(加密、解密、破解)
  16. c语言某年某月某日的天数,输入某年某月某日,判断这一天是这一年的第几天...
  17. ThreadPoolExecutor源码分析
  18. Swift 周报 第十七期
  19. 大数据工程师技术栈探讨
  20. 7-4 计算存款利息(10 分)

热门文章

  1. c语言blackjack设计思路,写一个“BlackJack ”Java应用程序 该计划将测试你的逻辑思维。...
  2. Black Jack
  3. Codeforces 869C The Intriguing Obsession 组合数取模
  4. TCP/IP网络编程复习(上)
  5. 如何把一组计算机做成云,怎样才能把旧电脑变成云电脑呢?
  6. 电脑剪切,电脑剪切快捷键
  7. 中富金石马力老师:2022年中央一号文件发布 时隔多年重提加强粮库建设
  8. python 凸多边形面积
  9. 牛客网在线编程全部题目
  10. 小议去哪儿与太平洋电脑城^_^