EFM32 用GPIO模拟IIC读写EEPROM,读出来是0xff?

由于用到了低功耗单片机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。

真是一波三折。

后来反应过来,是旧芯片,内部应该有数据的,先去读,如果能读出来,说明是写的问题了。

读正常,写不正常。

换块板子,读写都正常。

不管咋地,解决了。真是简单的问题搞了三天,自己太粗心了。以后要不得。

你可能感兴趣的:(EFM32 用GPIO模拟IIC读写EEPROM,读出来是0xff?)