#include "sfr_r811.h"
#define sda p3_3
#define sda_d pd3_3
#define scl p3_2
#define scl_d pd3_2
unsigned int ii=0x55;
typedef union
{
unsigned char all;
struct BFIELD
{
unsigned char read :1;
unsigned char write :1;
unsigned char receive :1;
unsigned char wrong :1;
unsigned char receiveack :1;
}bit;
}flag_union;
flag_union flag;
unsigned char receive_buf[512];
unsigned int iic_bit=0;
unsigned int number;
unsigned int nn;
unsigned int a;
unsigned int mm;
unsigned int add_1;
unsigned int add_2;
unsigned int z;
unsigned int N=16;
unsigned char *read;
unsigned int timer_1ms;
unsigned int timer_3ms;
unsigned int timer_ms;
void sendtoeeprom(unsigned char device,unsigned char add_1,unsigned char add_2,unsigned int N);
unsigned char receivefromeeprom(unsigned char device,unsigned char add_1,unsigned char add_2,unsigned char *prdata,unsigned int N);
unsigned char receivebyte();
void sendbyte();
void sfr_init();
void start();
void stop();
void sendack();
void init_iic();
void delay1 (unsigned int ms);
void delay (unsigned int us);
void iic_check();
void main()
{
unsigned int k;
asm("FCLR I");
sfr_init();
init_iic();
asm("FSET I");
number = 512 ; //write (numer) bytes
nn=number/16;
mm=number%16;
flag.bit.write=1;
add_1=0x00;
add_2=0x00;
iic_bit=1;
while(1)
{
if(timer_1ms == 1)
{
timer_1ms = 0;
p1_4 = ~ p1_4;
iic_check();
}
}
}
////////////////////////////////////////////////////////////////////////////////////
void iic_check()
{
unsigned int i,j;
switch(iic_bit)
{
case 0: if(timer_3ms>=4)
{
if(nn>0)
{
sendtoeeprom(0xa2,add_1,add_2,16); //write 16 bytes
if(flag.bit.write == 1)
{
nn--;
add_2=add_2+0x10;
if(add_2>=256)
{
add_2=0;
add_1++;
if(add_1>=2)
{
add_1=0;
add_2=0;
}
}
iic_bit=0;
}
else
{
ii = ii-16;
}
}
else
{
nn=number/16;
add_1=0x00;
add_2=0x00;
ii=0;
iic_bit=1;
}
timer_3ms=0;
}
break;
case 1: if(timer_3ms>=4)
{
iic_bit=2;
}
break;
case 2:
if(nn>0)
{
receivefromeeprom(0xa2,add_1,add_2,receive_buf,16); //read 16 bytes
if(flag.bit.read==1)
{
nn--;
add_2=add_2+0x10;
if(add_2>=256)
{
add_2=0;
add_1++;
if(add_1>=2)
{
add_1=0;
add_2=0;
}
}
iic_bit=1;
}
timer_3ms=0;
}
else
{
nn=number/16;
add_1=0x00;
add_2=0x00;
ii=0;
iic_bit=3;
z=0;
N=16;
}
break;
case 3:
for(i=0;i<256;i++)
{
a++;
if(receive_buf[i]!=i)
{
flag.bit.wrong=1;
break;
}
}
for(i=257;i<number;i++)
{
a++;
if(receive_buf[i]!=(i-256))
{
flag.bit.wrong=1;
break;
}
}
a=0;
// iic_bit=1;
break;
default:break;
}
}
/////////////////////////////////////////////////////////////////////////////////////
void init_iic()
{
sda_d = 0; // sda input H
scl_d = 0; // scl input H
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
void start() // send start signal
{
asm("FCLR I");
sda = 1;
sda_d = 1;
scl = 1;
scl_d = 1;
asm("nop");
asm("nop");
asm("nop");
sda = 0;
asm("nop");
asm("nop");
asm("nop");
scl = 0;
asm("FSET I");
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void stop() // send stop signal
{
asm("FCLR I");
sda = 0;
sda_d = 1;
scl = 1;
scl_d = 1;
asm("nop");
asm("nop");
asm("nop");
sda = 1;
asm("nop");
asm("nop");
asm("nop");
scl = 0;
asm("FSET I");
}
////////////////////////////////////////////////////////////////////////////////////////////////
void sendack() // send ack
{
sda = 0;
sda_d = 1;
asm("nop");
asm("nop");
asm("nop");
scl = 1;
scl_d = 1;
asm("nop");
asm("nop");
asm("nop");
scl = 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void sendnoack() // send noack
{
sda = 1;
sda_d = 1;
asm("nop");
asm("nop");
asm("nop");
scl = 1;
scl_d = 1;
asm("nop");
asm("nop");
asm("nop");
scl = 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void receiveack() // receive ack from eeprom
{
sda = 1;
sda_d = 0;
scl = 1;
scl_d = 1;
if(sda == 0)
{
flag.bit.receiveack = 1;
scl = 0;
}
else
{
scl = 0;
}
sda_d = 1;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char receivebyte() // receive 1 byte from eeprom
{
unsigned char i;
unsigned char receive_data = 0;
sda_d = 0;
for(i=0;i<8;i++)
{
receive_data <<= 1;
scl = 0;
scl_d = 1;
asm("nop");
asm("nop");
scl = 1;
asm("nop");
asm("nop");
receive_data = receive_data | sda;
}
scl = 0;
return receive_data;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
void sendbyte( unsigned char send_data) // send 1 byte to eeprom
{
unsigned char i;
sda_d = 1;
for(i=0;i<8;i++)
{
scl = 0;
scl_d = 1;
if((send_data & 0x80) > 0)
{
sda = 1;
}
else
{
sda = 0;
}
send_data <<= 1;
scl = 1;
}
scl = 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void sendtoeeprom(unsigned char device,unsigned char add_1,unsigned char add_2,unsigned int M)
{
unsigned int j;
start();
sendbyte(device);
receiveack();
if(flag.bit.receiveack == 1)
{
flag.bit.receiveack = 0;
sendbyte(add_1);
receiveack();
}
if(flag.bit.receiveack == 1)
{
flag.bit.receiveack = 0;
sendbyte(add_2);
receiveack();
}
if(flag.bit.receiveack == 1)
{
flag.bit.write = 0;
for(j = 0;j < M;j++)
{
// if(ii==100)
// {
// sendbyte(1);
// }
// else
// {
sendbyte(ii);
// }
receiveack();
if(flag.bit.receiveack==1)
{
flag.bit.receiveack=0;
ii=ii-4;
}
else
{
j--;
}
}
stop();
flag.bit.write = 1;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char receivefromeeprom(unsigned char device,unsigned char add_1,unsigned char add_2,unsigned char *prdata,unsigned int w)
{
unsigned int re,i;
flag.bit.read=0;
start(); // iic bus start
sendbyte(device);
receiveack();
if(flag.bit.receiveack == 1)
{
flag.bit.receiveack = 0;
sendbyte(add_1); // data address
receiveack();
}
if(flag.bit.receiveack == 1)
{
flag.bit.receiveack = 0;
sendbyte(add_2); // data address
receiveack();
}
if(flag.bit.receiveack == 1)
{
flag.bit.receiveack = 0;
start(); // send start
sendbyte(device+1);
receiveack();
}
if(flag.bit.receiveack == 1)
{
flag.bit.receiveack = 0;
for(;z < N;z++)
{
re = receivebyte();
receive_buf[z] = re;
if(z < (N - 1))
{
sendack(); // send ack
}
}
//z=z+16;
N=N+16;
flag.bit.read=1;
}
sendnoack(); // send noack
stop(); // send stop
}
/////////////////////////////////////////////////////////////////////////////////////////////
void delay (unsigned int us)
{
while(us--);
}
///////////////////////////////////////////////////////////////////
void delay1 (unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<1000;j++);
}
/*******************************************************************************
Name: sfr_init
Parameters: None
Returns: None
Description: Initial setting of sfr registers
********************************************************************************/
void sfr_init()
{
prc0 = 1; //protect off
//prcr addre