📄 24cq512.c
字号:
//--------------------------- AT24C512.c ------------------------------//
// AT24C512 PIC18F6720
// SCL <-------------> E2_CLK RC3/CLK 34
// SDA <------------->E2_SDA_IN/_OUT RC4/SDA 35
// WP <------------->E2_WP RC2/CCP1 33
// A0 <-----|GND
// A1 <-----|GND
// A2 <-----|GND
//---------------------------------------------------------------------//
#include "PIC18F6720_IO.h"
#include "PIC18F6720_PERIPHERYDEVICE.h"
#include "delays.h" //soft delay Head Flie
//Delay1TCY(); delay one TCY
//Delay10TCYx(uchar t); (255~0)*10TCY
//.....100........
//.....1K.........
//.....10K........
//if uchar t = 0 that delay time = 2560000tCY
//I/O define for PIC18F6720
#define E2PROM_SCLL LATCbits.LATC3 = 0
#define E2PROM_SCLH LATCbits.LATC3 = 1
#define E2PROM_SDAL LATCbits.LATC4 = 0
#define E2PROM_SDAH LATCbits.LATC4 = 1
#define E2PROM_SDA_SETIN DDRCbits.RC4 = 1
#define E2PROM_SDA_SETOUT DDRCbits.RC4 = 0
#define E2PROM_SDA_IN PORTCbits.RC4
#define E2PROM_ENW LATCbits.LATC2 = 0
#define E2PROM_ENR LATCbits.LATC2 = 1
#define dly6uS Delay10TCYx(2)
#define dly10ms Delay10KTCYx(4)
const unsigned char E2PROM_CTLBYTE_W1 = 0xa0; //A2= A1= A0= 0
const unsigned char E2PROM_CTLBYTE_R1 = 0xa1;
const unsigned char E2PROM_CTLBYTE_W2 = 0xa2; //A2= A1 = 0 ,A0= 1
const unsigned char E2PROM_CTLBYTE_R2 = 0xa3;
//////////////////////////////////
////E2PROM START //
//// //
//// //
//// //
//////////////////////////////////
void E2PRON_START (void)
{
E2PROM_SDAH;
E2PROM_SCLH;
dly6uS;
E2PROM_SDAL;
dly6uS;
E2PROM_SCLL;
}
//////////////////////////////////
////E2PROM STOP //
//// //
//// //
//// //
//////////////////////////////////
void E2PROM_STOP (void)
{
E2PROM_SDAL;
dly6uS;
E2PROM_SCLH;
dly6uS;
E2PROM_SDAH;
dly6uS;
E2PROM_SCLL;
}
//////////////////////////////////////////
//// MCU RECEIVE E2PROM ACK //
//// MCU_R_ACK==0X00 ON ACK :ERROR //
//// MCU_R_ACK==0X01 RECEIVE ACK :OK //
//// //
//////////////////////////////////////////
unsigned char MCU_R_ACK (void)
{
E2PROM_SCLL;
dly6uS;
E2PROM_SDA_SETIN; //SET P1.0 INPUT FOR SDA
dly6uS;
E2PROM_SCLH;
dly6uS;
if(E2PROM_SDA_IN)
{
E2PROM_SCLL;
E2PROM_SDA_SETOUT; //SET P1.0 OUTPUT
dly6uS;
return 0X00;
}
else
{
E2PROM_SCLL;
E2PROM_SDA_SETOUT; //SET P1.0 OUTPUT
dly6uS;
return 0X01;
}
}
////////////////////////////////////////
////MCU SEND ACK TO E2PROM //
//// //
//// //
//// //
////////////////////////////////////////
void MCU_T_ACK (void)
{
E2PROM_SCLL;
E2PROM_SDAL;
dly6uS;
E2PROM_SCLH;
dly6uS;
E2PROM_SCLL;
}
////////////////////////////////////////
////MCU SEND NOACK TO E2PROM //
//// //
//// //
//// //
////////////////////////////////////////
void MCU_T_NOACK (void)
{
E2PROM_SDAH;
dly6uS;
E2PROM_SCLH;
dly6uS;
E2PROM_SCLL;
dly6uS;
}
////////////////////////////////////////
////MCU SEND 8BIT(BYTE) DATA TO E2PROM//
//// //
//// //
//// //
////////////////////////////////////////
void MCU_T_1BYTE (unsigned char tempiii)
{
unsigned char iMTB;
// E2PROM_ENW;
dly6uS;
for(iMTB=8;iMTB>0;iMTB--)
{
E2PROM_SCLL;
if(tempiii&0X80)
{
E2PROM_SDAH;
dly6uS;
}
else
{
E2PROM_SDAL;
dly6uS;
}
tempiii=tempiii<<1;
E2PROM_SCLH;
dly6uS;
}
E2PROM_SCLL;
// E2PROM_ENR;
}
/////////////////////////////////////////////
////MCU RECEIVE 8BIT(BYTE) DATA FROM E2PROM
////
////
////
/////////////////////////////////////////////
unsigned char MCU_R_1BYTE (void)
{
unsigned char temp1MRB,iii1;
E2PROM_SCLL;
E2PROM_SDA_SETIN; //SET P1.0 INPUT FOR SDA
for(iii1=8;iii1>0;iii1--)
{
temp1MRB = (temp1MRB<<1);
dly6uS;
E2PROM_SCLH;
dly6uS;
if(E2PROM_SDA_IN)
temp1MRB += 0x01;
dly6uS;
E2PROM_SCLL;
dly6uS;
}
E2PROM_SDA_SETOUT; //SET P1.0 IS OUTPUT FOR SDA
return temp1MRB;
}
////////////////////////////////////////////////////////////////////
//// MCU WRITE ONE BYTE DATA TO ONE ADDRESS IN THE E2PROM //
//// //
//// //
//// //
////////////////////////////////////////////////////////////////////
void WRITE_E2PROM(unsigned char *mcu_ramadd,unsigned int e2promadd,unsigned char nwe,unsigned char chipn)//n<=16
{
unsigned char e2promaddl,e2promaddh;
// DSGIE;
E2PROM_ENW;
e2promaddl = e2promadd & 0x00ff;//low addr
e2promaddh = (e2promadd & 0xff00)>>8;
E2PRON_START();
if(chipn == 0)
MCU_T_1BYTE(E2PROM_CTLBYTE_W1);
if(chipn ==1)
MCU_T_1BYTE(E2PROM_CTLBYTE_W2);
MCU_R_ACK();
MCU_T_1BYTE(e2promaddh);
MCU_R_ACK();
MCU_T_1BYTE(e2promaddl);
MCU_R_ACK();
while(nwe>0)
{
MCU_T_1BYTE(*mcu_ramadd);
MCU_R_ACK();
mcu_ramadd++;
nwe--;
}
E2PROM_STOP();
E2PROM_ENR;
dly10ms;
E2PROM_SCLH;////////////////////////////////////////////////////////////////////////////
// ENGIE;
}
////////////////////////////////////////////////////////////
////E2PROM READ n BYTES DATA FROM ONE ADDRESS
////
////
////
////////////////////////////////////////////////////////////
void READ_E2PROM(unsigned char *mcu_ramadd,unsigned int e2promadd,unsigned char nre,unsigned char chipn)
{
unsigned char e2promaddl,e2promaddh;
// DSGIE;
e2promaddl = e2promadd & 0x00ff;
e2promaddh = (e2promadd & 0xff00)>>8;
E2PRON_START();
if(chipn == 0)
MCU_T_1BYTE(E2PROM_CTLBYTE_W1);
if(chipn ==1)
MCU_T_1BYTE(E2PROM_CTLBYTE_W2);
MCU_R_ACK();
MCU_T_1BYTE(e2promaddh);
MCU_R_ACK();
MCU_T_1BYTE(e2promaddl);
MCU_R_ACK();
E2PRON_START();
if(chipn == 0)
MCU_T_1BYTE(E2PROM_CTLBYTE_R1);
if(chipn ==1)
MCU_T_1BYTE(E2PROM_CTLBYTE_R2);
MCU_R_ACK();
while(nre>1)
{
*mcu_ramadd = MCU_R_1BYTE();
mcu_ramadd = mcu_ramadd+1;
MCU_T_ACK();
nre--;
}
*mcu_ramadd = MCU_R_1BYTE();
MCU_T_NOACK();
E2PROM_STOP();
E2PROM_SCLH;////////////////////////////////////////////////////////////////////////////
// ENGIE;
}
//////////////////////////////////////////////////////////////////////////////////////////
//
//
//
//////////////////////////////////////////////////////////////////////////////////////////
void WRITE_1_BYTE_E2PROM (unsigned char *mcu_ramadd,unsigned int e2promadd,unsigned char chipn)//singend byte write *n
{
unsigned char e2promaddl,e2promaddh;
// DSGIE;
e2promaddl = e2promadd & 0x00ff;
e2promaddh = (e2promadd & 0xff00)>>8;
E2PROM_ENW; //WRITE ENABLE
E2PRON_START();
if(chipn == 0)
MCU_T_1BYTE(E2PROM_CTLBYTE_W1);
if(chipn ==1)
MCU_T_1BYTE(E2PROM_CTLBYTE_W2);
MCU_R_ACK();
MCU_T_1BYTE(e2promaddh);
MCU_R_ACK();
MCU_T_1BYTE(e2promaddl);
MCU_R_ACK();
MCU_T_1BYTE(*mcu_ramadd);
MCU_R_ACK();
E2PROM_STOP();
dly10ms;
E2PROM_ENR; //WRITE DISABLE
E2PROM_SCLH;////////////////////////////////////////////////////////////////////////////
// ENGIE;
}
////////////////////////////////////////////////////////////
////E2PROM READ 1 BYTES DATA FROM ONE ADDRESS
////
////
////
////////////////////////////////////////////////////////////
void READ_1_BYTE_E2PROM(unsigned char *mcu_ramadd,unsigned int e2promadd,unsigned char chipn)
{
unsigned char e2promaddl,e2promaddh;
// DSGIE;
e2promaddl = e2promadd & 0x00ff;
e2promaddh = (e2promadd & 0xff00)>>8;
E2PRON_START();
MCU_T_1BYTE(E2PROM_CTLBYTE_W1);
MCU_R_ACK();
MCU_T_1BYTE(e2promaddh);
MCU_R_ACK();
MCU_T_1BYTE(e2promaddl);
MCU_R_ACK();
E2PRON_START();
if(chipn == 0)
MCU_T_1BYTE(E2PROM_CTLBYTE_R1);
if(chipn ==1)
MCU_T_1BYTE(E2PROM_CTLBYTE_R2);
MCU_R_ACK();
*mcu_ramadd = MCU_R_1BYTE();
MCU_T_NOACK();
E2PROM_STOP();
E2PROM_SCLH;////////////////////////////////////////////////////////////////////////////
// ENGIE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -