原创
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条评论)
登录后参与讨论