原创 IIC接口程序参考

2007-8-21 18:53 3040 2 2 分类: 通信
/*****************************************************************************

** 函数名称: DELAY

** 功能描述: I2C时序延时

** 全局变量: 无

** 调用模块: 无

** 输入: t:延时量

** 输出: 无

******************************************************************************/

void DELAY(unsigned char t)
{
  while(t!=0)
      t--;
}

/*****************************************************************************

** 函数名称: I2C_Start

** 功能描述: 启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变

** 全局变量: DELAY_TIME

** 调用模块: DELAY()

** 输入: 无

** 输出: 无

******************************************************************************/

void I2C_Start(void)
{
   SDA="1";
  SCL="1";
  DELAY(DELAY_TIME);
  SDA="0";
  DELAY(DELAY_TIME);
  SCL="0";
  DELAY(DELAY_TIME);
}

/*****************************************************************************

** 函数名称: I2C_Stop

** 功能描述: 终止I2C总线,当SCL为高电平时使SDA产生一个正跳变

** 全局变量: DELAY_TIME

** 调用模块: DELAY()

** 输入: 无

** 输出: 无

******************************************************************************/

void I2C_Stop(void)
{
  SDA="0";
  DELAY(DELAY_TIME);
  SCL="1";
  DELAY(DELAY_TIME);
  SDA="1";
  DELAY(DELAY_TIME);

}

/*****************************************************************************

** 函数名称: SEND_0

** 功能描述: 发送0(或应答信号),在SCL为高电平时使SDA信号为低

** 全局变量: DELAY_TIME

** 调用模块: DELAY()

** 输入: 无

** 输出: 无

******************************************************************************/

void SEND_0(void)
{
  SDA="0";
  DELAY(DELAY_TIME);
  SCL="1";
  DELAY(DELAY_TIME);
  SCL="0";
  DELAY(DELAY_TIME);
}

/*****************************************************************************

** 函数名称: SEND_1

** 功能描述: 发送1,在SCL为高电平时使SDA信号为高

** 全局变量: DELAY_TIME

** 调用模块: DELAY()

** 输入: 无

** 输出: 无

******************************************************************************/

void SEND_1(void)
{
  SDA="1";
  DELAY(DELAY_TIME);
  SCL="1";
  DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}

/*****************************************************************************

** 函数名称: Check_Acknowledge

** 功能描述: 发送完一个字节后检验设备的应答信号

** 全局变量: DELAY_TIME

** 调用模块: DELAY()

** 输入: 无

** 输出: bit-当有应答信号时返回1,否则返回0。

******************************************************************************/

bit Check_Acknowledge(void)
{
bit F0;
unsigned char Error_time=255; //因故障接收方无ACK,超时值为255
SDA=1;
DELAY(DELAY_TIME);
SCL=1;
DELAY(DELAY_TIME);
F0=SDA;
while(F0)
{
F0=SDA;
if(--Error_time==0)
return FALSE; //超时无应答,返回
}
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
if(F0==1)
return FALSE;
return TRUE;
}

/*****************************************************************************

** 函数名称: Send_UnAcknowledge

** 功能描述: 主控器发送停止信号前发送的非应答信号

** 全局变量: DELAY_TIME

** 调用模块: DELAY()

** 输入: 无

** 输出: 无

******************************************************************************/

void Send_UnAcknowledge(void)
{
SDA=1;
DELAY(DELAY_TIME);
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}

/*****************************************************************************

** 函数名称: WriteI2CByte

** 功能描述: 向I2C总线写一个字节

** 全局变量: DELAY_TIME,SEND_1(),SEND_0(),

** 调用模块: DELAY()

** 输入: b:要发送的数据 

** 输出: 无

******************************************************************************/

