标题:
24CXXXIIC的单片机驱动程序(原创可用)
[打印本页]
作者:
jizhongbiao
时间:
2020-1-8 11:24
标题:
24CXXXIIC的单片机驱动程序(原创可用)
/*********************************************************************
功能:产生IIC起始信号
备注:时钟数据线拉高进入空闲状态,然后再时钟线高电平情况下
拉低数据局限进入起始状态,拉低时钟线钳位总线准备发送
wx:mcu6666(单片机项目交流合作)
***********************************************************************/
void IIC_Start(void)
{
SDAH();
SCLH();
I2CWait();
SDAL();
I2CWait();
SCLL();
}
/*********************************************************************
功能:产生停止信号
备注: 时钟高电平期间数据线向高电平方向跳变
***********************************************************************/
void IIC_Stop(void)
{
SDAL();
SCLL();
I2CWait();
SCLH();
I2CWait();
SDAH();
I2CWait();
}
/********************************************************************
功能:检测应答信号
返回:1:失败
0 :成功
备注:作为发送方的时候等待接收的应答信号
**********************************************************************/
unsigned char IIC_Wait_Ack(void)
{
unsigned char flag;
SDAH();
I2CWait();
SCLH();
I2CWait();
if(SDA)
flag=1;
else
flag=0;
SCLL();
return flag;
}
/**********************************************************************
功能:产生应答信号
备注:数据线低电平应答
***********************************************************************/
void IIC_Ack(void)
{
SCLL();
SDAL();
I2CWait();
SCLH();
I2CWait();
SCLL();
}
#if 0
/***************************************************************************
功能:产生非应答信号
备注:数据线高电平非应答
***************************************************************************/
void IIC_NAck(void)
{
SCLL();
SDAH();
I2CWait();
SCLH();
I2CWait();
SCLL();
}
#endif
/****************************************************************************
功能:发送一个字节
入口:要发送的字节备注:
****************************************************************************/
void IIC_Send_Byte(unsigned char txd)
{
unsigned char t;
SCLL();
for(t=0;t<8;t++)
{
if((txd&0x80)>>7)//MSB:高位在前
SDAH();
else
SDAL();
txd<<=1;
I2CWait();
SCLH();
I2CWait();
SCLL();
}
}
/****************************************************************************
功能:读一个字节
备注:读成功发送ack信号
*****************************************************************************/
unsigned char IIC_Read_Byte(void)
{
unsigned char i,receive=0;
for(i=0;i<8;i++ )
{
SCLL();
I2CWait();
SCLH();
I2CWait();
receive<<=1; //MSB:高位在前
if(SDA)
{
receive += 1;
}
}
IIC_Ack(); //发送ACK
return receive;
}
/******************************************************************************
功能:再eep中读出一个字节
入口:16字节的地址
*******************************************************************************/
unsigned char AT24CXX_ReadOneByte(unsigned int ReadAddr)
{
unsigned char temp;
unsigned char addrH,addrL;
addrH=ReadAddr>>8;
addrL=ReadAddr&0xff;
IIC_Start();
IIC_Send_Byte(0xa0); //进入写模式
IIC_Wait_Ack();
IIC_Send_Byte(addrH); //发送高地址
IIC_Wait_Ack();
IIC_Send_Byte(addrL); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0xa1); //进入读模式
IIC_Wait_Ack();
temp= IIC_Read_Byte();
IIC_Stop();//产生一个停止条件
return temp;
}
/**************************************************************************
功能:向地址中写一个数据
入口:1,地址 2,数据
作者:jzb 2020年1月6日
备注:
******************************************************************************/
void AT24CXX_WriteOneByte(unsigned int WriteAddr,unsigned char DataToWrite)
{
unsigned char addrH,addrL;
addrH=WriteAddr>>8;
addrL=WriteAddr&0xff;
IIC_Start();
IIC_Send_Byte(0xa0);
IIC_Wait_Ack();
IIC_Send_Byte(addrH); //发送高地址
IIC_Wait_Ack();
IIC_Send_Byte(addrL); //发送低地址
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite); //发送字节
IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1