完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
朋友你好,单片机:pic16lf1847slave1:DS1307(RTC)slave2:at24c32_eepromide:MPLAB v8.89compiler:高科技C v9.83i能够沟通的串行EEPROM 24C04透过I2C和DS1307 RTC模块分别通过I2C。现在我买了一个既有DS1307又有AT24C32的EEPROM的RTC模块。所以我决定使用EEPROM。但是我不能从EEPROM上读到。写作时,我没有任何错误。但在读时,它设置了一个SSP1STAT寄存器位并得到错误的值(地址)。我不知道问题在哪里。RTC模块地址为1101000。在DS1307中读写是可以的。AT24C32,EEPROM地址引脚A2,A1和A0,也WP引脚接地。所以,我把地址写为A0(用于写)和A1(用于读取)、数据、停止。问题是在发送ACK到SLAVEAT24C32 EEPROM时才出现,当我尝试发送ACK位时,AKSEN位被设置。同样的代码在24co4 EEPROM但分开(未测试随着DS1307或at24c32_eeprom)。写作&;阅读单byte.any帮助吗?PMK
|
|
相关推荐
19个回答
|
|
|
我读取数据串的代码看起来是这样的:
|
|
|
|
|
|
伤感:
|
|
|
|
|
|
有人能救我吗?PMK
|
|
|
|
|
|
嗨,如果在I2C_Master_Read函数中设置ACKEN位之前ACKEN位是1,那么在其他地方就有问题。ACKEN位连同SEN、PEN、RSEN和RCEN在操作完成后将返回到0,但是允许I2C从机保持时钟线低,以指示需要更多的时间。如果信令出现错误,有可能陷入死锁,其中I2C从设备正在等待主设备继续信令,但是主设备没有代码来检测和解决该情况。测试状态位是作为主程序员的职责当发生意外情况时采取行动。所有I2C信令操作使用一些时间,大多数在10微秒到100微秒之间。当一个操作进行时,不允许尝试启动另一个操作。如果发生这种情况,I2C硬件将设置一个标志位并拒绝该操作。你的所有代码是如何处理的,或者打包一个可以测试的完整程序,并附上消息。迈西尔
|
|
|
|
|
|
这是你已经知道的读代码。这是代码。同样的代码工作在24C04 EEPROM和DS1307 RTC中。DS1307 RTC和AT24C32 EEPROM的SCL和SDA线都被拉高模块。引脚上的电压是3.26V.SDA和SCL线的两个IC与PIC SDA和SCL引脚连接。启动位(S)正确设置。在发送NACK位时,它只停留在读函数上。我也正在学习这个过程。任何帮助都会非常感谢。谢谢你,PMK。
|
|
|
|
|
|
搜索论坛。试试我的扫描仪。它列出所有找到的地址,并返回找到的设备数量。如果使用NULL作为参数,它打印到stdio,否则将写入数组。您必须修改寄存器名称,以适合您的芯片。CON和STAT.
|
|
|
|
|
|
您好,软件实验室,这个函数中的代码是错误的,用于PIC32:在PIC32和PIC24设备中,TRSTAT位在I2CxSTAT寄存器的第14位,并且不与仅用于从模式的第2位的R_W状态重叠。
|
|
|
|
|
|
嗨,Mysil,我想你漏掉了我之前提到的关于PICMCudetails的一些要点。我用的是:不是PIC24或PIC32。我已经用24C04和DS1307在同一条i2c线上重新测试了代码。两者都工作得很好。我已经更改了24C04地址(A2,A1=01:A0未连接)。因为模块中的AT24C32地址(A2,A1&A0)是000(全部GNDed)。同样,我试图用同样的代码读取AT24C32。但没有成功。AcStAT位未清除。这意味着它没有在写入或读取时发送ACK位。可能是AT24C32中的问题吗?谢谢你,PMK
|
|
|
|
|
|
只是我修改了代码一点点。它现在工作得很好。以前,我已经对硬编码的DATETIME值进行了测试。现在我必须拆分传入的数据字符串并写入DS1307。我写东西有点困难。硬编码的日期时间:现在我必须把字符串分割成DS1307。我可以把字符串分割,但不能得到正确的结果。我可以把它们分割成字符串,然后转换成“int”并转换为IntToBCD。但是,我收到的值是错误的。非常感谢您的帮助。请注意:“D”前缀有datetime字符串,以便识别date string.pmk。
|
|
|
|
|
|
如果strSec是一个字符数组,那么它们不会像您希望的那样执行任何操作。您不能仅仅使用强制转换将字符串转换为整数。
|
|
|
|
|
|
嗨,BCD在C语言中处理起来有点笨拙,函数decToBcd(int val)的参数必须是一个整数二进制值,每个条目介于0到60之间,而不是字符串之间。使用强制转换操作“(int)”可能消除编译器警告,但不会有助于做出正确的处理。相反,你可以这样做:MysIL
|
|
|
|
|
|
…或者只编写自己的“string to BCD”函数,这涉及较少的数学运算。如果您假设输入总是一个2位数字,即不需要进行完整性检查,那么这很简单。
|
|
|
|
|
|
我用这个函数得到了结果,但我还需要一个帮助。如果小时是>9并且小于13,我必须更新Hr(02h)寄存器的12Hr位(位6)、AM/PM位(位5)和10Hrs位4。我可以使用HORE正确地设置12HR位和AM/PM位。但是设置一个10HR位和0-3小时寄存器有点混乱。有什么帮助吗?PMK
|
|
|
|
|
|
我认为我的综合功能是更干净,但坚持与你正在使用:
|
|
|
|
|
|
设置10小时位(BIT4)如何?PMK
|
|
|
|
|
|
这已经由BCD转换设置了。例如,如果十进制值是10,BCD版本是0x10,因此位4被设置。
|
|
|
|
|
|
好啊。最后,在你的帮助下,一切都很好。我还是需要你澄清一下。我可以得到正确的值时,读取其他地址使用BCDtoDEC函数,除了小时RG。但是如果我用函数来转换小时RG,我得到的值是错误的。为什么?我附上了代码的图像和结果。我只避免了这个小时函数的转换函数。此外,我必须做一些工作,以获得正确的人力资源价值,通过减去6的人力资源价值,如果人力资源为9英镑。这是正确的方法吗?或者你还有其他简单的解决方案吗?谢谢QYB和MySIL.PMK
|
|
|
|
|
|
Current_Hrs=bcdtoDec(Set_DS1307[2]&0x3F);//.out bit 6试试看,bit 6包含需要屏蔽掉的12/24位。如果在12小时模式下屏蔽掉bit5,那么在显示器上使用bit5作为am/pm符号。
|
|
|
|
|
|
当读取bcd号码时,您可以用十六进制显示它们,这样就不需要bcdtodec函数了。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
454 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3529 浏览 3 评论
1121浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
466浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 17:48 , Processed in 1.226710 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
533