周末在家调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 <reg51.h>
#include <intrins.h>
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