完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我正在尝试运行一个简单的 I2C 连接,而 STM32L052 上的 I2C1 外设让我很难受。这是我到目前为止所做的:
我已经使用带中断的 I2C2 为 STM32L053 编写了一个简单的驱动程序。我已经在几个不同的奴隶身上试过了——它没有任何问题,无论是阅读还是写作。我使用 4.7kOhm 上拉,SCL 时钟为 100kHz,主从均由 3v3 LDO 供电,时钟为 HSI@16MHz。在连续的 I2C 传输之间有 5us 的延迟(从属设备需要)。这是代码:
从字面上看,SAME 代码(负载开关打开后电压稳定的大约 100 毫秒延迟除外,对 I2C2 的引用更改为 I2C1 和正确的 GPIO 配置)挂在 BUSY 标志上。我在示波器的 SCL 和 SDA 线上看不到任何东西(均已拉高)。我发现对于不同的系列 (STM32F1),勘误表中提到了正确的 I2C 初始化——关于模拟滤波器卡住的内容。我尝试了建议的解决方法 - 没有任何改变。所以我查看了 STM32L0 的勘误表——与此类问题无关。在另一个论坛主题中有人提到,应该在之后配置 GPIO I2C外设。出于绝望,我试过了——它奏效了!我看到 SCL 和 SDA 都随着我尝试发送的数据而切换。所以我连接了一个从属设备。从设备正在用 ACK 进行响应,但是有些东西不对劲。我发送了 3 个字节,但在线上我看到第一个字节被确认,然后是 SCL 低电平暂停,一段时间后其他 2 个字节都被确认。事实证明,在发送第一个字节后 BUSY 标志被清除,并且我早些时候退出了 while 循环。根据数据表,BUSY 标志在检测到 START 条件后设置,并在 CR1 中的 STOP 或 PE 位设置为 0 后清除。此 PE 位还重新启动内部状态机并清除所有标志,因此我将其添加到初始化中,为了完成。我还修改了传输函数以等待设置停止标志(而不是清除 BUSY),清除它然后继续其余的。它终于奏效了。有点。 当我在将 MCU 置于停止模式并使用 RTC 将其唤醒后尝试在循环中执行此操作时,下一个问题出现了。结果是这样的:负载开关打开,延迟 100 毫秒,PE=0,初始化 I2C1,设置 PE=1,初始化 GPIO,开始通信——一切顺利。设置 PE=0,禁用 RCC 时钟,将 GPIO 设置为模拟模式。进入停止模式。在 RTC 中断时退出停止模式,重新配置时钟,执行完全相同的初始化程序 - MCU 在第一次传输时卡在检查停止标志上。在 SDA 线上,我看到地址和第一个字节被确认。其余 2 个字节根本不会发送,因为 SCL 保持低电平。如果我尝试同样的事情,但是在 I2C2 上根据原始代码检查 BUSY 标志,我得到相同的结果:第一次运行它有效,然后 SCL 在第一个字节被确认后变为低电平。我究竟做错了什么? - 为什么 I2C1 和 I2C2 的初始化方式不同? - 为什么轮询 I2C1 的 BUSY 标志与 I2C2 的工作方式不同? - 在第一次 RTC 唤醒后这个 SCL 低电平是否可能是从机延长时钟的结果? - 有没有人经历过这两个 I2C 模块之间的这些差异? 我假设问题出在 I2C 代码/外围设备上,因为通过负载开关进行的电源复位应保证从机的状态机始终正确初始化。 |
|
相关推荐
1个回答
|
|
|
封装为 48 引脚 LQFP(STM32L052C8T6)。你是对的——这段代码不能将 GPIOB->AFRH 设置为 0x44。但是我粘贴的代码中有一个拼写错误 - 在我复制这部分的那一刻,我正在恢复 I2C2 测试的代码,它使用其他引脚并且错误漏掉了。因此,为了确认 - 调试器值是正确的,在所有测试中,引脚 8 和 9 都设置为 AF4(否则我将永远不会在 SDA 上看到任何操作,而我对示波器所做的)。我在之前的消息中解释了 TXIS 和 TXE 的原因——I2C1 的中断优先级设置得太低,无法触发发送缓冲区的其余部分——我更正了这一点,所以现在从停止模式定期唤醒工作正常。
更重要的是,我发现了 BUSY 标志有什么问题:在写入 CR2 之后,在总线上检测到 START 条件之前立即检查它的状态。很自然地,它退出了 while 循环并继续其他事情,把一切都搞砸了。这就是我让它工作的方式:
|
|
|
|
|
只有小组成员才能发言,加入小组>>
stm32mp157的异核通信的rpmsg_sdb的m4固件和a7驱动该如何编写?
1453 浏览 0 评论
stm32f103用freertos对一个采样率为1kHz的传感器,进行采样,数据出差
1502 浏览 0 评论
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
3649 浏览 1 评论
3842 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
2461 浏览 1 评论
STM32H7打开DCache后,出现了串口接收信息为空的现象,是哪里出了问题?
727浏览 5评论
用NANO STM32F103RBT6的开发板烧录不了是哪里出了问题?
661浏览 5评论
710浏览 5评论
外部中断触发类型为双边沿触发,进入中断回调后有什么办法判断该边沿是上升沿还是下降沿?
941浏览 5评论
STM32L071CBT6低温环境下无法正常工作是什么原因引起的?
745浏览 5评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 23:53 , Processed in 0.631944 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
552