📄 24c02.c
字号:
#if 1
#include "i2c.h"
/*****************************************************************************
** 函数名称: IIC_Delay
** 功能描述: I2C时序延时
** 全局变量: 无
** 调用模块: 无
** 输入: t:延时量
** 输出: 无
******************************************************************************/
void IIC_Delay(unsigned char t)
{
while(t--);
}
/*****************************************************************************
** 函数名称: I2C_Start
** 功能描述: 启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变
** 全局变量: DELAY_TIME
** 调用模块: IIC_Delay()
** 输入: 无
** 输出: 无
******************************************************************************/
void I2C_Start(void)
{
SDA=1;
SCL=1;
IIC_Delay(DELAY_TIME);
SDA=0;
IIC_Delay(DELAY_TIME);
SCL=0;
IIC_Delay(DELAY_TIME);
}
/*****************************************************************************
** 函数名称: I2C_Stop
** 功能描述: 终止I2C总线,当SCL为高电平时使SDA产生一个正跳变
** 全局变量: DELAY_TIME
** 调用模块: IIC_Delay()
** 输入: 无
** 输出: 无
******************************************************************************/
void I2C_Stop(void)
{
SDA=0;
IIC_Delay(DELAY_TIME);
SCL=1;
IIC_Delay(DELAY_TIME);
SDA=1;
IIC_Delay(DELAY_TIME);
}
/*****************************************************************************
** 函数名称: SEND_0
** 功能描述: 发送0(或应答信号),在SCL为高电平时使SDA信号为低
** 全局变量: DELAY_TIME
** 调用模块: IIC_Delay()
** 输入: 无
** 输出: 无
******************************************************************************/
void SEND_0(void)
{
SDA=0;
IIC_Delay(DELAY_TIME);
SCL=1;
IIC_Delay(DELAY_TIME);
SCL=0;
IIC_Delay(DELAY_TIME);
}
/*****************************************************************************
** 函数名称: SEND_1
** 功能描述: 发送1,在SCL为高电平时使SDA信号为高
** 全局变量: DELAY_TIME
** 调用模块: IIC_Delay()
** 输入: 无
** 输出: 无
******************************************************************************/
void SEND_1(void)
{
SDA=1;
IIC_Delay(DELAY_TIME);
SCL=1;
IIC_Delay(DELAY_TIME);
SCL=0;
IIC_Delay(DELAY_TIME);
}
/*****************************************************************************
** 函数名称: Check_Acknowledge
** 功能描述: 发送完一个字节后检验设备的应答信号
** 全局变量: DELAY_TIME
** 调用模块: IIC_Delay()
** 输入: 无
** 输出: bit-当有应答信号时返回1,否则返回0。
******************************************************************************/
bit Check_Acknowledge(void)
{
bit F0;
unsigned char Error_time=255; //因故障接收方无ACK,超时值为255
SDA=1;
IIC_Delay(DELAY_TIME);
SCL=1;
IIC_Delay(DELAY_TIME);
F0=SDA;
while(F0)
{
IIC_Delay(8);
F0 = SDA;
if(--Error_time == 0)
return FALSE; //超时无应答,返回
}
IIC_Delay(DELAY_TIME);
SCL=0;
IIC_Delay(DELAY_TIME);
if(F0==1)
return FALSE;
return TRUE;
}
/*****************************************************************************
** 函数名称: Send_UnAcknowledge
** 功能描述: 主控器发送停止信号前发送的非应答信号
** 全局变量: DELAY_TIME
** 调用模块: IIC_Delay()
** 输入: 无
** 输出: 无
******************************************************************************/
void Send_UnAcknowledge(void)
{
SDA=1;
IIC_Delay(DELAY_TIME);
SCL=1;
IIC_Delay(DELAY_TIME);
SCL=0;
IIC_Delay(DELAY_TIME);
}
/*****************************************************************************
** 函数名称: WriteI2CByte
** 功能描述: 向I2C总线写一个字节
** 全局变量: DELAY_TIME,SEND_1(),SEND_0(),
** 调用模块: IIC_Delay()
** 输入: b:要发送的数据
** 输出: 无
******************************************************************************/
void WriteI2CByte(unsigned char Byte)//reentrant
{
unsigned char i;
for(i=0;i<8;i++)
{
if((Byte << i) & 0x80)
SEND_1();
else
SEND_0();
}
}
/*****************************************************************************
** 函数名称: ReadI2CByte
** 功能描述: 从I2C总线读一个字节
** 全局变量: DELAY_TIME
** 调用模块: IIC_Delay()
** 输入: 无
** 输出: char-从I2C总线读出的数据.
******************************************************************************/
unsigned char ReadI2CByte(void)//reentrant
{
bit F0;
unsigned char Byte=0,i;
for(i=0; i<8; i++)
{
SDA=1; /*释放总线*/
IIC_Delay(DELAY_TIME);
SCL=0; //置时钟线为低,准备接收数据
IIC_Delay(DELAY_TIME);
SCL=1; /*接受数据*/
IIC_Delay(DELAY_TIME);
F0=SDA;
IIC_Delay(DELAY_TIME);
SCL=0;
if(F0 == 1)
{
Byte <<= 1;
Byte |= 0x01;
}
else
Byte <<= 1;
}
return Byte;
}
/*****************以下为读写24c04的函数**************************************/
/*****************************************************************************
** 函数名称: Write_One_Byte
** 功能描述: write a byte to memory
** 全局变量: 无
** 调用模块: IIC_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();
IIC_Delay(8);
return(TRUE);
}
/*****************************************************************************
** 函数名称: Write_A_Page
** 功能描述: write a page to AT24c04
** 全局变量: 无
** 调用模块: IIC_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<Page_Word;i++)
{
WriteI2CByte(*buffer);
buffer++;
if(!Check_Acknowledge())
{
I2C_Stop();
return(FALSE);
}
}
I2C_Stop();
for(i=0;i<10;i++)
{
IIC_Delay(200); //IIC_Delay 10mS
}
return(TRUE);
}
/*****************************************************************************
** 函数名称: Read_One_Byte
** 功能描述: read a byte from memory
** 全局变量: 无
** 调用模块: IIC_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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -