datasheet
超过460,000+ 应用技术资源下载
null

at24c64读写程序

  • 1星
  • 日期: 2013-09-19
  • 大小: 8.47KB
  • 所需积分:1分
  • 下载次数:9
  • favicon收藏
  • rep举报
  • 分享
  • free评论
标签: AT24C

// 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 <avr/twi.h>// 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;//////////////////////////////////////////////////////////////////////////// implementationBOOL EEPStart(BYTE addr, BOOL bWrite){byEEWait = 10; // 90~100mspoll_ack:TwiStart();while (!(TWCR & (1<<TWINT))){ // waitif ( byEEWait == 0 ){return FALSE;}}if ((TWI_STATUS != TW_START)&&(TWI_STATUS != TW_REP_START))goto poll_ack;//byEEWait = 3; // 20~30ms// send SLA+R/WTWDR = addr | bWrite;TWCR = (1<<TWINT)|(1<<TWEN);while (!(TWCR & (1<<TWINT))){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 modeif(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-inreturn 0;}TWDR = (BYTE)((i>>8)&0x00ff); // MSB of addressTWCR = (1<<TWINT)|(1<<TWEN);byEEWait = 3; // 20~30mswhile (!(TWCR & (1<<TWINT))){if( byEEWait == 0 )return FALSE;}if(TWI_STATUS != TW_MT_DATA_ACK){return FALSE;}TWDR = (BYTE)(i&0x00ff); // LSB of addressTWCR = (1<<TWINT)|(1<<TWEN);byEEWait = 3; // 20~30mswhile (!(TWCR & (1<<TWINT))){if( byEEWait == 0 )return FALSE;}if(TWI_STATUS != TW_MT_DATA_ACK)return FALSE;// write datafor( j=0; j<32; j++ ){TWDR = ((BYTE*)pBuf)[uiCnt];TWCR = (1<<TWINT)|(1<<TWEN);byEEWait = 3; // 20~30mswhile (!(TWCR & (1<<TWINT))){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-inreturn 0; //↑} // not RD but write device address to the chipTWDR = (BYTE)(( uiAddress >> 8) & 0x00ff ); //((BYTE*)(&uiAddress))[1]; // MSB of addressTWCR = (1<<TWINT)|(1<<TWEN);byEEWait = 3; // 20~30mswhile (!(TWCR & (1<<TWINT))){if( byEEWait == 0 )return FALSE;}if (TWI_STATUS != TW_MT_DATA_ACK)return FALSE;TWDR = (BYTE)( uiAddress & 0x00ff ); //((BYTE*)(&uiAddress))[0]; // LSB of addressTWCR = (1<<TWINT)|(1<<TWEN);byEEWait = 3; // 20~30mswhile (!(TWCR & (1<<TWINT))){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; i<uiLen-1; i++ ){TWCR = _BV(TWINT)|_BV(TWEN)|_BV(TWEA);byEEWait = 3; // 20~30mswhile (!(TWCR & (1<<TWINT))){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 bytebyEEWait = 3; // 20~30mswhile (!(TWCR & (1<<TWINT))){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       42HSDADR     EQU       40HSDA       BIT         P0.1SCL       BIT         P0.0ORG       0000HJMP        MAINORG       0100HMAIN:MOV      R7,  #01010101BACALL   WRITE_AT24C64ACALL   DELAYACALL   READ_AT24C64MOV      P3,  AACALL   DELAY…;ACALL  显示、键盘子程序…JMP        MAIN     ;=============================DELAY:MOV       R6,  #0FFHDELAY0:MOV       R5,  #0FFHDELAY1:               DJNZ      R5,  DELAY1DJNZ      R6,  DELAY0RET;=============================WRITE_AT24C64:ACALL           START                     ;发送起始条件MOV              A,    #0A0H              ;AT24C64总线地址ACALL           SENTBYTE                  ;发送AT24C64器件总线地址JB              F0,  SENDRETURN           ;出错返回MOV             R0,  #SDADR               ;取存储地址MOV             A,    @R0ACALL           SENTBYTEJB              F0,  SENDRETURNINC             R0MOV             A,    @R0ACALL           SENTBYTEJB              F0,  SENDRETURNMOV             A,    R7ACALL           SENTBYTE                   ;发送一次数据JB              F0,  SENDRETURN            ;出错返回ACALL           STOP                       ;发送停止条件DELAY10:      MOV             R4,  #30H                  ;延时10mS等待数据写完DELAY11:MOV             R3,  #34HDJNZ            R3,  $DJNZ            R4,        DELAY11SENDRETURN:RET;=============================READ_AT24C64:                             ;读AT24C64ACALL           START                     ;发送IC总线起始条件MOV             A,    #0A0HACALL           SENTBYTE                  ;AT24C64总线地址JB              F0,  RCVRETURN          ;出错返回MOV             R0,  #SDADR              ;取存储地址MOV             A,    @R0ACALL           SENTBYTE                  ;发送AT24C64器件总线地址JB              F0,  SENDRETURN         ;出错返回INC             R0MOV             A,    @R0ACALL           SENTBYTE                  ;发送AT24C64器件总线地址JB              F0,  SENDRETURNACALL           START                     ;发送IC总线重复起始条件MOV              A,    #0A0H              ;AT24C64总线地址SETB            ACC.0                    ;取总线读操作数ACALL           SENTBYTE                  ;发送被控制总线地址JB              F0,  RCVRETURN          ;出错返回ACALL           RCVBYTE                   ;接收数据RCVRETURN:RET;===============================START:SETB            SDA            ;发送起始条件的数据信号NOPSETB            SCL            ;发送起始条件的时钟信号NOPCLR             SDA            ;发送起始信号NOPCLR              SCL           ;准备发送或接收数据RET;===============================STOP:CLR        SDA                  ;发送停止条件的数据信号NOPSETB       SCL                  ;发送停止条件的时钟信号NOPSETB       SDA                  ;发送总线停止信号NOPRET ;==============================SENTBYTE:                         ;送数8位MOV         BITCNT,#08HSENTB:RLC        A                     ;要发送的数据左移,发送入位CMOV        SDA,      CSETB       SCL                     ;置时钟线为高,通知被控制开始接收数据位CLR        SCL                     ;准备接收下一个数据位DJNZ       BITCNT,SENTB            ;8位没发送完继续发送SETB       SDA                     ;8位发送完后释放数据线准备收应答位SETB       SCL                     ;开始接收应答信号CLR        F0                      ;预先清发送数据出错标志JNB        SDA,      ACKEND        ;判断是否接收应答信号正常转ACKENDSETB       F0                      ;未收到应答置位错误标志ACKEND:CLR        SCL                     ;发送结束准备下次发送或接收数据RET;==============================RCVBYTE:SETB        SDA                     ;置数据线为输入方式MOV         BITCNT,#08H             ;传送的数据长度为8位RCV:CLR         SCL                     ;置时钟线为低,准备接收数据SETB        SCL                     ;置时钟线为高使数据线上数据有效MOV         C,    SDARLC        A                       ;接收的数据位放入ACCDJNZ        BITCNT,RCV              ;8位没收完继续接收CLR        SCL                     ;8位接收完置时钟线和数据线CLR        SDASETB        SDA                     ;接收非应答信号SETB        SCL                     ;置时钟线为高使应答位有效SETB        SDACLR        SCL                     ;清时钟线以便发送停止条件RET;============================;显示、键盘子程序;===========================END

更多简介内容

评论

下载专区


TI最新应用解决方案

工业电子 汽车电子 个人电子
$(function(){ var appid = $(".select li a").data("channel"); $(".select li a").click(function(){ var appid = $(this).data("channel"); $('.select dt').html($(this).html()); $('#channel').val(appid); }) })