void WriteI2CByte(unsigned char Byte)//reentrant
{
unsigned char i;
for(i=0;i<8;i++)
{ if((Byte<SEND_1();
else
SEND_0();
}
}

/*****************************************************************************

** 函数名称: ReadI2CByte

** 功能描述: 从I2C总线读一个字节

** 全局变量: DELAY_TIME

** 调用模块: DELAY()

** 输入: 无

** 输出: char-从I2C总线读出的数据.

******************************************************************************/

unsigned char ReadI2CByte(void)//reentrant
{
bit F0;
unsigned char Byte="0",i;
for(i=0;i<8;i++)
{
SDA=1; /*释放总线*/
DELAY(DELAY_TIME);
SCL=0; //置时钟线为低,准备接收数据
DELAY(DELAY_TIME);
SCL=1; /*接受数据*/
DELAY(DELAY_TIME);
F0=SDA;
DELAY(DELAY_TIME);
SCL=0;
if(F0==1)
{
Byte=Byte<<1;
Byte=Byte|0x01;
}
else
Byte=Byte<<1;
}
return Byte;
}

/*****************以下为读写24c**的函数**************************************/

/*****************************************************************************

** 函数名称: Write_One_Byte

** 功能描述: write a byte to memory

** 全局变量: 无

** 调用模块: DELAY(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
Check_Acknowledge()

** 输入: addr:写入地址,thedata:要写入的数据

** 输出: bit-当写入正确时反回1,否则返回0。

******************************************************************************/

bit Write_One_Byte(unsigned char addr,unsigned char thedata)
{
bit acktemp="1";
I2C_Start();
WriteI2CByte(SLAW); /*write the SLAW*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
WriteI2CByte(addr); /*write memory address*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
WriteI2CByte(thedata); /*the data*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
I2C_Stop();
DELAY(8);
return(TRUE);
}

/*****************************************************************************

** 函数名称: Write_A_Page

** 功能描述: write a page to AT24c04

** 全局变量: 无

** 调用模块: DELAY(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
Check_Acknowledge()

** 输入: *buffer:写入数据缓冲首地址,addr:写入页首地址

** 输出: bit-当写入正确时反回1,否则返回0。

******************************************************************************/

bit Write_A_Page(unsigned char *buffer,unsigned char addr)
{
bit acktemp="1";
unsigned char i;
I2C_Start();
WriteI2CByte(SLAW); /*write the SLAW*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
WriteI2CByte(addr); /*write memory address*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
for(i=0;i{
WriteI2CByte(*buffer);
buffer++;
if(!Check_Acknowledge())
{
I2C_Stop();
return(FALSE);
}
}

I2C_Stop();
for(i=0;i<10;i++)
{
DELAY(200); //delay 10mS
}
return(TRUE);

}

/*****************************************************************************

** 函数名称: Read_One_Byte

** 功能描述: read a byte from memory

** 全局变量: 无

** 调用模块: DELAY(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
Check_Acknowledge(),Send_UnAcknowledge()

** 输入: addr:读入地址

** 输出: char-当读出正确时反回读出值,否则返回0xff。

******************************************************************************/

unsigned char Read_One_Byte(unsigned char addr)
{
bit acktemp="1";
unsigned char mydata;
I2C_Start();
WriteI2CByte(SLAW); /*write the SLAW*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(0xff);
}
WriteI2CByte(addr); /*write memory address*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(0xff);
}
I2C_Start();
WriteI2CByte(SLAR); /*write the SLAR*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(0xff);
}
mydata=ReadI2CByte();
Send_UnAcknowledge();
I2C_Stop();
return mydata;
}

/*****************************************************************************

** 函数名称: Read_N_Bytes

** 功能描述: read N bytes from memory N<16

** 全局变量: 无

** 调用模块: DELAY(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
Check_Acknowledge(),Send_UnAcknowledge()

** 输入: *buffer:读出的数据存放缓冲首地址,n:读出数据个数,addr:读出首地址

** 输出: bit-当写入正确时反回1,否则返回0。

******************************************************************************/

bit Read_N_Bytes(unsigned char *buffer,unsigned char n,unsigned char addr)
{
bit acktemp="1";
unsigned char i="0";
I2C_Start();
WriteI2CByte(SLAW); /*write the SLAW*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
WriteI2CByte(addr); /*write memory address*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
I2C_Start();
WriteI2CByte(SLAR); /*write the SLAR*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
for(i=0;i{
*buffer=ReadI2CByte();
buffer++;
if(i!=n-1)
SEND_0(); /*发送应答*/
else
Send_UnAcknowledge(); /*发送非应答*/
}
I2C_Stop();
return(TRUE);
}

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /2 下一条