AT24C02 IIC总线调试记录

周末在家调AT24C02,分享一下调试记录,给有需要的人参考一下:

  1. 刚开始的时候读出来的数据全部都是0x00;正常新的EEPROM里面的数据没有初始化的都是0xFF; 刚开始怀疑是AT24C02坏了,毕竟放置了10多年了,后来换了一块新的AT24C02还是一样的问题,开始查代码,终于发现问题,ReadByte读数据时,51单片机IO口要拉高,我把它置成0了,即使这时候AT24C02有数据过来,也不会把SDA这个引脚拉高,所以读出来的数据全部是0.
  2. 另外一个问题,读数据,一次可以,一次不行;很有规律的交替; 查了很久,终于在数据手册上查到原因。因为我是顺序读,读到最后一个字节的时候我也发ACKLOW给AT24C02,然后再发一个STOP的条件给AT24C02,导致它停不下来,在逻辑分析仪上可以看到我最后的那一个ACKLOW之后,SDA一直为低,即使再发STOP停止信号之后,再发SDA为高的指令,依旧不起作用,所以就导致下一条的读取指令异常。按照数据手册改一下就OK了,再用逻辑分析仪看,数据波形完美,DONE!
  3. 用串口工具先写入一串固定的数据,数据在程序里用一个数据定义好了,unsigned char Write_Buf[12]={12,15,19,11,20,25,29,29};
  4. 串口通信我自己定义了一个简单的通讯协议,如下: 控制命令02是写入EEPROM,03是从EEPROM里面把之前写入的数据读出来。
  5. 实物用的是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值