历史上的今天
今天是:2025年04月02日(星期三)
2019年04月02日 | 【STM32CUBEMX】 I2C Slave 实现
2019-04-02 来源:eefocus
背景
最近,在使用 STM32F030C8T6 做 I2C Slave 设备接口。在网上查了好多的资料,使用 STM32 硬件 I2C 的例程少之又少,对 STM32 硬件 I2C 的批判巨多,只能硬着头皮,自己一步一步摸索。
实际上,在这次硬件 I2C 调试之前,其实我已经通过 IO 模拟的方式实现了 I2C,但速率仅能实现 Standard-mode(up to 100 kbit/s)。对于 Fast-mode(up to 400 kbit/s),IO 模拟方式简直是无能为力。同时,由于 IO 模拟 I2C 时并没有充分的考虑架构,最终的实现结果是功能单一,客户满意度不好。
I2C 实现方式
经过多次纠结和考虑,我决定采用Dummy Write + Register 方式进行 I2C 通讯。这样的好处,在于用户使用方便,对于后续的功能增加或需求变化,对客户接口完全无影响,只需要修改寄存器列表就 OK。这个也是参考了几个 I2C接口的芯片决定的。
Dummy Write
Dummy Write 要求 Master 访问 Slave 时,必须发送两次的从机地址。同时对于 STM32 HAL 的 Slave Receive 或 Write ,都必须指定长度,因此,在 第一次写操作中, Master 发送了 寄存器地址和写入数据的长度。时序图如下图所示。

程序源码位于:https://github.com/CherryXiuHuaWoo/STM32F030C8-IIC-Slave 。
记录各种坑爹
第 1 次调试结果:总线挂了
第一次 Master Write 时,通讯完成。
第二次 Master Write 时,在 Address + Write 后, SDA 被置为 Low,导致总线被占用,无法再继续通讯。


第 2 次调试结果:基本调通了 Write/Read
通过在每次地址中断回调函数HAL_I2C_AddrCallback处理完成后,增加 HAL_I2C_EnableListen_IT(&hi2c1),不再出现第一次调试问题,可反复通讯。
Bug 分析:
通过查看调用HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode) 的代码部分。
发现,在I2C_ITAddrCplt 函数中,在调用 HAL_I2C_AddrCallback 回调函数前,有调用 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT)把中断关了!!!!!!之后也没有恢复中断,所以用户必须自行把中断打开!!!!!!
第 3 次调试:DUMMYWrite 后,总线挂了
这个总线挂了是我还没有编写DuMMYWrite后的处理代码所导致。

第 4 次调试:DUMMYWrtie 读写正常
读时序:

写时序:

上一篇:STM32学习之I2C
史海拾趣
|
数模转换器(DAC)是非常通用的器件,其能力远远超出电平设置的范畴,而且延伸到通信、视频、音频、电位计和替代可变电阻器、信号合成以及许多其它应用。 DAC的一些技术指标 DAC是最基本最重要的混合信号构建模块,其输出可以是单端 ...… 查看全部问答> |
|
无线传感器网络标准ZigBee要有麻烦了。一家与无线传感器技术相竞争的公司最近推出了基于通用网络标准IP的产品。 基于IP:可与企业网相连 PhyNet就是这家名为Arch Rock的公司新推出的产品,同ZigBee一样,它也可 ...… 查看全部问答> |
|
replyreload += \',\' + 374033; 1、倒装(Flip chip) 1998年Lumileds公司封装出世界上第一个大功率LED(1W LUXOEN器件),使LED器件从以前的指示灯应用变成可以替代传统照明的新型固体光源,引发了人类历史上继白炽灯发明以来的又一场 ...… 查看全部问答> |
|
我用c#做了一个wince下的看图程序,每当打开一个大于1.5mb的图片时就出错,提示outofmemoryexception错误,而有些文章上介绍用SHloadImagefile但是为什么c# api中没有呢,大家有没有好的解决方法,如果c#中有那么他在那个动态库下呀,谢谢各位大哥 ...… 查看全部问答> |
|
所谓最简, 包括所有基本设置,基本文件------主要是包括maim() while1{}===========当然,在while1{}之前或者内部,添加程序,可以执行....哪位 有??… 查看全部问答> |
|
现场可编程门阵列(FPGA)是可以包括数千个典型的、可编程逻辑单元。一个由线和可编程开关的矩阵与单独的逻辑单元互连。典型的设计包括指定每个单元的简单逻辑功能和选择性地关闭互连矩阵中的开关。 FPGA主要用于原型IC系统。当 ...… 查看全部问答> |
|
最近使一个msp430f149和国产的usb芯片ch372,之前以为会很麻烦,结果用了labview的visa,居然可以生成usb芯片的驱动,然后就可以利用usb协议的批量(bulk)管道直接上下传数据,官方提供的dll都不用了。想了解的可以联系我,这个我已经弄好了。 问 ...… 查看全部问答> |




