完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
大家好,我正在尝试建立以PIC32MX795F512L(芯片组PRO MX7)为主机和PMODTMP2温度传感器为从机的I2C通信。我使用的是FRC(主振荡器),8兆赫,用SysC锁定设置为80兆赫。PBCK设置为10兆赫。I2C频率设置为100千赫。然而,当我运行程序时,我得到大约8千赫。I2C频率通过逻辑分析仪,这根本没有意义。我程序中的振荡器的硬件定义在附件中的图1中。我避免使用I2C内置函数,因为我认为它们可能已经引起了这个问题,但仍然存在同样的问题。我用控制寄存器代替,如图2所示,在附件中。另外,我附加了逻辑分析器输出的屏幕截图,在图3中。我试着使用PBCLK和I2C时钟的不同组合,但是输出信号看起来要么向上抬高,要么是相同的。我真的不明白是什么导致了这个问题,我将非常感谢您的指导。非常感谢,编辑:这是我的源代码:
|
|
相关推荐
7个回答
|
|
|
嗨,在配置位内,您选择FNOSCC=FRC。试试FNOSCC= FRCPLL来调用FRC的PLL设置。祝你好运,迈克。
|
|
|
|
|
|
嗨,PIC32MX中的I2C硬件继承器在完成前一个命令之前不接受新命令。所以在语句:I2C2CONbits.SEN=1;//generatedstartsequence之后,您必须等待直到硬件完成Start Condition信令。当开始过程完成时,ack为0,所以您可以这样测试:同样在message#1所示的代码中,没有循环或重复,因此程序将启动、执行初始设置和启动信号。还没有完成。当程序到达main的末尾时,它将崩溃重置PIC32并重新启动。从逻辑分析器的图表中可以看到,当整个程序运行到末尾并重新设置整个微控制器时,开始序列被重复。不同的函数执行不同的信号并等待其完成,但是通常更容易使用相同的构造来检查或等待任何需要的信号序列。在控制寄存器中有5个“动作”位,然后是状态寄存器中的发送状态位。当操作完成时,它返回到0。可以在同一语句中测试所有这些操作:如果硬件不能执行这些操作中的任何一个操作,则比特立即清除。不要围绕其他状态比特进行类似的等待循环,这些状态比特本身不返回到0。然后,在为了从从设备读取数据,发送重复启动信号,并等待完成,发送读取模式地址,等待完成并检查确认,必须为每个字节启用Receiver:[code]I1C2CONbits.RCEN=1;(I2C2CON&0b00011111);/*从Re读取数据注册注册,就像你所做的一样。*/m***=I2C2RCV;//接收m***字节I2C2CONbits.ACKDT=0;//ACK BYTE I2C2CONbits.ACKEN=1;//启用ACK.(I2C2CON&0b00011111);/*等待确认信号完成。*/[代码]然后,您可以围绕从开始到停止的整个序列进行循环,这样程序就不会耗尽并重新设置。还需要做其他测试来制作可靠的程序。
|
|
|
|
|
|
MiK017和Mysil,谢谢你的回复。将时钟源改为“FRCPLL”解决了频率问题,但I2C总线仍然表现奇怪。为了解决这个问题,我开始逐步分析I2C总线上的数据传输。在我的代码中,当我只有“开始+停止”命令时,时钟频率大约是65千赫。(这没有道理)巴士继续重新启动,没有停止。输出信号在图1中。当我在代码中有“开始+发送从地址(w)+停止”时,数据和时钟源信号看起来很好,除了逻辑分析器识别总线上的3开始+1停止之外。(时钟频率约为100千赫。我可以看到奴隶正在攻击奴隶地址。输出信号在图像2中。在代码中,当我有“Start+wait bus to complete.(如果如Mysil建议的语句)+SendSlaveAddress+wait bus to complete.+Stop”时,时钟频率变为~37kHz。在总线上有2个启动+ 1个停止序列。输出信号在图3中。当我在代码中有“开始+等待总线完成操作(而Mysil建议的语句)+SendSlaveAddress+等待总线完成操作+停止”时,时钟频率变为~65kHz。这次,逻辑分析仪根本无法识别总线上的启动或停止条件。输出信号在图4中。我本想解决这个问题,但是这些SCL和SDA信号在不同情况下的输出使我更加困惑。当我评论/未注释一行代码时,为什么时钟频率和SDA输出完全改变,这是没有意义的。我真的不知道这个问题是怎么回事。非常感谢您的意见和建议。
|
|
|
|
|
|
MiK017和Mysil,谢谢你的回复。将时钟源改为“FRCPLL”解决了频率问题,但I2C总线仍然表现奇怪。为了解决这个问题,我开始逐步分析I2C总线上的数据传输。在我的代码中,当我只有“开始+停止”命令时,时钟频率大约是65千赫。(这没有道理)巴士继续重新启动,没有停止。输出信号在图1中。当我在代码中有“开始+发送从地址(w)+停止”时,数据和时钟源信号看起来很好,除了逻辑分析器识别总线上的3开始+1停止之外。(时钟频率约为100千赫。我可以看到奴隶正在攻击奴隶地址。输出信号在图像2中。在代码中,当我有“Start+wait bus to complete.(如果如Mysil建议的语句)+SendSlaveAddress+wait bus to complete.+Stop”时,时钟频率变为~37kHz。在总线上有2个启动+ 1个停止序列。输出信号在图3中。当我在代码中有“开始+等待总线完成操作(而Mysil建议的语句)+SendSlaveAddress+等待总线完成操作+停止”时,时钟频率变为~65kHz。这次,逻辑分析仪根本无法识别总线上的启动或停止条件。输出信号在图4中。我本想解决这个问题,但是这些SCL和SDA信号在不同情况下的输出使我更加困惑。当我评论/不注释一行代码时,为什么时钟频率和ANDSDA输出完全改变?我真的不知道这个问题是怎么回事。非常感谢您的意见和建议。
|
|
|
|
|
|
请张贴用于测试的确切代码。我怀疑你没有完全理解mysil的建议。在你要求I2C外围设备做完每个操作之后,你最肯定应该做“等到完成”。
|
|
|
|
|
|
荒山亮,这是我使用的全部代码。这只包括给奴隶写奴隶地址。
|
|
|
|
|
|
嗨,当调用函数getTemp()时,在循环中,停止信号序列启动后没有等待操作,在请求第二个开始信号序列之前没有检查。结果是第二个开始被硬件拒绝并中止。直到前一个停止序列完成为止。第二个地址写入也将崩溃,因为一个开始序列没有成功执行。写入冲突标志也可能被提升。关于Mysil
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1121浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 18:40 , Processed in 0.856016 second(s), Total 86, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1128