電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
創(chuàng)作
電子發(fā)燒友網>電子資料下載>單片機>at24c64讀寫程序

at24c64讀寫程序

2008-08-13 | rar | 76 | 次下載 | 10積分

資料介紹

// AT24C64 support functions using ATMEGA's TWI
// pin-WP is hard-wired to GND
// fuctions work better outside interrupt routines
// by MXH, 2003/07/30

#i nclude "DStruct.h"
#i nclude

// CONSTANTS DEFINITION FOR EEPROM
#define EEADDR?0
#define EEWR?0
#define EERD?1
// TWINT *NOT* set after STOP condition is sent
// check status?
// TWSTO is cleared by hardware
#define TwiStop()?TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTO)
#define TwiStart()?TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTA)
#define TWI_STATUS?(TWSR & 0xF8)

BYTE byEEWait;

//////////////////////////////////////////////////////////////////////////
// implementation

BOOL EEPStart(BYTE addr, BOOL bWrite)
{
byEEWait = 10;?// 90~100ms
poll_ack:
TwiStart();
while (!(TWCR & (1<if ( byEEWait == 0 ){
return FALSE;
}
}
if ((TWI_STATUS != TW_START)&&(TWI_STATUS != TW_REP_START))
goto poll_ack;
//byEEWait = 3;?// 20~30ms
// send SLA+R/W
TWDR = addr | bWrite;
TWCR = (1<while (!(TWCR & (1<if( byEEWait == 0 ){
TwiStop();
return FALSE;
}
}
if( EEWR == bWrite ){?// MT mode
//if(TWI_STATUS != TW_MT_SLA_ACK)
switch(TWI_STATUS){
case TW_MT_SLA_ACK:
break;
case TW_MT_SLA_NACK:
goto poll_ack;
default:
TwiStop();
return FALSE;
}
}else{?// MR mode
if(TWI_STATUS != TW_MR_SLA_ACK)
return FALSE;
}
return TRUE;
}

//////////////////////////////////////////////////////////////////////
//
BYTE EEPWrite( WORD uiAddress, WORD uiLen, void *pBuf ) //using 0
{
unsigned int i,j,uiCnt;

if( uiLen == 0 ) return 0;
uiCnt = 0;
//?uiEnd = uiAddress + uiLen;
i = uiAddress;
do{
if(!EEPStart(0xA0|EEADDR,EEWR)){?//PollAck() is built-in
return 0;
}
TWDR = (BYTE)((i>>8)&0x00ff);?// MSB of address
TWCR = (1<byEEWait = 3;?// 20~30ms
while (!(TWCR & (1<if( byEEWait == 0 )
return FALSE;
}
if(TWI_STATUS != TW_MT_DATA_ACK){
return FALSE;
}
TWDR = (BYTE)(i&0x00ff);?// LSB of address
TWCR = (1<byEEWait = 3;?// 20~30ms
while (!(TWCR & (1<if( byEEWait == 0 )
return FALSE;
}
if(TWI_STATUS != TW_MT_DATA_ACK)
return FALSE;
// write data
for( j=0; j<32; j++ ){
TWDR = ((BYTE*)pBuf)[uiCnt];
TWCR = (1<byEEWait = 3;?// 20~30ms
while (!(TWCR & (1<if( byEEWait == 0 )
return FALSE;
}
if(TWI_STATUS != TW_MT_DATA_ACK){
return FALSE;
}
i++;
uiCnt++;
if(( 0 == i%32 )||( uiCnt == uiLen )){
TwiStop();
break;
}
}
}while( uiCnt < uiLen );
//?while( !PollAck());
return 1;
}

//////////////////////////////////////////////////////////////////////
//
BYTE EEPRead( WORD uiAddress, WORD uiLen, void *pBuf )
{
UINT i;

if ( uiLen == 0 ) return 0;
if(!EEPStart(0xA0|EEADDR,EEWR)){?//PollAck() is built-in
return 0;?//↑
}?// not RD but write device address to the chip
TWDR = (BYTE)(( uiAddress >> 8) & 0x00ff );?//((BYTE*)(&uiAddress))[1];?// MSB of address
TWCR = (1<byEEWait = 3;?// 20~30ms
while (!(TWCR & (1<if( byEEWait == 0 )
return FALSE;
}
if (TWI_STATUS != TW_MT_DATA_ACK)
return FALSE;
TWDR = (BYTE)( uiAddress & 0x00ff );?//((BYTE*)(&uiAddress))[0];?// LSB of address
TWCR = (1<byEEWait = 3;?// 20~30ms
while (!(TWCR & (1<if( byEEWait == 0 )
return FALSE;
}
if (TWI_STATUS != TW_MT_DATA_ACK)
return FALSE;
if(!EEPStart(0xA0+EEADDR,EERD)){?//PollAck()){
return 0;?//↑
}// ??? how to read?
for ( i=0; iTWCR = _BV(TWINT)|_BV(TWEN)|_BV(TWEA);
byEEWait = 3;?// 20~30ms
while (!(TWCR & (1<if( byEEWait == 0 )
return FALSE;
}
if (TWI_STATUS != TW_MR_DATA_ACK)
return FALSE;
((BYTE*)pBuf)[i] = TWDR;?// EEInByte();
}
TWCR = _BV(TWINT) | _BV(TWEN);?// send NACK to indicate final byte
byEEWait = 3;?// 20~30ms
while (!(TWCR & (1<if( byEEWait == 0 )
return FALSE;
}
//if (TWI_STATUS != TW_MR_DATA_ACK)
//?return FALSE;
((BYTE*)pBuf)[i] = TWDR;
TwiStop();
return 1;
}

附錄:
;============================
;STC89C51讀寫AT24C64匯編程序
;===========================
BITCNT??? EQU?????? 42H
SDADR???? EQU?????? 40H
SDA?????? BIT???????? P0.1
SCL?????? BIT???????? P0.0
ORG?????? 0000H
JMP??????? MAIN
ORG?????? 0100H

MAIN:
MOV????? R7,? #01010101B
ACALL?? WRITE_AT24C64
ACALL?? DELAY
ACALL?? READ_AT24C64
MOV????? P3,? A
ACALL?? DELAY

;ACALL? 顯示、鍵盤子程序

JMP??????? MAIN????
;=============================
DELAY:
MOV?????? R6,? #0FFH

DELAY0:
MOV?????? R5,? #0FFH

DELAY1:??????????????
DJNZ????? R5,? DELAY1
DJNZ????? R6,? DELAY0
RET
;=============================

WRITE_AT24C64:
ACALL?????????? START???????????????????? ;發(fā)送起始條件
MOV????????????? A,??? #0A0H????????????? ;AT24C64總線地址
ACALL?????????? SENTBYTE????????????????? ;發(fā)送AT24C64器件總線地址
JB????????????? F0,? SENDRETURN?????????? ;出錯返回
MOV???????????? R0,? #SDADR?????????????? ;取存儲地址
MOV???????????? A,??? @R0
ACALL?????????? SENTBYTE
JB????????????? F0,? SENDRETURN
INC???????????? R0
MOV???????????? A,??? @R0
ACALL?????????? SENTBYTE
JB????????????? F0,? SENDRETURN
MOV???????????? A,??? R7
ACALL?????????? SENTBYTE?????????????????? ;發(fā)送一次數據
JB????????????? F0,? SENDRETURN??????????? ;出錯返回
ACALL?????????? STOP?????????????????????? ;發(fā)送停止條件

DELAY10:?????
MOV???????????? R4,? #30H????????????????? ;延時10mS等待數據寫完

DELAY11:
MOV???????????? R3,? #34H
DJNZ??????????? R3,? $
DJNZ??????????? R4,??????? DELAY11

SENDRETURN:
RET
;=============================
READ_AT24C64:???????????????????????????? ;讀AT24C64
ACALL?????????? START???????????????????? ;發(fā)送IC總線起始條件
MOV???????????? A,??? #0A0H
ACALL?????????? SENTBYTE????????????????? ;AT24C64總線地址
JB????????????? F0,? RCVRETURN????   ?? ;出錯返回
MOV???????????? R0,? #SDADR???????????   ;取存儲地址
MOV???????????? A,??? @R0
ACALL?????????? SENTBYTE????????????????? ;發(fā)送AT24C64器件總線地址
JB????????????? F0,? SENDRETURN????   ? ;出錯返回
INC???????????? R0
MOV???????????? A,??? @R0
ACALL?????????? SENTBYTE????????????????? ;發(fā)送AT24C64器件總線地址
JB????????????? F0,? SENDRETURN
ACALL?????????? START???????????????????? ;發(fā)送IC總線重復起始條件
MOV????????????? A,??? #0A0H????????????? ;AT24C64總線地址
SETB??????????? ACC.0????????????????  ? ;取總線讀操作數
ACALL?????????? SENTBYTE????????????????? ;發(fā)送被控制總線地址
JB????????????? F0,? RCVRETURN??????    ;出錯返回
ACALL?????????? RCVBYTE?????????????????? ;接收數據

RCVRETURN:
RET
;===============================
START:
SETB??????????? SDA??????????? ;發(fā)送起始條件的數據信號
NOP
SETB??????????? SCL??????????? ;發(fā)送起始條件的時鐘信號
NOP
CLR???????????? SDA??????????? ;發(fā)送起始信號
NOP
CLR????????????? SCL?????????? ;準備發(fā)送或接收數據
RET
;===============================
STOP:
CLR??????? SDA????????????????? ;發(fā)送停止條件的數據信號
NOP
SETB?????? SCL????????????????? ;發(fā)送停止條件的時鐘信號
NOP
SETB?????? SDA????????????????? ;發(fā)送總線停止信號
NOP
RET
;==============================
SENTBYTE:???????????????????????? ;送數8位
MOV???????? BITCNT,#08H

SENTB:
RLC??????? A??????????   ??????? ;要發(fā)送的數據左移,發(fā)送入位C
MOV??????? SDA,????? C
SETB?????? SCL???????????????????? ;置時鐘線為高,通知被控制開始接
收數據位
CLR??????? SCL???????????????????? ;準備接收下一個數據位
DJNZ?????? BITCNT,SENTB??????????? ;8位沒發(fā)送完繼續(xù)發(fā)送
SETB?????? SDA???????????????????? ;8位發(fā)送完后釋放數據線準備收應答位
SETB?????? SCL???????????????????? ;開始接收應答信號
CLR??????? F0????????????????????? ;預先清發(fā)送數據出錯標志
JNB??????? SDA,????? ACKEND??????? ;判斷是否接收應答信號正常轉ACKEND
SETB?????? F0????????????????????? ;未收到應答置位錯誤標志

ACKEND:
CLR??????? SCL???????????????????? ;發(fā)送結束準備下次發(fā)送或接收數據
RET
;==============================
RCVBYTE:
SETB??????? SDA???????????????????? ;置數據線為輸入方式
MOV???????? BITCNT,#08H???????????? ;傳送的數據長度為8位

RCV:
CLR???????? SCL???????????????????? ;置時鐘線為低,準備接收數據
SETB??????? SCL???????????????????? ;置時鐘線為高使數據線上數據有效
MOV???????? C,??? SDA
RLC??????  A?????????????????????? ;接收的數據位放入ACC
DJNZ??????? BITCNT,RCV????????????? ;8位沒收完繼續(xù)接收
CLR???  ?? SCL???????????????????? ;8位接收完置時鐘線和數據線
CLR??????  SDA
SETB??????? SDA???????????????????? ;接收非應答信號
SETB??????? SCL???????????????????? ;置時鐘線為高使應答位有效
SETB??????? SDA
CLR??????  SCL???????????????????? ;清時鐘線以便發(fā)送停止條件
RET
;============================
;顯示、鍵盤子程序
;===========================
END

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TC358743XBG評估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費
  3. 2開關電源基礎知識
  4. 5.73 MB  |  6次下載  |  免費
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設計
  8. 0.60 MB  |  3次下載  |  免費
  9. 5基于FPGA的光纖通信系統(tǒng)的設計與實現(xiàn)
  10. 0.61 MB  |  2次下載  |  免費
  11. 651單片機窗簾控制器仿真程序
  12. 1.93 MB  |  2次下載  |  免費
  13. 751單片機大棚環(huán)境控制器仿真程序
  14. 1.10 MB  |  2次下載  |  免費
  15. 8基于51單片機的RGB調色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537796次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191185次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費