大家好,我现在正在进行一个项目,需要与EEPROM和RTC的I2C
通信。我正在使用“PIC32MZ EC启动器套件(DM320006)”,上面安装有PIC32MZ2048ECH144,该套件分别连接到“168pin到132pin适配器(AC320006)”和“PIC32 I/O扩展板(DM320002)”,用于向系统中的其他
电路提供信号。我的设计是如此的简单,以至于每个SDA和SCL引脚在主(PIC32)和其他从上相互连接,并且在实验期间尝试了在这两个引脚上从1.2Kohm到5.1Kohm的不同的上拉电阻。事实上,我以前已经成功地用PIC18
单片机设计过这样的系统,而且我一生中从未遇到过这样的问题。我还要提到,这是我第一次使用PIC32单片机。我的第一个“Hello World”程序是写和从EEPROM(24LC512,设备地址0b10100110)读取一些数据字节,并检查发送和接收的值是否相等。但是,我意识到通信有问题,并且总线合谋位(I2CSTATbits.BCL)被设置了,我的程序永远不会结束。经过3天的艰苦工作,我发现如果我想在EEPROM上写一个小于或等于0x7F的数据值,SDA引脚在停止状态之后仍然保持低电平,从而使总线繁忙。但是大于或等于0x80的值正在按预期发送,即,在停止状态之后,SDA和SCL都保持为高,因此总线对于进一步的通信信号是空闲的。我写“交谈”是因为我知道通信是成功的,因为我在发送“设备地址”、“EEPROM上的内存位置——高字节和低字节”以及“正在写入数据字节”的同时在第九个时钟上获得了ACKLOW。上述和唯一的问题发生在主发送停止条件后,发送了上述标准中给出的某些字节。为了查看eeprom是否正在创建此错误,我断开了与EEPROM或任何其他从设备的SDA SCL管脚的连接,并尝试再次发送数据。当然,这次不会看到ACK低点,但我只想看看成功的停止条件是否会被创建。但我意识到,即使没有奴隶连接到I2C总线,同样的行为继续!!!!在这次故障(发送0x7F)和非故障(发送0x80)期间,我张贴了两张SCL和SDA电压的示波器屏幕图像照片。你可以很容易地跟踪正在发送的时钟和数据信号。请注意在通信开始之前的信号(SDA SCL HGH),在通信结束之后有一个停止条件,SDA保持低,这是错误的行为。我发现这个行为非常有趣和奇怪,所以我需要问感兴趣的人,还有有经验的我贴出了我写的最基本的代码,还有两张显示信号SCL和SDA的示波器屏幕图像的图片,同时发送0x7F(有错误)和0x80(无错误)。如上所述,这些图片显示没有连接从机的通信,因此你看不到ACK位低,但如果从机连接(我看到ACKs成功)也会发生同样的行为。I2CEEPROM测试函数:函数写0xkk的EEPROM内存位置0x00 kk。例如,0x80值写在内存位置0x00 80,0x81- & 0x00,…函数还读取数据并检查发送和接收的数据是否相同。这里,在下面的代码中,如果将0x80更改为0x7F,则在第一次写入尝试中发生上述错误。如果从0x80开始写入数据,则不会出现问题,并且完全成功。启动、停止、重复启动等。