資料介紹
// 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<
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<
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<
while (!(TWCR & (1<
return FALSE;
}
if(TWI_STATUS != TW_MT_DATA_ACK){
return FALSE;
}
TWDR = (BYTE)(i&0x00ff);?// LSB of address
TWCR = (1<
while (!(TWCR & (1<
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<
while (!(TWCR & (1<
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<
while (!(TWCR & (1<
return FALSE;
}
if (TWI_STATUS != TW_MT_DATA_ACK)
return FALSE;
TWDR = (BYTE)( uiAddress & 0x00ff );?//((BYTE*)(&uiAddress))[0];?// LSB of address
TWCR = (1<
while (!(TWCR & (1<
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; i
byEEWait = 3;?// 20~30ms
while (!(TWCR & (1<
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<
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???????????????????? ;發送起始條件
MOV????????????? A,??? #0A0H????????????? ;AT24C64總線地址
ACALL?????????? SENTBYTE????????????????? ;發送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?????????????????? ;發送一次數據
JB????????????? F0,? SENDRETURN??????????? ;出錯返回
ACALL?????????? STOP?????????????????????? ;發送停止條件
DELAY10:?????
MOV???????????? R4,? #30H????????????????? ;延時10mS等待數據寫完
DELAY11:
MOV???????????? R3,? #34H
DJNZ??????????? R3,? $
DJNZ??????????? R4,??????? DELAY11
SENDRETURN:
RET
;=============================
READ_AT24C64:???????????????????????????? ;讀AT24C64
ACALL?????????? START???????????????????? ;發送IC總線起始條件
MOV???????????? A,??? #0A0H
ACALL?????????? SENTBYTE????????????????? ;AT24C64總線地址
JB????????????? F0,? RCVRETURN???? ?? ;出錯返回
MOV???????????? R0,? #SDADR??????????? ;取存儲地址
MOV???????????? A,??? @R0
ACALL?????????? SENTBYTE????????????????? ;發送AT24C64器件總線地址
JB????????????? F0,? SENDRETURN???? ? ;出錯返回
INC???????????? R0
MOV???????????? A,??? @R0
ACALL?????????? SENTBYTE????????????????? ;發送AT24C64器件總線地址
JB????????????? F0,? SENDRETURN
ACALL?????????? START???????????????????? ;發送IC總線重復起始條件
MOV????????????? A,??? #0A0H????????????? ;AT24C64總線地址
SETB??????????? ACC.0???????????????? ? ;取總線讀操作數
ACALL?????????? SENTBYTE????????????????? ;發送被控制總線地址
JB????????????? F0,? RCVRETURN?????? ;出錯返回
ACALL?????????? RCVBYTE?????????????????? ;接收數據
RCVRETURN:
RET
;===============================
START:
SETB??????????? SDA??????????? ;發送起始條件的數據信號
NOP
SETB??????????? SCL??????????? ;發送起始條件的時鐘信號
NOP
CLR???????????? SDA??????????? ;發送起始信號
NOP
CLR????????????? SCL?????????? ;準備發送或接收數據
RET
;===============================
STOP:
CLR??????? SDA????????????????? ;發送停止條件的數據信號
NOP
SETB?????? SCL????????????????? ;發送停止條件的時鐘信號
NOP
SETB?????? SDA????????????????? ;發送總線停止信號
NOP
RET
;==============================
SENTBYTE:???????????????????????? ;送數8位
MOV???????? BITCNT,#08H
SENTB:
RLC??????? A?????????? ??????? ;要發送的數據左移,發送入位C
MOV??????? SDA,????? C
SETB?????? SCL???????????????????? ;置時鐘線為高,通知被控制開始接
收數據位
CLR??????? SCL???????????????????? ;準備接收下一個數據位
DJNZ?????? BITCNT,SENTB??????????? ;8位沒發送完繼續發送
SETB?????? SDA???????????????????? ;8位發送完后釋放數據線準備收應答位
SETB?????? SCL???????????????????? ;開始接收應答信號
CLR??????? F0????????????????????? ;預先清發送數據出錯標志
JNB??????? SDA,????? ACKEND??????? ;判斷是否接收應答信號正常轉ACKEND
SETB?????? F0????????????????????? ;未收到應答置位錯誤標志
ACKEND:
CLR??????? SCL???????????????????? ;發送結束準備下次發送或接收數據
RET
;==============================
RCVBYTE:
SETB??????? SDA???????????????????? ;置數據線為輸入方式
MOV???????? BITCNT,#08H???????????? ;傳送的數據長度為8位
RCV:
CLR???????? SCL???????????????????? ;置時鐘線為低,準備接收數據
SETB??????? SCL???????????????????? ;置時鐘線為高使數據線上數據有效
MOV???????? C,??? SDA
RLC?????? A?????????????????????? ;接收的數據位放入ACC
DJNZ??????? BITCNT,RCV????????????? ;8位沒收完繼續接收
CLR??? ?? SCL???????????????????? ;8位接收完置時鐘線和數據線
CLR?????? SDA
SETB??????? SDA???????????????????? ;接收非應答信號
SETB??????? SCL???????????????????? ;置時鐘線為高使應答位有效
SETB??????? SDA
CLR?????? SCL???????????????????? ;清時鐘線以便發送停止條件
RET
;============================
;顯示、鍵盤子程序
;===========================
END
- 基于51單片機的iic--24c02EEPROM讀寫程序 0次下載
- 51單片機讀寫24C64,操作TM1638模塊 7次下載
- 51單片機——讀寫AT24c64
- AT24C32和AT24C64及DS3231的數據手冊和驅動程序及電路圖免費下載 57次下載
- 24C1024B讀寫C語言程序免費下載 67次下載
- 模擬IIC讀寫總結之at24c512讀寫程序 95次下載
- SD卡讀寫C程序 17次下載
- 24c16讀寫驅動程序
- AVR TWI讀寫范例程序(AT24C02)
- 24c02/24c01/24c04讀寫程序
- 24c32/24c16/24c08讀寫程序
- AT24C32/AT24C56讀寫程序
- at24c32/at24c64 pdf datasheet
- at24c01程序(讀寫程序)
- at24c16 c程序
- 通過IIC總線讀寫AT24C512存儲器 2881次閱讀
- AT24C04芯片驅動程序原理 2410次閱讀
- 使用51單片機讀寫AT29C040的C語言程序免費下載 4812次閱讀
- 51單片機讀寫AT29C040的C51程序 4990次閱讀
- HD44780讀寫單片機C51程序免費下載 4383次閱讀
- 使用HD44780讀寫單片機的C51程序詳細概述 3304次閱讀
- AT24C系列芯片的驅動設計 4813次閱讀
- AT89S52單片機并行端口模擬I2C總線協議讀寫AT24C04的設計 2766次閱讀
- 如何使用單片機模擬讀寫24C01EEPROM數據 5145次閱讀
- PIC單片機的AT24C64通訊設計 1971次閱讀
- FSMC如何讀寫CPLD 3538次閱讀
- C51讀寫AT24C04源代碼及AT24C04測試程序 1.7w次閱讀
- AT24C256介紹_AT24C256燒錄的完整程序 1.5w次閱讀
- 單片機之IIC--AT24C256的讀寫程序 1.4w次閱讀
- 讀寫24LCxx系列的EEPROM的實例程序 2267次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 651單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 751單片機大棚環境控制器仿真程序
- 1.10 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論