#include "target.h"
#include "type.h"
#include "I2C.H"
/*#define I2C_PIN (FIO0PIN1|0x04)
#define I2C_CLR FIO0CLR
#define I2C_SET FIO0SET
#define I2CSDA (1<<10)
#define I2CSCL (1<<11)
#define I2CSDAL() I2C_CLR = I2CSDA
#define I2CSDAH() I2C_SET = I2CSDA
#define I2CSCLL() I2C_CLR = I2CSCL
#define I2CSCLH() I2C_SET = I2CSCL*/
/*
**fuction used to delay n μseconds for some number n
*/
void InitI2C()
{
GPIOInit( 0, FAST_PORT, DIR_OUT, I2CSDA|I2CSCL);
}
void Delay(int n)
{
for(int i=0;i<n;i++)
{
for(int j = 0;j<20;j++)
;
}
}
/*
** Start I2C
*/
void Start_I2C()
{
I2CSCLL();
I2CSDAH();
// Delay(10);
I2CSCLH();
Delay(10);
I2CSDAL();
Delay(10);
I2CSCLL();
I2CSDAH();
}
/*
**stop I2C
*/
void Stop_I2C()
{
I2CSCLL();
I2CSDAL();
// Delay(5);
I2CSCLH();
Delay(10);
I2CSDAH();
Delay(10);
I2CSCLL();
}
/*
**Function name:SendByte
**Function:Send a byte
**Return:void
*/
void SendByte_I2C(unsigned char data)
{
unsigned char i;
for(i=0; i<8; i++)
{
I2CSCLL();
if((data<<i)&0x80)
I2CSDAH();
else
I2CSDAL();
I2CSCLH();
Delay(5);
}
// I2CSCLL();
// I2CSCLH();
// Delay(5);
}
/*
**Function Name:ReceiveByte
**Function: receive a byte
*/
unsigned char RecieveByte()
{
// GPIOInit( 0, FAST_PORT, DIR_IN, I2CSDA);
char i = 0;
unsigned char data=0;
for(i=0;i<8;i++)
{
I2CSCLH();
data<<=1;
if(I2C_PIN)
data++;
I2CSCLL();
Delay(5);
}
// GPIOInit( 0, FAST_PORT, DIR_OUT, I2CSDA);
return data;
}
/*
**Function Name:Ack
**Function:Acknowledge the signal to show the success
*/
void Ack()
{
I2CSDAL();
//Delay(5);
I2CSCLL();
Delay(5);
I2CSCLH();
Delay(5);
I2CSCLL();
I2CSDAH();
}
/*
**Function Name:NoAck
**Function:Acknowlege signal to show the failure
*/
void NoAck()
{
I2CSDAH();
// Delay(5);
I2CSCLH();
Delay(10);
I2CSCLL();
I2CSDAL();
}
unsigned char RecAck(void)
{
unsigned char CY;
I2CSCLL();//在scl为0的时候改变sda的值
I2CSDAH();
I2CSCLH();//在scl为1的时候等待sda值的变化,在器件接受到数据后会把sda拉低
Delay(10);
// if(I2C_PIN)
CY =I2C_PIN ; //因为返回值总是放在CY中的
// else CY = 0;
// I2CSCLL();
Delay(10);
return(CY);
}
/*unsigned char EEpromWR(unsigned char* buff,unsigned char count,unsigned char ctrbyte, unsigned char addr)
{
char err_flag = 1;
char err_count=10;//the time of restart
unsigned char j = count;
while(err_count--)
{
Start_I2C();
SendByte_I2C(ctrbyte&0xfe);
if(RecAck())
continue;
SendByte_I2C(addr);
if(!(ctrbyte&0x01))
{
err_flag = 0;
j = count;
while(j--)
{
SendByte_I2C(*buff++);
if(!RecAck())
continue;
err_flag = 1;
break;
}
if(err_flag == 1)
continue;
break;
}
else
{
Start_I2C();
SendByte_I2C(ctrbyte);
if(RecAck())
continue;
j = count;
while(j--)
{
*buff++ = RecieveByte();
Ack();
}
*buff=RecieveByte();
NoAck();
err_flag = 0;
break;
}
}
Stop_I2C();
if(!(ctrbyte&0x01))
{
Delay(20);
}
return err_flag;
}*/