#include "DSP28_Device.h"
#define SetSDA GpioDataRegs.GPBDAT.bit.GPIOB7 = 1
#define ClrSDA GpioDataRegs.GPBDAT.bit.GPIOB7 = 0
#define SetSCL GpioDataRegs.GPBDAT.bit.GPIOB6 = 1
#define ClrSCL GpioDataRegs.GPBDAT.bit.GPIOB6 = 0
#define SetCLK GpioDataRegs.GPBDAT.bit.GPIOB5 = 1
#define ClrCLK GpioDataRegs.GPBDAT.bit.GPIOB5 = 0
#define SetDAT GpioDataRegs.GPBDAT.bit.GPIOB2 = 1
#define ClrDAT GpioDataRegs.GPBDAT.bit.GPIOB2 = 0
#define SetCS GpioDataRegs.GPBDAT.bit.GPIOB1 = 1
#define ClrCS GpioDataRegs.GPBDAT.bit.GPIOB1 = 0
#define WriteDeviceAddress 0xa0
#define ReadDeviceAddress 0xa1
extern void Daoutput(unsigned int ch,unsigned int val);
extern void Epromtosram(void);
extern void Sramtoeprom(void);
extern void KickDog();
void delay(unsigned int number)
{
Uint16 j;
for(j = 0;j < number;j++);
}
void SDAIN(void)
{
EALLOW;
GpioMuxRegs.GPBDIR.bit.GPIOB1 = 0;
EDIS;
}
void SDAOUT(void)
{
EALLOW;
GpioMuxRegs.GPBDIR.bit.GPIOB1 = 1;
EDIS;
}
void IStart(void)
{
SDAOUT();
delay(250);
SetSDA;
SetSCL;
delay(75);
ClrSDA;
delay(25);
ClrSCL;
}
void IStop(void)
{
SDAOUT();
delay(250);
ClrSCL;
ClrSDA;
delay(75);
SetSCL;
delay(25);
SetSDA;
}
void IAck(void)
{
SDAOUT();
delay(250);
ClrSDA;
SetSCL;
delay(75);
ClrSCL;
delay(25);
SetSDA;
}
void INAck(void)
{
SDAOUT();
delay(250);
SetSDA;
SetSCL;
delay(75);
ClrSCL;
}
unsigned int TestAck(void)
{
unsigned int Temp;
SDAOUT();
delay(250);
SetSDA;
SetSCL;
delay(75);
SDAIN();
Temp = 0x0002 & GpioDataRegs.GPBDAT.all;
ClrSCL;
return Temp;
}
void WriteByte(unsigned int data)
{
unsigned int i;
unsigned int Temp = 0x8000;
data = data<<8;
SDAOUT();
delay(100);
for(i=8;i!=0;i--)
{
if (Temp & data) SetSDA;
else ClrSDA;
SetSCL;
delay(250);
ClrSCL;
data = data<<1;
delay(250);
}
}
unsigned int ReadByte(void)
{
unsigned int i,T;
unsigned int Temp = 0x0000;
SDAIN();
delay(100);
for (i=8;i!=0;i--)
{
SetSCL;
Temp = Temp<<1;
T = GpioDataRegs.GPBDAT.all;
T = T & 0x0002;
if (T) Temp = Temp | 1;
else Temp = Temp | 0;
delay(250);
ClrSCL;
delay(250);
}
return Temp;
}
unsigned int Write24c02(unsigned int *Wdata, unsigned int RomAddress, unsigned int number)
{
IStart();
WriteByte(WriteDeviceAddress);
if(TestAck()) return 1;
WriteByte(RomAddress);
if(TestAck()) return 1;
WriteByte(0);
if(TestAck()) return 1;
for(;number!=0;number--)
{
WriteByte(*Wdata);
if(TestAck()) return 1;
Wdata++;
}
IStop();
delay(20000);
return 0;
}
unsigned int Read24c02(unsigned int *RamAddr, unsigned int RomAddress, unsigned int number)
{
IStart();
WriteByte(WriteDeviceAddress);
if(TestAck()) return 1;
WriteByte(RomAddress);
if(TestAck()) return 1;
WriteByte(0);
if(TestAck()) return 1;
IStart();
WriteByte(ReadDeviceAddress);
if(TestAck()) return 1;
while(number!=1)
{
*RamAddr = ReadByte();
IAck();
RamAddr++;
number--;
}
*RamAddr = ReadByte();
INAck();
IStop();
return 0;
}
void Sramtoeprom(void)//24C256
{
if(Write24c02((unsigned int *)0x88000,0,64))
{
}
}
void Epromtosram(void)
{
if(Read24c02((unsigned int *)0x88000,0,64))
{
}
}
void Daoutput(unsigned int ch,unsigned int val)
{
unsigned int temp,index;
ClrCS;
delay(100);
temp=(((ch<<14)&0xC000)+0x3000+((val&0x3ff)<<2));
for(index=0;index<16;index++)
{
if((temp&0x8000)==0x8000)
{
SetDAT;
}
else
{
ClrDAT;
}
delay(50);
SetCLK;
delay(50);
ClrCLK;
temp=temp<<1;
}
SetCS;
delay(100);
}