/*********************************************************************
功能:產生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();//產生一個停止條件
}
|