发 帖  
原厂入驻New
[问答] 启动与PIC32MX570F512L的I2C通信时有些东西不起作用怎么办
114 PIC32 通信
分享
大家好,当我试图启动与PIC32MX570F512L的I2C通信时,有些东西不起作用,代码如下:调试代码,可以看到设置了SEN位,SCL和SDA都被清除以断言启动条件。此后,没有设置I2C1STATBITS S,并且不调用中断。代码继续执行,在第一个字节的确认过程中停止。问题是什么?谢谢你的支持
0
2020-5-8 11:45:31   评论 分享淘帖 邀请回答

相关问题

14个回答
这里有几个潜在的问题:1)您的代码是写成阻塞的,例如,您正在等待开始条件完成。如果您打算等待,就不需要I2C中断——禁用它们以避免问题。2)在ISR内部,您正在使用RMW序列操纵CPU寄存器(IFS1)中的位字段——这是糟糕的形式,在某些情况下可能给您带来麻烦。我建议将其更改为IFS1CLR=_IFS1_I2C1MIF_MASK;3)在第一个字节的ack期间停止意味着从服务器已经NACKED事务(没有响应)——可能是错误的地址或其他错误。
2020-5-8 11:58:12 评论

举报

相关:HTTP://www. McCHIP.COM/FUMMS/M916081.ASPX
2020-5-8 12:12:34 评论

举报

嗨,艾登,谢谢你精心的回答。即使代码不在ISR中,也要启动条件。我的问题是关于ISR的工作(无论如何它不工作)。关于确认,问题是主机不同时发送scl和sda。我解释得更好,代码在管脚上似乎被锁定在0V时继续进行。在这种情况下,不能断言确认,因为没有从主设备发送时钟信号。在我看来,在启动条件期间发生了一些错误,因为S位没有设置(如com中所述)。PANTENT数据表
2020-5-8 12:20:38 评论

举报

您确定SDA和SCL引脚不是模拟模式吗?
2020-5-8 12:30:22 评论

举报

嗨,您消息中的示例代码不完整。缺少include文件。因为至少需要:include<xc.h>include<sys/attribs.h>然后没有主程序。函数序列错误,有可能有一个没有函数原型声明的程序,但是随后在调用函数之前,每个函数的主体必须位于同一个编译单元中。下面,就像马栓紧后关上稳定门一样:在初始化外围设备时,清除中断标志的目的在于避免以前任何ma的活动。y已经发生,以便在启用中断后立即引起中断。此外,由于未配置多向量中断模式,并且未启用全局中断处理,因此没有中断处理。我已经在PIC32MX695H上使用I2C外围设备I运行了程序。2C5.当连接到正常工作的I2C总线时,程序按预期工作。如果未出现具有尝试的I2C地址的从站,则不存在确认。在这种情况下,主站仍应发送停止信号。当从站响应时,Send_I2C5Packet(...)按预期工作,发送t他请求的字节数:没有配置指令,也没有其他运行时设置,PIC32MX将以4MHz的系统时钟频率运行,外围总线分频器默认为1/8,因此外围总线频率为500kHz除以35,再除以2,所以I2C总线以4MHz的系统时钟频率结束。时钟频率约为7千赫。问候,Mysil
2020-5-8 12:49:00 评论

举报

模拟模式可以用ANSELx寄存器设置,但是ANSELA只包含ANSELA9和ANSELA 10,所以我认为没有这个引脚的选择。
2020-5-8 12:54:16 评论

举报

嗨,Mysil,为了便于讨论,我省略了一些内容:)这里是main.chereisdac.c这里是I2C_Master.c如果你能告诉我这个代码在你的PIC上是否工作正常,我将非常感谢。
2020-5-8 13:12:45 评论

举报

嗨,Mysil,你查过S比特是否已设置好了吗?你检查过示波器是否有时钟和数据吗?
2020-5-8 13:31:50 评论

举报

Serafino,你确定PIC实际上是在运行吗?你确认它可以切换引脚高/低等?另外,为什么你要使用I2C中断呢?据我所知,您的代码将不会受益于他们等待事件完成。
2020-5-8 13:48:34 评论

举报

嗨,艾登,我向你确认引脚可以切换引脚(SCL和SDA在开始状态时被清除)。即使在这个代码中,我不需要ISR,但是这些特性不能工作吗?这是我要解决的问题。按照Mysil的说法,这段代码在他的照片上很好,所以我可以断言我的照片是错误的吗?
2020-5-8 14:07:59 评论

举报

Mysil的代码使用了不同的I2C接口和一个不同的主接口,我假设您的主接口是在他运行测试之后才发布的。它很可能是一个错误,而不是一个错误的照片,除非它被物理损坏。根据您的描述,我猜它是板上或从设备上的电气或连接问题。当您说SCL在启动条件期间被清除时,这是一个大问题,因为在启动条件期间SCL应该是HIGH……http://i2c.info/wp-conten...2c.info/start-stop.gif请尝试以下测试:1)在主函数的while循环中删除对Write_DAC的调用,然后删除对Write_DAC的调用确保I2C总线引脚正确怠速高。如果它们仍然处于低位,那么可能存在电气/设计问题。2)您确定您有正确的从属地址吗?设备的制造和模型是什么?它是如何连接的?请再检查一遍,贴在这里。3)如果步骤1或2没有问题,你需要把示波器放在SDA和SCL上,看看发生了什么事-引脚不应该卡低。SCL将是高的,无论启动或停止或ACK或NACK已经发生,只有切换时,主机正在移动数据。SDA可以坚持低,如果有丢失的时钟脉冲,奴隶还没有收到。
2020-5-8 14:17:46 评论

举报

嗨,Serafino,是的,S位get Set,不是在设置SEN之后的第一步中,但是当while循环结束时,S位已经变为1。在函数的闭括号上设置断点:void StartI2Cx(void)并让程序在那里运行。如果S位没有设置,则检查BCL位如果在同一寄存器中没有设置S位,而是设置BCL位,则存在总线冲突、SDA或SCL线路上的电气故障。可能是由于连接到错误的引脚,断接线,漏上拉电阻,短路到地?示波器图像附上:问候,Mysil
2020-5-8 14:24:15 评论

举报

变为I2C2,FW工作得很好。可能有一个HW故障。
2020-5-8 14:42:09 评论

举报

嗨,在I2C FRM,分段-24,DS61116F,参考图24至8。正如你所看到的,即使I2CXSTAT.S==1,这并不意味着I2C硬件已经完成了启动条件。对于起始位要完成,并且在发送数据之前,必须发生下列事件之一,1。总线是空闲的,这意味着I2CXCON寄存器的5个最低有效位是0。这确保主逻辑不活动。2。I2CxMIF==1,不需要启用中断来检查它。只需等待并轮询这个标志,当I2CxMIF==1时,这意味着START完成。在开始下一步之前,请务必清除此标志。3。启用中断,在ISR检查内部I2CXSTAT.S=1,如果S==1,则启动发生,并设置程序标志。在您的主应用程序中,您可以检查这个程序标志,以便决定下一步。我不知道这个设备的I2C-1上的任何错误,但我将再次检查。
2020-5-8 14:51:45 评论

举报

只有小组成员才能发言,加入小组>>

120个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表