linux i2c dev.h freq,STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+IIC+AT24C02(修复官方例程读写死机bug)...
首先说明下开发条件:
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)...相关推荐
- STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复官方例程日期不更新bug)
首先说明下开发条件: 1.开发板:秉火霸道,STM32F103ZET 2.软件:Cubemx V4.23(F1 V1.60库) 问题描述:Cubemx生成RTC代码会出现时间可以更新,日期复位以后就不 ...
- linux i2c dev.h freq,Linux I2C总线控制器驱动(S3C2440)
s3c2440的i2c控制器驱动(精简DIY),直接上代码,注释很详细: #include #include #include #include #include #include #include ...
- 基于全志A33开发板linux系统移植学习记录(Boot0)
基于全志A33开发板linux系统移植学习记录 第一章 Boot0基于ARMGCC的编译与修改 文章目录 基于全志A33开发板linux系统移植学习记录 前言 一.全志A33简介以及上电引导流程 二. ...
- Linux 5.4 rc1发布: 正式支持Leez P710开发板(转载)
在Linux 5.3 正式版本发布两周后,Linus发布了Linux 5.4的第一个候选版本.在这个版本中我们看到新增了Lockdown这一系统安全相关的重大特性,还增加了对 Microsoft e ...
- 嵌入式Linux系统环境搭建全流程-4412友善之臂开发板
4412友善之臂开发板-Linux系统环境搭建全流程 没错,这篇确实值得一看!可能是由于我稍微会一点点哈,就有好多小伙伴就找我帮他们搭建环境,但Linux中的以及开发版连接,与烧写程序中的整个环境 ...
- 基于stm32物联网开发板(1)
基于stm32物联网开发板(1) 本开发板采用了STM32F103RET6作为核心CPU,72MHZ工作频率,512KB flash,64KB Sram.本开发平台外设模块有ESP8266 WIF ...
- 基于STM32战舰开发板的USMART调试组件的使用
基于STM32战舰开发板的USMART调试组件的使用 USMART调试组件是什么? USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具.具体工作过程是通过串 ...
- 基于Arduino Uno开发板的红外遥控开发
基于Arduino Uno开发板的红外遥控开发 1 准备 1.1 硬件与软件 1.2 走线 2 代码 2.1 ReceiveDump 2.2 SendRawDemo 1 准备 1.1 硬件与软件 单片 ...
- 基于ShineBlink物联网开发板和机智云平台开发的“针对短期内宠物无人照顾的智能宠物屋”系统
正式介绍作品前先说明一下,我是湖南文理学院计算机与电气工程学院的一名大三学生,我叫陈海涛.作品全部内容均为个人创意.个人设计并手工制作,后期会考虑写论文投期刊,So!!严禁抄袭!抄袭必究! 该作品是用 ...
最新文章
- HTML5 学习笔记(一)- video
- COMET | 概念学习使机器具有人的思维方式
- 人工智能的恶意用途:预测、预防和缓解
- Laravel 手记(连接mysql)
- 彻底删除SharePoint 2010 Content Database
- jdbc mysql 远程数据库_jdbc 连接远程mysql数据库的有关问题
- db2 springboot 整合_[SpringBoot]快速配置多数据源(整合MyBatis)
- 阿维·阿斯平纳尔的闹钟——亨利·劳森
- PHP23 AJAX分页
- C Tricks(十六)—— 复制字符串
- animate改变背景颜色_3D MAX2016视口背景设置里各参数的含义详解 - 3dmax基础操作入门教程-3dmax材质教程,3d材质贴图教程参数,vray材质参数,3dmax贴图教程...
- 华中师范大学计算机学院郑,郑年亨-华中师范国家数字化研究中心
- 压缩JavaScript的宏
- vscode好用的扩展及常用的快捷键
- 希尔密码(加密、解密、破解)
- c语言某年某月某日的天数,输入某年某月某日,判断这一天是这一年的第几天...
- ThreadPoolExecutor源码分析
- Swift 周报 第十七期
- 大数据工程师技术栈探讨
- 7-4 计算存款利息(10 分)
热门文章
- c语言blackjack设计思路,写一个“BlackJack ”Java应用程序 该计划将测试你的逻辑思维。...
- Black Jack
- Codeforces 869C The Intriguing Obsession 组合数取模
- TCP/IP网络编程复习(上)
- 如何把一组计算机做成云,怎样才能把旧电脑变成云电脑呢?
- 电脑剪切,电脑剪切快捷键
- 中富金石马力老师:2022年中央一号文件发布 时隔多年重提加强粮库建设
- python 凸多边形面积
- 牛客网在线编程全部题目
- 小议去哪儿与太平洋电脑城^_^