由于用到了低功耗单片机EFM32,其中用到了最常用的24CXX系列的EEPROM。应该来说是很简单的应用了。网上随便一搜,N多的GPIO模拟IIC的例程。而官方的IIC库也没有应用于读写EEPROM的例程,加上原来在MSP430上也是用的模拟IIC。为了省事,便直接Copy过来了代码,然后一些低层的#define去改了改。
结果,读出来全是0xff,于是上示波器,也没看明白。
一步一步的仿真。发现,根据不返回ACK状态。
难道芯片是坏的?
于是,从旧板上拆了一个下来,问题依旧。
难道是GPIO有多定义,被别的给定义了?
简单的让它置1,置0,万用表量,可以实现。
继续把所有程序都屏蔽了,只留下简单的测试EEPROM的程度段。
于是,继续百度资料,时序、电平各方面都满足啊。
有人读出0xff的,也没说怎么解决的。估计是各有各的问题吧。
。。。
三天后,已经心焦的不行了。
、、、
偶然看了一眼代码。发现:
#define L_SDA GPIO_PortOutClear(I2C_SDA_PORT,I2C_SDA_PIN) //SDA 复位
#define L_SCL GPIO_PortOutClear(I2C_SCL_PORT,I2C_SCL_PIN) //SCL 复位
怎么是port,应该是pin吧。
一查原因,原来是直接从另外一个地方直接复制过来的,而原来的位置目前还没用到过置0的功能。所以,没发现问题。
于是,修改了一下。
#define L_SDA GPIO_PinOutClear(I2C_SDA_PORT,I2C_SDA_PIN) //SDA 复位
#define L_SCL GPIO_PinOutClear(I2C_SCL_PORT,I2C_SCL_PIN) //SCL 复位
心想,终于解决了。
结果一仿真,有返回ACK,但是读出来还是0xff。
真是一波三折。
后来反应过来,是旧芯片,内部应该有数据的,先去读,如果能读出来,说明是写的问题了。
读正常,写不正常。
换块板子,读写都正常。
不管咋地,解决了。真是简单的问题搞了三天,自己太粗心了。以后要不得。