Start(void);
void Stop(void);
u8 CurrentRead(void);
u8 RandomRead(u8 addr);
void ByteWrite(u8 addr,u8 data);
void SendByte(u8 data);
void I2c_Ack(void);
void I2c_NoAck(void);
u8 I2c_CheckAck(void);
u8 ReadByte(void);
void CommandWrite(u8 addr);
void PageWrite(u8 *data,u8 cnt,u8 BeginAddr);
void SequentialRead(u8 *data,u8 cnt,u8 BeginAddr);
#define SDA R60
#define SCL R61
u8 array[2];
////////////////////////////////////////////////////////////
// read Routine
u8 ReadByte(void)
{
u8 i;
u8 data;
P6CR |= 0x01; //change to input
for (i=0;i<8;i++)
{
data <<= 1;
if (SDA) data++;
nop();
SCL = 1;
nop();
nop();
SCL = 0;
}
P6CR &= 0Xfe; // change to output
return data;
}
u8 CurrentRead(void)
{
u8 data;
u8 ack;
Start();
SendByte(0xA1); // read command
ack = I2c_CheckAck();
data = ReadByte();
I2c_NoAck();
Stop();
return data;
}
u8 RandomRead(u8 addr)
{
u8 data;
CommandWrite(addr);
data = CurrentRead();
return data;
}
void SequentialRead(u8 *data,u8 cnt,u8 BeginAddr)
{
u8 i;
u8 ack;
CommandWrite(BeginAddr);
Start();
SendByte(0xA1); // read command
ack = I2c_CheckAck();
for (i=0;i<cnt;i++,data++)
{
*data = ReadByte();
I2c_Ack();
}
I2c_NoAck();
Stop();
}
////////////////////////////////////////////////////////////
// send Byte data via i2c
void CommandWrite(u8 addr)
{
u8 ack;
Start();
SendByte(0xA0);
ack = I2c_CheckAck();
nop();
SendByte(addr);
ack = I2c_CheckAck();
nop();
}
void ByteWrite(u8 addr,u8 data)
{
u8 ack;
CommandWrite(addr);
SendByte(data);
ack = I2c_CheckAck();
nop();
Stop();
}
void PageWrite(u8 *data,u8 cnt,u8 BeginAddr)
{
u8 i;
u8 ack;
CommandWrite(BeginAddr);
for (i=0;i<cnt;i++,data++)
{
SendByte((u8)*data);
ack = I2c_CheckAck();
}
Stop();
}
////////////////////////////////////////////////////////////
// send 8 bit data
void SendByte(u8 data)
{
u8 i;
for(i=0;i<8;i++)
{
if(data&0x80)
{
SDA = 1; // sda = 1
}else{
SDA = 0; // sda = 0
}
nop();
nop();
SCL = 1;
nop();
nop();
SCL = 0;
data <<= 1;
}
}
////////////////////////////////////////////////////////////
// acknowLEDge of i2c
void I2c_Ack(void)
{
SDA = 0;
nop();
SCL = 1;
nop();
nop();
SCL = 0;
}
void I2c_NoAck(void)
{
SDA = 1;
nop();
SCL = 1;
nop();
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页