完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
大家好,我试图在PIC24FJ32GA102(ID Revision=2)中使用I2C端口,但不能使其以最基本的形式工作,即它甚至不发送一个START位。配置如下:#pragma config ICS=PGx1//Set ICSP模拟器引脚到PGED1和PGEC1#pragma配置WPCFG=WPCFGDIS//禁用配置页保护#pragma配置FNOSC=FRCDIV//Enable带后标定器的快速RC振荡器#pragma配置FCKSM=CSECME//Enable时钟开关,en可调FSCM#pragma配置POSCMOD=NONE//禁用主外部振荡器#pragma配置IESO=OFF//禁用两个速度启动#pragma配置OSCIOFNC=ON//定义OSCO管脚为IO#pragma配置SOSCSEL=IO//定义SOSC管脚为IO#pragma配置I2C1SEL=PRI//定义SCL1的默认设置以及SDA1////<<<<<<<<<<<<< lt<< lt_<_< lt lt lt lt< lt lt lt< lt lt< lt lt< lt lt_< lt<\\\\\\\\\\\\&WDT\&&<<<<< BOREN=OFF//在深睡眠模式下禁用BOR#pragma配置GCP=OFF//禁用代码保护关于代码,我遵循DS70000195F中的过程(dsPIC33/PIC24家庭参考手册),并检查状态标志,但是没有帮助。我可能漏掉了什么东西?我检查了PIN(使用SDA1和SCL1),调试器(PICtiT3)似乎工作得很好。该功能如下:void._Sensor(void){int16_t AC1=0x0000;I2C1CONbits.I2CEN=1;//Enable I2C模块I2C1BRG=0x0027;//将I2C波特率设置为100KHz I2C1MSK=0x0000;//.ble address.I2C1ADD=0x00EE;//Reset从地址寄存器I2C1TRN=0x0000;//Reset发射器注册表I2C1C1RCV=0x0000;//复位接收机寄存器I2C1CON=0x1000;I2C1C1CON比特.SEN=1;//发送START比特I2C1TRN I2C1TRN=0x00EE;//发送从站比特I2发送STAT位I2C1STAT比特.T比特.TTBF===1)===1){{}//等待EOT EOT//等待EOT等待EOT((I2C1STAT比特/等待等待等待EOT//等待等待等待EOT//等待等待等待等待EOT,等待等待等待EOT,等待EOT,等待EOT//等待等待等待等待EOT,等待等待EOT//等待等待,等待EOT从属内部r((I2C1STAT比特.TBF)==(I2C1STAT比特.TBF)==1){{_1){{__{1){_在(I2C1STATTT2C1STAT比特.TBF)==1)==1){{{}//等待EOT同时等待EOT(I2C1STAT比特.I2STAT位.ACKSTASTATSTASTATT){{{{{{{{{{{{}_//等待从从从从从从从从从从从I2C1C1C1C1C1C1C1CON从I2C1CON位I2C1CONCON位I2C1CONCONCONCON位的ACACACACCONbits.ACKSTA比特,RSEN=RS{}//等待来自sl的ACKAWAC1= I2C1RCV;/ /读取MSB数据,同时(!)(I2C1STATbits.RBF){}//等待读完AC1=(AC1<<8);//将MSB数据移到位置I2C1CONbits.ACKEN=1;//发送ACK到从AC1=I2C1RCV;//在读取LSB数据的同时(!(I2C1STATbits.RBF){}//等待读取完整的I2C1CONbits.ACKDT=1;//准备发送NACK I2C1CONbits.ACKEN=1;//发送NACK到从I2C1CONbits.PEN=1;//发送STOP}任何信息都将被欣赏。谢谢。
|
|
相关推荐
14个回答
|
|
|
两个问题。当你是主时,不要设置从地址寄存器。这将使您对自己的传输作出响应。您不能对I2C操作排队,您必须等待每个操作完成。例如,当您设置SEN时,您必须等待它再次变低(指示START已被发送),然后才写入数据寄存器。
|
|
|
|
|
|
我打算写同样的东西,但是我对硬件模块从来都不太确定。
|
|
|
|
|
|
谢谢。在发送任何其他东西之前,我试图使用标志等待开始的结束,但不工作。我尝试了几个标志,比如“BCL”、“IWCOL”和“TBF”,都在I2CXSTAT寄存器中。我看到的只有一些噪音偶尔骑静态SDA和SCL线。根本没有I2C。它不应该那么困难,有些事情是非常错误的。我对硬件也不感兴趣。如果这个东西重置了,那会是一个惊喜。不知道是否有一些不被考虑的设置?我已经检查了调试器,看起来很好。
|
|
|
|
|
|
我已经提到了我前面帖子中的正确标志。它是参议员。你设置它来启动循环,然后轮询它,看看它何时再次变低。
|
|
|
|
|
|
你读过PIC24设备的家庭参考手册(FRM)中的I2C章吗?HTTP//WW1.MICCHIP.COM/DeLoSt/En/DeVICECD/O7000,195F.PDF
|
|
|
|
|
|
你只需要发送一个启动条件ISI,不认为它需要在PIC24上,但我总是设置I2C引脚作为输入。我绝对建议禁用与I2C1复用的JTAG端口。
|
|
|
|
|
|
终于奏效了。我也从Microchip获得了一些额外的信息。“秘密”似乎是:1)禁用与端口未使用的SDA和SCL管脚相关联的所有东西。在I2C情况下,这将是RPORx、PMDx和AD1PCFFL.2的模拟特性。2)不要使用SDA1和SCL1。Microchip表示这些功能不存在于这个设备中。DS另有说明,但这只是DS.3)将I2C端口移动到备用管脚ASDA1和ASCL1,而不是通过设置这样的配置位:#pragma config I2C1SEL=SEC4)另一件有帮助的事情是在命令之间插入小的延迟以防止冲突。下面的代码不完整(确切的序列将取决于应用程序),但它很好地激活了PIC24FJ32GA102中的I2C。它甚至用2.5V初始化。谢谢大家的帮助。int16_t AC1=0x0000;RPOR2=0x0000;//.bleRPx外围设备RPOR3=0x0000;AD1PCFGL=0xFFFF;//.ble模拟函数PMD2=0x1F1F;//禁用PMD3 PMD4处的所有外围设备;/禁用地址掩码I2C1TRN=0x0000;//Reset发射器寄存器I2C1RCV=0x0000;//Reset接收器寄存器TRISBbits.TRISB5=0;//还没有确定这个帮助。使用OBCBITS.ODB5=1;//ODBX=0或1。TRISB参考文献.TRISB6=0;ODCBbits.ODB6=1;I2C1CONbits.I2C1CON比特.I2CEN=1;//启用I2C模块I2C模块I2C1C1C1C1CON比特.I2C模块I2C模块I2C模块I2C1C1CON比特.I2C1CON比特.ODB6=1;//启用I2C I2C模块I2C模块I2C1C1C模块I2C1C1C1C1C模块I2C1C1C1C1C1C1C1C1CON比特I2C1C1CON比特I2C1CON比特I2C I2C模块I2C1C1C1C1CON比特I2C1C1C1CON比特I2C1C1C1CON比特I2C1CON比特I2C1CON比特I2C1C1C1CON比特II2C1/等待时机LE(I2C1StBATS.AkStAT){}} /等待来自从属α-DelayuUS(10)的ACK;I2C1Trn=0xAA;/ /发送MSB从属内部寄存器地址((I2C1STATBITS.TBF)=1){} / /等待EOT而(I2C1STATBATS.ACKSTAT){} / /等待来自从属α-DelayuUS(10)的ACK;I2C1CONBITS。RSEN=1;/ /发送Realth-Ty-DelayuUS(10)I2C1Trn=0xEF;/ /发送从属地址+RD((I2C1STATBITS.TBF)=1){ } / /等待EOT(I2C1STATBATS.ACKSTAT){} / /等待来自从属α-DelayuUS(10)的ACK;AC1=I2C1RCV;//读取MSB数据AC1=(AC1&LT;& 8;)/ /移位MSB数据到位置I2C1CONBITS。AKEN=1;/ /发送ACK到从属AC1=I2C1RCV;//读取LSB数据I2C1CONBITES.ACKDT=1;/ /准备发送NACK I2C1CONBITS。AKEN=1;/ /发送NACK给从I2C1CONBITS.PEN=1;/ /发送停止
|
|
|
|
|
|
我非常怀疑你从Microchip获得的建议。我在勘误表中看不到任何迹象表明SCL1/SDA1没有实现。您尝试禁用JTAG吗?在这些引脚上没有模拟功能,所以这不是问题,也不是PIN重新映射,因为默认情况下没有映射PIN。而且您的代码仍然是错误的。RCEN启动了一个读事务。这不是你在开始时设置的东西。你应该等待SEN走低,以确定启动条件何时完成。你不必耽搁。对于代码的其余部分也是如此。
|
|
|
|
|
|
嗯,有趣的是,2)……那些拖延不应该在那里,理论上…
|
|
|
|
|
|
我放弃了。你对开始点的处理是完全错误的。我告诉过你两次你应该怎么做。你看过《家庭参考指南》吗?
|
|
|
|
|
|
RCEN启动一个读事务。这不是你在开始时设置的东西。你应该等待SEN走低,以确定启动条件何时完成。你不必耽搁。这也适用于其他代码。同时,我已经了解到RCEN在接收来自奴隶的数据之前已经打开,并且已经做出了改变。“RCEN启动了一个读取事务。这不是你一开始就设置的。“不幸的是,找不到任何关于何时建立RCEN的信息。至于Microchip的建议,我不知道该相信什么,因为数据表没有提到这些SCL1和SDA1引脚不存在。当我有正确的代码和工作时,我会切换回这些引脚,看看谁是正确的,Microchip或它的数据表。不,JTAG没有残疾,因为当时有不同的考虑。有一个博客,那个家伙说这些别针根本不起作用。但我将再次尝试使用JTAG禁用。
|
|
|
|
|
|
我不喜欢这些延误,但不幸的是,这是迄今为止唯一可行的方法。一个主要的问题是DS不清楚在每个阶段使用哪个旗子。森是好的,但其余的不太清楚。例如,pp.181:“P:Stop bit1=指示检测到Stop位last0=Stop位未检测到lastHardware设置或清除,当检测到Start、Repeated Start或Stop时。”“Set”或“.”。哪一个?非常有用的信息。
|
|
|
|
|
|
第24.5.3节“从从设备接收数据”详细解释了RCEN。让我们知道它是否在禁用JTAG的情况下工作。
|
|
|
|
|
|
当数据表显示“硬件设置或清除”时,它们表示硬件正在适当地设置或清除位,而不是软件。设置SEN,等待SEN清除。清除MI2C1IF,写从地址,等待MI2C1IF去高,重复任何数据字节。设置笔,等待笔清除。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1124浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 02:59 , Processed in 0.992432 second(s), Total 98, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1842