AT24C02 IIC总线调试记录

您所在的位置:网站首页 i2c的地址读不出来 AT24C02 IIC总线调试记录

AT24C02 IIC总线调试记录

2024-07-16 13:17| 来源: 网络整理| 查看: 265

周末在家调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