关于STM32使用硬件i2c读写AT24C256实验遇到的问题
硬件环境:XNUCLEO开发板(STM32F411RCT6芯片)、MiniSTM32 V3.41开发板(STM32F103RCT6芯片)
软件环境:IAR for ARM 8.30.1、Keil5
现将工程代码附上:
stm32f1xx链接:https://download.csdn.net/download/u011727389/10935701
stm32f4xx链接:https://download.csdn.net/download/u011727389/10935673
下面介绍我做的几个实验:
一、软件模拟i2c实验
1、在ministm32开发板软件模拟i2c协议读写at24c02没有问题,也就是正点原子官方给的例子
2、分为下面两个步骤
a)在ministm32开发板,用开发板PB0、PB1分别接at24c256模块的SCL、SDA引脚,at24c256模块的VCC、GND接开发板的BOOT模块的3.3V、GND
b)将正点原子i2c实验的程序中EE_TYPE改成AT24C256,发现逻辑分析仪还是抓不到波形,按道理软件GPIO模拟i2c时序,比如,对于读操作,先要一个起始信号,发送从设备地址,发送需要读eeprom的地址,再接收需要读的数据(此时GPIO为输入模式),再发送停止信号。GPIO上的对应端口是有电压变化的,是应该可以抓到波形的,但却没抓到,那就应该分析GPIO端口配置是否有问题,对于stm32f1xx看寄存器GPIOX_CRL、GPIOX_CRH、AFIO。由于stm32f1xx有5组GPIO(A- E),每组16个端口(PX0-PX15),所以会有高低两个寄存器来配置这16个端口的上下拉。输入输出模式;对于AFIO,由于AFIO默认值是0,故如果选择的是使用默认复用端口,则不用配置,下面会介绍。
对照上图所示正确配置后(如果使用i2c1的PB6/7端口的话则不需要配置AFIO_MARP,因为默认值是0)stm32f1xx的i2c读 写功能正常了。
对于stm32f4xx需要看GPIOX_MODER、GPIOX_PUPDR、GPIOX_AFRL、GPIOX_AFRH,把这几个寄存器配置正确,i2c读写也正常了。
二、使用i2c控制器
1、在ministm32开发板用st公司的例子做修改(上面stm32f1xx链接),将其解压放在en.stm32cubef1 V1.7.0-》Projects-》STM32F103RB-Nucleo-》Examples-》I2C目录下,做实验发现可以读写,但逻辑分析仪抓到的读波形不正确。写波形的设备地址也不对。
at24c256的设备地址datasheet写的是MSB-》LSB:1 0 1 0 0 A1 A2 R/W,对于实验设置A1、A2为0,那么设备地址应该为0xA0,怎么会变成0x50,而0x50正好是右移一位的结果,这是想到了逻辑分析仪i2c设置的参数,选择了7-bit address bits only,所以抓出来是0x50,改过来就正确了,这个不影响抓到的数据。
对于读数据不对问题,仔细研读了软件模拟i2c时序,发现发送读写地址是一个16bit的数据,对照datasheet发现也是要求16bit地址,将8bit地址改成16bit地址之后发现写读数据比对通过。
2、在Xnueleo开发板用st公司的例子做修改(上面stm32f4xx链接),将其解压放在en.stm32cubef4 V1.23.0-》Projects-》STM32F411RE-Nucleo-》Examples_MIX-》I2C目录下,做实验发现可以读写,但逻辑分析仪抓不到波形,程序卡在了写完DR寄存器等待ADDR_FLAG上,都是官方例子改的,check double了代码没有问题,然后检查两个开发板之间和i2c通信模块at24c256的连接上,发现除了VCC有点差别其他无,这是重点在VCC上了一个是3.3v,一个是E5V,发现at24c256电压范围是2.7-5.5v,说明不是压值问题,然后仔细看Xncleo板子的E5V,将其连接到下载器的5v上,这肯定有电压,发现读写正常了,然后咨询并看了原理图,说明书发现E5V是外部电压,不是产生5v电压,真相终于大白,竟然是这么二的问题。。。这也提醒一定要仔细看手册。
关于STM32使用硬件i2c读写AT24C256实验遇到的问题相关推荐
- STM-32:I2C外设总线—硬件I2C读写MPU6050
目录 一.I2C外设简介 二.I2C框图 三.I2C基本结构 四.主机发送 五.主机接收 六.I2C的中断请求 七.软件/硬件波形对比 八.应用实例:硬件I2C读写MPU6050 8.1接线图 8.2 ...
- STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ.写在前面 上一篇文章是"STM32F10x_模拟I2C读写EEPROM",讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要 ...
- STM32通信硬件 I2C
20.1关于 I2C STM32F103系列的I²C控制器,可作为通信主机或从机,因此有四种工作模式可选择:主机发送模式.主机接收模式.从机发送模式.从机接收模式. 传输速度上,支持标准模式(Stan ...
- STM32单片机硬件I2C读取AHT10温湿度传感器数据
STM32使用硬件IIC读取AHT10温湿度传感器的数据并显示在0.96寸OLED屏上. 我用的单片机是STM32F103C8T6,程序用的是ST标准库写的. STM32使用硬件I2C读取SHTC3温 ...
- STM32的硬件I2C与AT24C16
刚学STM32的时候就听闻STM32的硬件I2C存在重大bug,会导致运行卡死在等待ACK的过程中,所以一直以来对其避而远之,转而以模拟I2C取代之.最近这段时间一直在用STM32 CubeMX,图形 ...
- STM32基于HAL工程硬件I2C读写AT24C02/04/08数据
STM32基于HAL工程硬件I2C读取AT24C02数据 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
- STM32CubeMX学习教程之十:硬件I2C读写AT24C02
完整源码下载: https://github.com/simonliu009/STM32CubeMX-hardware-I2C-AT24C02 网上有流传已久一种说法,就是STM的I2C有bug,不好 ...
- STM32单片机硬件I2C驱动程序(查询方式)
本文章原始地址:http://feotech.com/?p=69 本程序主要用于驱动STM32单片机芯片的硬件I2C寄存器,实现通过使用芯片自带的I2C寄存器进行数据的发送与接收. 本例程中采用I2C ...
- 关于 STM32 的硬件I2C
首先转两个帖子 http://blog.csdn.net/mcu_hong/article/details/8149311 http://bbs.21ic.com/icview-184741-1-1. ...
最新文章
- Java 开发Log4j 详细使用教程
- Vivado级联Modelsim仿真Re-launch问题
- eeglab中文教程系列(11)-使用ICA分解数据
- std::get(std::tuple)
- java强引用、软引用、弱引用、虚引用-Java的引用类型总共有四种,你都知道吗
- WebStorm调试Electron
- 数据结构:二分查找python实现
- python 声明变量类型_每日一课 | Python 检查变量的类型
- N使用exus2打造企业maven仓库(三)
- aop框架 php,xaop: 支持三种模式的AOP框架,弥补PHPer的不足,并且自带了文档的解析类库,可以一并使用,性能极好,欢迎 STAR 与 FORK。...
- [转载]C#获取DLL的目录
- python 计算时间_python的时间使用和时间计算
- P3223 [HNOI2012]排队
- 蛋白序列GO号注释及问题
- jsp购物车(session版)
- 数据库如何避免读取脏数据?
- 基于51单片机交通灯控制器(东西通行_南北通行_按键启动)
- Leetcode笔记 每日一题 824. 山羊拉丁文 (22.04.21)
- winpe linux系统安装win7,WINPE+LINUX+DOS 完美者U盘维护系统V8.6 及安装方法
- MDaemon功能篇之优先级邮件