📄 seeprom.c
字号:
#include "seeprom.h"
/**************************************************************************/
/* SEEPROM(24C64) Byte Read & Write Functions Definition */
/**************************************************************************/
unsigned char addhi, addlo, addlo2, rwdata, a, c, rddata;
void seeprom_nop(void)
{
unsigned int i;
for(i =0;i<0x1000;i++);
}
void seeprom_write(void)
{
seeprom_start();
a = addhi;
a = a << 1;
a = a | 0xA0;
a = a & 0xAF;
seeprom_sendb();
seeprom_ack();
a = addlo;
seeprom_sendb();
seeprom_ack();
a = addlo2;
seeprom_sendb();
seeprom_ack();
a = rwdata;
seeprom_sendb();
seeprom_ack();
seeprom_stop();
}
void seeprom_poll(void)
{
do{
seeprom_start();
a = 0xa0;
seeprom_sendb();
seeprom_ack();
}while(c);
seeprom_stop();
}
void seeprom_read(void)
{
seeprom_start();
a = addhi;
a = a << 1;
a = a | 0xa0;
seeprom_sendb();
seeprom_ack();
a = addlo;
seeprom_sendb();
seeprom_ack();
a = addlo2;
seeprom_sendb();
seeprom_ack();
seeprom_start();
a = addhi;
a = a << 1;
a = a | 0xa1;
seeprom_sendb();
seeprom_ack();
seeprom_readb();
/* rddata = a;*/
SetSDA();
seeprom_clock();
seeprom_stop();
}
void seeprom_start(void)
{
SetSDA();
SetSCL();
seeprom_nop();
ResetSDA();
seeprom_nop();
seeprom_nop();
seeprom_nop();
ResetSCL();
seeprom_nop();
}
void seeprom_stop(void)
{
SetSCL();
seeprom_nop();
ResetSDA();
seeprom_nop();
SetSDA();
seeprom_nop();
}
void seeprom_clock(void)
{
seeprom_nop();
SetSCL();
seeprom_nop();
/* c = ACK();
seeprom_nop(); */
ResetSCL();
}
void seeprom_ack(void)
{
unsigned int save, i;
unsigned int *pbdir = (unsigned int *)REG_PBDIR;
unsigned int *pbdat = (unsigned int *)REG_PBDAT;
seeprom_nop();
save = *pbdir;
*pbdir &= ~0x10;
SetSCL();
seeprom_nop();
c = (*pbdat & B_SDA);
for(i=0;i<0x100;i++){
c = (*pbdat & B_SDA);
if(c== 0)
break;
}
seeprom_nop();
seeprom_nop();
seeprom_nop();
seeprom_nop();
ResetSCL();
*pbdir |=0x10;
}
void seeprom_sendb(void)
{
int i;
unsigned char tdata;
tdata = a;
for(i=0;i<8;i++)
{
if(tdata & 0x80)
SetSDA();
else
ResetSDA();
seeprom_clock();
tdata = tdata << 1;
}
SetSDA(); /* lisong */
}
void seeprom_readb(void)
{
unsigned int save, i, temp;
unsigned int *pbdir = (unsigned int *)REG_PBDIR;
unsigned int *pbdat = (unsigned int *)REG_PBDAT;
seeprom_nop();
save = *pbdir;
*pbdir &= ~0x10;
a = 0;
for(i=0;i<8;i++)
{
seeprom_nop();
SetSCL();
// printf(" pbdat is %x\n", *pbdat & 0x10);
if(*pbdat & 0x10)
a = (a<<1) + 1;
else
a = a<<1;
seeprom_nop();
ResetSCL();
}
rddata = a;
*pbdir |=0x10;
}
/* add : 0..2047 */
void seeprom_writeToEEPROM(unsigned long add, unsigned char d)
{
addhi = (unsigned char)(add >> 16);
addlo = (unsigned char)((add >> 8) & 0x000000ff);
addlo2 = (unsigned char)(add & 0x000000ff);
rwdata = d;
seeprom_write();
}
/* add : 0..2047 */
unsigned char seeprom_readFromEEPROM(unsigned long add)
{
addhi = (unsigned char)(add >> 16);
addlo = (unsigned char)((add >> 8) & 0x000000ff);
addlo2 = (unsigned char)(add & 0x000000ff);
seeprom_read();
return rddata;
}
int initI2C()
{
volatile unsigned short *cpcr = (unsigned short *)REG_CPCR;
volatile unsigned int *pbdir = (unsigned int * )REG_PBDIR;
volatile unsigned int *pbdat = (unsigned int * )REG_PBDAT;
volatile unsigned int *pbpar = (unsigned int * )REG_PBPAR;
volatile unsigned int *pbodr = (unsigned int *)REG_PBODR;
*pbpar &= ~0x30;
*pbdir |= 0x30;
*pbodr |= 0x30;
*pbdat |= 0x30;
// printf(" address of pbpar %x, pbdat %x, pbdir %x", pbpar, pbdat, pbdir);
// printf(" value of pbpar %x, pbdat %x, pbdir %x", *pbpar, *pbdat, *pbdir);
*cpcr = (CP_FLG | CP_I2C);
while(*cpcr & CP_FLG);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -