完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在我们公司,我们在一个大型项目中使用 STM32 MP153a 微处理器。目前我正在尝试为 TDK ICM42688P Mems 陀螺仪编写设备驱动程序。我们已通过 I2C 将陀螺仪与 MPU 内的 Cortex M4 内核连接起来。两个设备都位于定制 PCB 上,陀螺仪路由到 MPU 的 I2C 2接口(I2C2_SCL = PZ6,I2C2_SDA = PZ7)。陀螺仪是该接口 (I2C2) 上的唯一设备。我们使用 1.8V 的 I2C 电压,两种设备都支持这些电压。I2C2 接口处于轮询模式。
对于我的驱动程序,我必须读取陀螺仪的多个寄存器,因此我使用 STM32 HAL 的 HAL_I2C_MEM_READ 函数,它位于从 CubeMX 生成的 HAL 中。我注意到我遇到了随机通信错误,所以我编写了一个简单的测试用例,其中我只在一个 while 循环中读取陀螺仪的设备 ID。这是此测试用例的伪代码,因此您可以了解它是如何工作的: 而(1) { retVal_e = icm42688pReadRegister(ICM42688P_BANK_0_WHO_AM_I, ®Value_u8); 如果(retVal_e == Std_ReturnType_CommError) { TRACE_ERROR("这是一个通信错误"); errorCounter_u16++; } 操作系统延迟(10);//时间以毫秒为单位 } retVal_e 包含通信的状态。如果一切正常,循环将等待 10 毫秒,然后再进行一次读取。如果出现错误,错误计数器将增加,并且控制台上将出现一个打印。首先,在这个测试用例中,osDelay 被设置为 1 毫秒,我在 30 秒内大致得到 200 个错误,但我们公司的错误容忍度为零,所以这是不可接受的。在此之后,我测试了 PCB 上的其他 I2C 设备是否也会出现错误。在 I2C1 接口上,我们有一个 MS5837 压力传感器和一个 RX8804 实时时钟。我以类似的方式测试了这两种设备 --> 在 while 循环中轮询一些数据。与这两个设备的通信是完美的,即使我没有任何延迟,只是 while 循环中的读取功能。我们还在 I2C3 接口上安装了一个 Ina231 电源监视器。我也测试了这个设备,但即使没有延迟,这种通信也再次完美无缺。请注意,I2C 接口(I2C1 和 I2C3)均配置为具有标准时序(tr 和 tf = 0 ns)的快速模式,并且在数字滤波器系数为 0 时启用模拟滤波器。此外,这两个接口都使用 DMA 通信进行流大于 10 字节。因此,测试用例没有使用 DMA(在 while 循环中只读取一个寄存器)。回到 I2C2 接口。我用非常快的示波器查看总线和正电压,发现上拉电阻有点大,因为时钟高相位几乎是尖峰,所以我将 4.7k 上拉电阻更改为 1.8k 上拉电阻。我为错误的通信设置了一个断点,以便在出现通信错误时可以观察示波器中的总线。然后发生通信错误,总线看起来仍然很好,并且看不到先前序列的重大变化,因此我假设故障出在 MPU 或软件中,而不是在陀螺仪或总线上。我为错误的通信设置了一个断点,以便在出现通信错误时可以观察示波器中的总线。然后发生通信错误,总线看起来仍然很好,并且看不到先前序列的重大变化,因此我假设故障出在 MPU 或软件中,而不是在陀螺仪或总线上。 在寻找解决方案时,我还测试了标准模式而不是快速模式。我通常在标准模式下比在快速模式下收到更多错误,所以这很奇怪。我注意到如果我禁用模拟过滤器,我得到的错误会少一些。当我启用模拟滤波器并将数字滤波器系数设置为 15(最大)时,我会得到更多错误。我还测量了总线上的实际上升和下降时间(10% 到 90% --> tr ~255 ns,tf ~ 25 ns)并将这些值用于 CubeMX 的计时。几次测试后,如果我选择禁用模拟滤波器并将数字滤波器系数设置为 0 的快速模式,并且如果我选择 300 ns 的上升时间和 30 ns 的下降时间,我得到的错误最少。即使使用这些设置,我也会在 30 秒内大致得到 4 个错误(延迟 1 毫秒)。 通过一些调试,我在等待一些标志时找到了错误。在 10 分钟的时间内,我可以捕获 3 次 HAL_I2C_Mem_Read() 函数中 RXNE 标志的超时。我还在 HAL_I2C_Mem_Read() 函数中调用的 I2C_RequestMemoryRead() 中的 TXIS 标志收到 3 个超时。同样在 I2C_RequestMemoryRead() 函数中,我得到了 6 个 TC 标志超时。每次总线上的通信看起来都不错,但 MPU 没有得到正确的样本。 我已经查阅了 STM32 MP153A (ES0438 Rev 7) 的勘误表。如果数据设置时间短于一个 I2C 内核时钟周期,则存在错误数据采样的情况(2.19.1)。作为解决方法,我将 I2CClk 频率从之前的 64 MHz (Clk src HSI) 增加到 100.5 MHz (Clk src PCLK1) 并分别更改了时序。此解决方法没有帮助,错误并没有消失。我什至尝试了一个慢得多的 I2C 内核 Clk,频率为 4 MHz(Clk src CSI),但这也没有用。在下一个案例 (2.19.2) 中,存在总线错误,结果是设置了 BERR 标志。我检查了这个标志,但当我收到错误时,这个标志从未设置。下一个案例 (2.19.3) 不相关,因为我们没有多主总线。下一个案例 (2.19.4) 也不相关,因为我们启用了时钟延展。最后一个案例(2.19. 5) 如果 I2c APB 时钟和 I2c 内核时钟的比率在 1.5 和 3.0 之间,则在传输第一个字节后从停顿开始说话。解决方法是将该比率更改为高于 3 或低于 1.5。APB Clk 设置为 100.5 MHz,并且由于项目要求而无法更改,但我已经将 I2C 内核 Clk 增加到 100.5 MHz 和 4 MHz(见上文),因此比率为 1.0 或 25.1,而且此解决方法也没有帮助。 我做了观察,如果我将 while 循环的延迟从 1 毫秒增加到 10 毫秒甚至 100 毫秒,我会在 5 分钟内没有错误。我什至在两次运行中测试了 30 分钟内 10 毫秒延迟的通信。在第一次运行中我根本没有收到错误,而在第二次运行中我收到了一个错误。对于这些测试,我将 I2C 内核时钟更改回之前的 64 MHz。这似乎是一种解决方法,但我们的容错度为零,并且我们需要至少 200 Hz 的通信速率,因此 10 毫秒的延迟已经太长了。 你看我已经测试了很多东西,我迫切需要一些帮助。我希望你有一些我也可以测试的东西,也许我的问题有正确的解决方案。 |
|
相关推荐
2个回答
|
|
该芯片获得 3.3V 的 VDD 电压和 1.8V 的 VDDIO 电压。我用示波器查看了两种电压。陀螺仪 IO 引脚的电压具有 330 mVpp 的纹波,相当于 18% 的纹波比率。首先,我添加了一些额外的电容器。纹波现在大约为 50mVpp,我还将上拉电压降低到 1.5k。我在周末测试了这个设置。整个周末在 23.7 亿次通信中出现 263 次错误,这相当于 0.111ppm 的错误率。我认为通过一些额外的平滑处理会变得更好。
|
|
|
|
使用ICM-42688做机器人项目,最好使用SPI的通信方式,I2C的方式会掉数据包。有遇到这种情况
|
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2733 浏览 1 评论
3241 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1810 浏览 1 评论
3650 浏览 6 评论
6038 浏览 21 评论
1339浏览 4评论
201浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
350浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
444浏览 2评论
STM32处理增量式编码器Z信号如何判断中断是正转的还是反向转的?
274浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 05:36 , Processed in 0.954659 second(s), Total 50, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号