標(biāo)題: AT24C02都出來的數(shù)一直不變是什么原因???求大神指點(diǎn),經(jīng)測試1602顯示是沒問題的 [打印本頁]

作者: cy_0211    時(shí)間: 2018-4-17 10:45
標(biāo)題: AT24C02都出來的數(shù)一直不變是什么原因???求大神指點(diǎn),經(jīng)測試1602顯示是沒問題的
#define uchar unsigned char
#define uint unsigned int
sbit SCK=P3^6;       //串行時(shí)鐘輸入
sbit SDA=P3^7;      //串行數(shù)據(jù)輸入/輸出
void Start()//起始信號
{
SDA=1;
delay5us();//延時(shí)要大于4.7us,取5u
SCK=1;
delay5us();
SDA=0;
delay5us();
}
void Stop()//結(jié)束信號
{
SDA=0;
delay5us();//延時(shí)要大于4.7us,取5us
SCK=1;
delay5us();
SDA=1;
delay5us();
}
void Ack()//應(yīng)答信號
{
SDA=0;
SCK=0;
delay5us();
SCK=1;
delay5us();
SCK=0;
}
/*SCK在高電平期間,SDA被拉為低電平表示應(yīng)答*/
bit WaitAck()//等待應(yīng)答信號
{
SDA=1;//釋放總線
delay5us();
SCK=1;
delay5us();
if(SDA)//無應(yīng)答
{
  SCK=0;
  Stop();
  return 0;
}
else
{
  SCK=0;
  return 1;
}
}
void InputOneByte(uchar dat)//寫入一個(gè)字節(jié)AT24C02
{
uchar iVal;
for(iVal=0;iVal<8;iVal++)
{
  SCK=0;
  delay5us();
  SDA=(dat & 0x80)>>7;//將數(shù)據(jù)的最高位放入SAD,如0011 0010
  //則將末位0送入SDA
  delay5us();
  SCK=1;
  dat<<=1;//數(shù)據(jù)左移一位,準(zhǔn)備存第二位數(shù)
}
SCK=0;
}
uchar OutputOneByte()//讀取一個(gè)字節(jié)
{
uchar iVal;
uchar x;//保存讀取到的值
SDA=1;//釋放總線,以讓SDA線轉(zhuǎn)由接收設(shè)備(AT24C02)控制
for(iVal=0;iVal<8;iVal++)
{
  SCK=0;
  delay5us();
  SCK=1;
  delay5us();
  x<<=1;//從低位開始讀
  if(SDA)
   x |= 0x01;//將SDA上的數(shù)據(jù)通過按位“或“運(yùn)算存入x中
}
SCK=0;
return x;
}
void WriteAddAndDate(uchar add,uchar dat)
{
Start();//啟動(dòng)
InputOneByte(0xA0);//寫入器件AT24C02地址
WaitAck();//等待器件應(yīng)答
InputOneByte(add);//存放數(shù)據(jù)的地址
WaitAck();//等待器件應(yīng)答
InputOneByte(dat);//要保存的數(shù)據(jù)
WaitAck();//等待器件應(yīng)答
Stop();
}
uchar ReadDataFromDatAdd(uchar DatAdd)//從某個(gè)地址讀取數(shù)據(jù)
{
uchar Data;
Start();
InputOneByte(0xA0);//寫入器件AT24C02地址
WaitAck();//等待器件應(yīng)答
InputOneByte(DatAdd);//存放數(shù)據(jù)的地址
WaitAck();//等待器件應(yīng)答
Start();
InputOneByte(0xA1);//讀取數(shù)據(jù)的器件地址
WaitAck();//等待器件應(yīng)答
Data=OutputOneByte();//d讀取數(shù)據(jù)
Stop();
return Data;
}
void main()
{
  float AT;
/**********AT24C02轉(zhuǎn)換***********/
  LCD_Initial();
  GotoXY(0,0);//設(shè)定顯示位置
  WriteAddAndDate(0X01,0X85);
  AT=ReadDataFromDatAdd(0X00);
  sprintf(table2,"The data is:%f",AT);//將數(shù)據(jù)寫入table2中
  Print(table2);//打印
  while(1);
}

作者: liqingyong    時(shí)間: 2018-4-17 15:22
我之前也遇到這樣的情況,軟件工程師也說不出啥原因,后面把24C02的通訊腳上拉電阻加10K就可以了。不知是不是你沒接上拉電阻。
作者: cy_0211    時(shí)間: 2018-4-18 19:15
liqingyong 發(fā)表于 2018-4-17 15:22
我之前也遇到這樣的情況,軟件工程師也說不出啥原因,后面把24C02的通訊腳上拉電阻加10K就可以了。不知是不 ...

加上了,很煩[
作者: jielness    時(shí)間: 2018-5-6 11:53
兩個(gè)問題,
一是AT24C02芯片連接要有電阻。
二是每寫完數(shù)據(jù)要有10ms的延時(shí),用于芯片把數(shù)據(jù)轉(zhuǎn)化成不可擦除的。這段時(shí)間芯片不會響應(yīng)讀寫信號。

附錄是datasheet,重點(diǎn)應(yīng)該高亮了。主要看時(shí)序和write/read operation

00_AT24C02A.pdf

184.52 KB, 下載次數(shù): 19

芯片手冊


作者: 云之凡    時(shí)間: 2018-10-2 16:52
讀出來的數(shù)據(jù)是I5對吧?
作者: jindizhiwa    時(shí)間: 2018-10-2 22:37
單步走,走到口線輸出的地方停下量下口線電壓;蛘哂檬静ㄆ骺床ㄐ。

作者: sxhwdz    時(shí)間: 2018-10-3 07:57
/*SCK在高電平期間,SDA被拉為低電平表示應(yīng)答*/
這個(gè)是錯(cuò)誤的,這個(gè)是START的定義。



可參考單片機(jī)論壇  http://www.torrancerestoration.com/bbs/dpj-136469-1.html
作者: lzb1989666    時(shí)間: 2018-10-4 21:57
先檢查硬件是否接線正確,再檢查軟件程序接口調(diào)動(dòng)對不對,如果都正確,就是軟件時(shí)序處理不當(dāng)導(dǎo)致的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1