完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在使用I2C和声驱动来解决各种问题。具体来说,我使用的是PIC32MZ2048ECH100I,我试图在I2C总线上与两个设备进行通信,一个是触摸屏,另一个是具有16输入/输出的GPIO芯片。首先,我在现有的MTCH6301驱动程序上编写了一个和声驱动程序,因为我的设备的工作方式非常相似。在一个引脚中断然后一个I2C握手获得触摸坐标。我也有GPIO芯片工作在同一时间,这是我工作的和谐与和谐1.06。为了简单起见,我把GPIO芯片从方程式中拿了出来,因为我只是在触摸屏上独自交谈时遇到了麻烦。我将总结一下它的工作方式,以防出现错误。收到中断后,它会调用DRV_I2C_BufferAddRead()函数,如果这是成功的UL将返回句柄并将其添加到触摸驱动程序跟踪的任务队列中。稍后,SYS_Tasks将会出现,并运行DRV_TOUCH_MTCH6301_Tasks(),它将检查任务队列中的句柄,以查找I2C完成的事件。最初,这看起来很好,但是在任何类型的负载下(例如很多快速的多点触摸),它会锁定和停止处理触摸请求和/或在I2CyDRV.C代码中崩溃。停止触摸请求的处理是因为I2C队列填满并坐在那里,没有泵送I2C驱动程序(因为它是中断驱动的,而I2C模块认为它不再需要中断)。基本上,只要队列中有2个I2C请求(或者在前一个完成之前已经调度了一个新的I2C请求,整个I2C驱动程序就注定要失败)。我添加了一些空指针保护和一些其他的黑客攻击(甚至是一些讨厌的代码来调用DRVIII2CYTASKS()函数,并让事情发生。ING,即使它是中断驱动的。我到达了一个阶段,它实际上工作得很好,甚至在总线上有一个第二I2C设备(前面提到的GPIO模块),它将在99.999%的时间内完成I2C队列的任何死锁。我当时应该退后一步,然后尝试正确地修复它,但是我还有其他火要扑灭,这一次几乎全部熄灭。我继续到和谐1.07.01,首先注意到我之前的I2C_drv.c补丁现在没有意义,它看起来像我添加了g的几个队列问题UARDS已被正确地处理,因此我恢复到1.07.01I2C.DRV.C代码。不用说,这是一场灾难。在I2C死锁发生之前,我可以从触摸屏上获得大约5秒或3次触摸,这似乎是我以前遇到的相同的基本原因。I2C队列填满,并没有得到服务(因为任何原因)。在尝试启用与错误条件相关的各种I2C中断之前,当我研究这个问题时,但是从来没有触发过,因此我无法从中推断出任何东西。在MHC中,我选择I2C驱动程序如下:DYNAMIC、中断模式、MZ Errata方法=25位的bang stop。这也是* * *组合,实际上似乎在任何工作。如果我试图关闭中断并让它使用SysStasks()轮询,我会立即崩溃。如果我使用另一个模块重置的errata方法,我在I2C总线上什么也得不到,如果我使用位邦格实现,它似乎也崩溃了,不能工作。对不起,对于漫无目的的帖子,我试图进入合理的细节,而不会过分。回到这个问题,有人成功地使用了和谐I2C驱动程序吗?如果是这样,我错过了一些愚蠢的东西或一些技巧?或者什么?多谢!
|
|
相关推荐
5个回答
|
|
嗨,唐,我一直关注着你关于幻象字节的另一条线索,这是我面临的一些麻烦的一个可能的候选者,但是使用和谐i2c_dev.c代码,我目前还不能确定如何延迟因为一切都是中断驱动的(或者唯一的梳子)。有效方法是)如果我不处理中断,我就没有轮询状态可以稍后处理。无论如何,现在是早上,所以我可以很容易地在i2c总线上获得一个作用域,看看我是否有幻象字节,这是今天的第一项任务。
|
|
|
|
嗨,罗宾.科内利乌斯,你看过你所看到的I2C问题了吗?我在另一个论坛上看到了同样的东西。所以想和你核对一下。谢谢。
|
|
|
|
嗨,PICster80,很抱歉,最近几天论坛有点不舒服,只关注一个帖子已经够费劲了。我已经基本解决了基本的问题,而且我确实让I2C工作。我移植了一个微芯片自己的触摸屏驱动程序的代码,只是改变了我的触摸屏的i2c身份证等,所以我很惊讶,当这个没有工作。但是正如幻像字节线程中提到的,使用回调而不是跟踪句柄工作得很好。我还没有时间去调试句柄实现,回调也更干净。不过,我还是很好奇,是否有其他人使用I2C和其他的和谐选项,我在第一篇文章中提到的。我仍然没有成功改变MHC选项,由于事情看起来稳定,我不愿意疯狂地摆弄MZ Errata类型,有无中断等等。
|
|
|
|
嗨,Robintnelius,我遇到了与使用Harmony 1.07版本中的动态驱动程序实现描述的相同的问题。没错,在Harmony版本1.06或1.07中,I2C驱动程序缓冲区很容易被重载,一旦队列满了,驱动程序将停止响应。与1.06版本的和谐,我可以运行总线速度在400 kHz在两个单独的总线在我的项目没有太多的问题。在版本1.07的Harmony中,任何总线都不能在400kHz下运行,而不会立即出现由全队列或总线冲突引起的问题。这两个问题都导致了I2C死锁的驱动程序。围绕1.07版本的和谐的唯一方法是运行在100kHz,这阻止了总线冲突的发生。DON 2在传输后延迟是正确的。但是,不要把延迟放在中断中。延迟需要在调用DRVIII2CYRUNVER()、DRVIII2CX发送器()之后插入,或者DRVIII2CyTrimeTrimeAccess()。DON2建议的10ms的延迟有点长,但是让事物正常运转的良好开端。如果需要根据传输的字节数动态地改变,则延迟的最佳情况如下:由于上述等式是最佳情况,因此可以考虑将计算的延迟加倍,以满足最坏情况。此外,如果应用程序正在进行页面写入,那么还需要考虑额外的延迟。即使如此,队列仍然存在填充问题,并且驱动程序将变得无响应。我唯一的想法就是确保队列永远不会满。在查看位于Harmonyapps..i2ci2c_inter.中的示例代码之后,在延迟完成之后将下面的代码添加到我的项目中。比一个项目的伎俩,使一切稳定。它确实打败队列的目的,但是队列实现是不可靠的,最终失败。因为它是Microchip的示例代码,所以我不太关心将它移植到我的项目中。如果您还没有尝试过,我的建议是在100kHz下运行总线,在调用DRV_I2C_Receive()、DRV_I2C_Transmit()、和/或DRV_I2C_TransmitThenReceive()之后有一个延迟,并检查DRV_I2C_Tra的状态。NSFESTATUSTGET()在延迟完成之后,基于状态更多地延迟。一旦驱动程序通过传输数据成功,就可能发生下一个I2C事务。这是我的应用程序启动和运行Harmony 1.07版本而不修改任何Harmony框架的唯一解决方案。
|
|
|
|
我没有问题,但是我使用#include“framework/./i2c/drv_i2c_..h”记住如果不使用inter.swhile(!DRVIII2C0YMaskBuffEdle()){nop-();}
|
|
|
|
只有小组成员才能发言,加入小组>>
5160 浏览 9 评论
1998 浏览 8 评论
1927 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3170 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2225 浏览 5 评论
727浏览 1评论
612浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
501浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
626浏览 0评论
524浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:47 , Processed in 1.381346 second(s), Total 84, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号