AT24C02 IIC总线调试记录 |
您所在的位置:网站首页 › i2c的地址读不出来 › AT24C02 IIC总线调试记录 |
周末在家调AT24C02,分享一下调试记录,给有需要的人参考一下: 刚开始的时候读出来的数据全部都是0x00;正常新的EEPROM里面的数据没有初始化的都是0xFF; 刚开始怀疑是AT24C02坏了,毕竟放置了10多年了,后来换了一块新的AT24C02还是一样的问题,开始查代码,终于发现问题,ReadByte读数据时,51单片机IO口要拉高,我把它置成0了,即使这时候AT24C02有数据过来,也不会把SDA这个引脚拉高,所以读出来的数据全部是0. 另外一个问题,读数据,一次可以,一次不行;很有规律的交替; 查了很久,终于在数据手册上查到原因。因为我是顺序读,读到最后一个字节的时候我也发ACKLOW给AT24C02,然后再发一个STOP的条件给AT24C02,导致它停不下来,在逻辑分析仪上可以看到我最后的那一个ACKLOW之后,SDA一直为低,即使再发STOP停止信号之后,再发SDA为高的指令,依旧不起作用,所以就导致下一条的读取指令异常。按照数据手册改一下就OK了,再用逻辑分析仪看,数据波形完美,DONE! 用串口工具先写入一串固定的数据,数据在程序里用一个数据定义好了,unsigned char Write_Buf[12]={12,15,19,11,20,25,29,29}; 串口通信我自己定义了一个简单的通讯协议,如下: 控制命令02是写入EEPROM,03是从EEPROM里面把之前写入的数据读出来。 实物用的是STC89C52单片机,11.0592M晶振,波特率9600
调试过的代码张贴如下: #include #include sbit e_wp=P0^5; // EEPROM WP sbit e_scl=P0^6; // EEPROM SCL sbit e_sda=P0^7; // EEPROM SDA #define uchar unsigned char #define uint unsigned int #define u8 unsigned char #define u16 unsigned int #define false 0 #define true 1 void Timer0Init(void); void UartInit(void); void Uart_Tx_OneByte(unsigned char Byte); void Uart_Send_Tx_Buf(unsigned char *str, unsigned char len); void Parse_Frame(void); void CMD_CL(void); void Write_EEPROM(void); // For test void Read_EEPROM(void); // For test uchar write_eep(uchar eep_addr,uchar *ptr2,uchar lenth); /* write data to eeprom */ uchar read_eep(uchar eep_addr,uchar *ptr2,uchar lenth); uchar eep_ini(void); uchar write_onebyte(uchar byte); uchar read_onebyte(void); void eep_start(void); void eep_stop(void); void eep_acklow(void); v |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |