admin 管理员组

文章数量: 1087139


2024年1月17日发(作者:java技术体系的组成)

/*--------------------------------------------------------

**文 件: r24c02.h

**功 能: 驱动24c02的头文件

**描 述:

**作 者:

**日 期:

**编译环境: Keil uVision V4.01

**硬 件:

-----------------------------------------------------------*/

#ifndef drive_24c02_h_

#define drive_24c02_h_

/*-------------------------------------------------------*/

#define IIC_24C08_Add_P0 0xA0 //存储芯片 24C08 器件地址

#define IIC_24C08_Add_P1 0xA2

#define IIC_24C08_Add_P2 0xA4

#define IIC_24C08_Add_P3 0xA6

//extern void Store_Dat(unsigned char Add);

extern bit E2402_write(unsigned char sla,unsigned char suba,unsigned char

no);

extern bit E2402_read(unsigned char sla,unsigned char suba,unsigned char

no);

*s,unsigned char

*s,unsigned char

/*-------------------------------------------------------*/

#endif

/*--------------------------------------------------------

**文 件: r24c02.c

**功 能: 对24c02进行存取

**描 述:

**作 者:

**日 期:

**编译环境: Keil uVision V4.01

**硬 件:

-----------------------------------------------------------*/

#include "iic.h"

/*-------------------------------------------------------*/

//void Store_Dat(unsigned char Add);

/*-------------------------------------------------------

**函数名: Stroe_Dat(unsigned char *P)

**功 能: 将当前温度存到指定的地址

**描 述:

**传 入: unsigned char Add : 要写入的地址

**传 出:

--------------------------------------------------------*/

#if 0

void Store_Dat(unsigned char Add)

{

unsigned char i[8];

/*-------------------------------------------------------*/

i[0] = CurTime[Day];

i[1] = CurTime[Hour];

i[2] = CurTime[Min];

i[3] = CurTime[Sec];

i[4] = CurTmp>>8; //将当前温度高位写入存储器 温度正负号已经在里面了

//将当前温度低位写入存储器

//将当前时间写入存储器 BCD码

i[5] = CurTmp&0xFF;

i[6] = CurRh>>8; //将当前湿度高位写入存储器

//将当前湿度低位写入存储器 i[7] = CurRh&0xFF;

/*-------------------------------------------------------*/

GreenLedClose; //按键影响了

RedLedOpen; //存储指示灯

I2C_Puts( IIC_24C02_Add,Add,8, i);

ApplicationDelay(10000);

// SerialSend(i,8); //发到电脑

//将当前温度存到指定的地址*P

RedLedClose;

GreenLedOpen;

/*-------------------------------------------------------*/

}

#endif

//AT2402的功能函数

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

向有子地址器件发送多字节数据函数

函数原型: bit ISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);

功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件

地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。

如果返回1表示操作成功,否则操作有误。

注意: 使用前必须已结束总线。

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

bit E2402_write(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char

{

//unsigned char i;

return I2C_Puts(sla,suba,no,s);

#if 0

Start_I2c(); /*启动总线*/

no)

SendByte(sla); /*发送器件地址*/

if(ack==0)return(0);

SendByte(suba); /*发送器件子地址*/

if(ack==0)return(0);

for(i=0;i

{

SendByte(*s); /*发送数据*/

if(ack==0)return(0);

s++;

}

Stop_I2c(); /*结束总线*/

#endif

//return(1);

}

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

向有子地址器件读取多字节数据函数

函数原型: bit RecndStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);

功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件

地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。

如果返回1表示操作成功,否则操作有误。

注意: 使用前必须已结束总线。

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

bit E2402_read(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)

{

//unsigned char i;

return I2C_Gets(sla,suba,no,s);

#if 0

Start_I2c();

SendByte(sla);

if(ack==0)return(0);

SendByte(suba);

if(ack==0)return(0);

Start_I2c();

SendByte(sla+1);

if(ack==0)return(0);

for(i=0;i

{

*s=RcvByte();

Ack_I2c(0);

s++;

}

*s=RcvByte();

Ack_I2c(1);

/*启动总线*/

/*发送器件地址*/

/*发送器件子地址*/

/*重新启动总线*/

/*发送数据*/

/*发送就答位*/

/*发送非应位*/

Stop_I2c(); /*结束总线*/

return(1);

}

#ifndef I2C_H

#define I2C_H

#include

//模拟I2C总线的管脚定义

sbit I2C_SCL = P3^6; //定义I2C总线时钟信号

sbit I2C_SDA = P3^7; //定义I2C总线数据信号

//I2C总线初始化

extern void I2C_Init();

//主机通过I2C总线向从机发送多个字节的数据

extern bit I2C_Puts(

unsigned char SlaveAddr, //从机地址

#endif

unsigned char Subaddr, //从机子地址

unsigned char size, //据大小(以字节计)

unsigned char *dat //要发送的数据

//主机通过I2C总线从从机接收多个字节的数据

extern bit I2C_Gets(

unsigned char SlaveAddr, //从机地址

unsigned char Subaddr, //从机子地址

unsigned char size, //数据大小(以字节计)

unsigned char *dat //保存接收到的数据

#endif //I2C_H

#include "I2C.H"

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

函数:I2C_Delay()

功能:模拟I2C总线延时

说明:请根据具体情况调整延时值

);

);

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

void I2C_Delay()

{

}

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

函数:I2C_Init()

功能:I2C总线初始化,使总线处于空闲状态

说明:在main()函数的开始处,应当执行一次本函数

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

void I2C_Init()

{

}

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

函数:I2C_Start()

I2C_SCL = 1; I2C_Delay();

unsigned char t;

t = 50;

while ( --t != 0 ); //延时2*t个机器周期

I2C_SDA = 1; I2C_Delay();

功能:产生I2C总线的起始条件

说明:

SCL处于高电平期间,当SDA出现下降沿时启动I2C总线

本函数也用来产生重复起始条件

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

void I2C_Start()

{

}

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

函数:I2C_Write()

功能:向I2C总线写1个字节的数据

参数:dat是要写到总线上的数据

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

void I2C_Write(unsigned char dat)

{

unsigned char t = 8;

do

I2C_SDA = 1; I2C_Delay();

I2C_SCL = 1; I2C_Delay();

I2C_SDA = 0; I2C_Delay();

I2C_SCL = 0; I2C_Delay();

}

{

I2C_SDA = (bit)(dat & 0x80);

dat <<= 1;

I2C_SCL = 1;

I2C_SCL = 0;

I2C_Delay();

I2C_Delay();

} while ( --t != 0 );

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

函数:I2C_Read()

功能:从从机读取1个字节的数据

返回:读取的1个字节数据

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

unsigned char I2C_Read()

{

unsigned char dat;

unsigned char t = 8;

I2C_SDA = 1; //在读取数据之前,要把SDA拉高,使之处于输入状态

do

{

I2C_SCL = 1;

dat <<= 1;

I2C_Delay();

}

if ( I2C_SDA ) dat++;

I2C_SCL = 0; I2C_Delay();

} while ( --t != 0 );

return dat;

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

函数:I2C_GetAck()

功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据

返回:

0:从机应答

1:从机非应答

说明:从机在收到每一个字节后都要产生应答位,主机如果收到非应答则应当终止传输

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

bit I2C_GetAck()

{

bit ack;

I2C_SDA = 1; I2C_Delay();

I2C_SCL = 1;

ack = I2C_SDA;

I2C_SCL = 0;

return ack;

I2C_Delay();

I2C_Delay();

}

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

函数:I2C_PutAck()

功能:主机产生应答位(应答或非应答),用于通知从机:主机是否成功接收从机数据

参数:

ack=0:主机应答

ack=1:主机非应答

说明:主机在收到每一个字节后都要产生应答,在收到最后一个字节后,应当产生非应答

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

void I2C_PutAck(bit ack)

{

}

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

函数:I2C_Stop()

功能:产生I2C总线的停止条件

说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线

I2C_SDA = ack; I2C_Delay();

I2C_SCL = 1;

I2C_SCL = 0;

I2C_Delay();

I2C_Delay();

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

void I2C_Stop()

{

unsigned int t;

I2C_SDA = 0;

I2C_Delay();

I2C_SCL = 1;

I2C_Delay();

I2C_SDA = 1;

I2C_Delay();

//对于某些器件来说,在下一次产生Start之前,额外增加一定的延时是必须的

}

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

函数:I2C_Puts()

功能:主机通过I2C总线向从机发送多个字节的数据

参数:

SlaveAddr:从机地址(高7位是从机地址,最低位是读写标志)

SubAddr:从机的子地址

size:数据大小(以字节计)

t = 15;

while ( --t != 0 );

*dat:要发送的数据

返回:

0:发送成功

1:在发送过程中出现异常

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

bit I2C_Puts(

{

//确保从机地址最低位是0

SlaveAddr &= 0xFE;

)

unsigned char SlaveAddr,

unsigned char SubAddr,

unsigned char size,

unsigned char *dat

//启动I2C总线

I2C_Start();

//发送从机地址

I2C_Write(SlaveAddr);

if ( I2C_GetAck() )

{

}

I2C_Stop();

return 1;

//发送子地址

I2C_Write(SubAddr);

if ( I2C_GetAck() )

{

}

I2C_Stop();

return 1;

//发送数据

do

{

I2C_Write(*dat++);

if ( I2C_GetAck() )

{

}

I2C_Stop();

return 1;

} while ( --size != 0 );

//发送完毕,停止I2C总线,返回

}

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

函数:I2C_Gets()

I2C_Stop();

return 0;

功能:主机通过I2C总线从从机接收多个字节的数据

参数:

SlaveAddr:从机地址(高7位是从机地址,最低位是读写标志)

SubAddr:从机的子地址

size:数据大小(以字节计)

*dat:保存接收到的数据

返回:

0:接收成功

1:在接收过程中出现异常

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

bit I2C_Gets(

{

//确保从机地址最低位是0

I2C_Stop();

SlaveAddr &= 0xFE;

)

unsigned char SlaveAddr,

unsigned char SubAddr,

unsigned char size,

unsigned char *dat

//启动I2C总线

I2C_Start();

//发送从机地址

I2C_Write(SlaveAddr);

if ( I2C_GetAck() )

{

}

I2C_Stop();

return 1;

//发送子地址

I2C_Write(SubAddr);

if ( I2C_GetAck() )

{

}

I2C_Stop();

return 1;

//发送重复起始条件

I2C_Start();

//发送从机地址

SlaveAddr |= 0x01;

I2C_Write(SlaveAddr);

if ( I2C_GetAck() )

{

}

I2C_Stop();

return 1;

//接收数据

for (;;)

{

}

*dat++ = I2C_Read();

if ( --size == 0 )

{

}

I2C_PutAck(0);

I2C_PutAck(1);

break;

//接收完毕,停止I2C总线,返回

}

I2C_Stop();

return 0;


本文标签: 总线 地址 发送 数据 应答