}
/*--------------------------------------------------------------------
函数名称:
I2CStart
函数功能:
发出起始信号
注意事项:
提示说明:
输 入:
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_Start()
{
I2CStart(); //发出起始信号
if(!
I2C_WaitINT())returnI2C_ERR;//等待启动完成
if(I2C_STATUS!
=I2C_START) //检查是否启动成功
returnI2C_ERR; //启动失败,返回0
returnI2C_CRR; //启动成功,返回1
}
/*--------------------------------------------------------------------
函数名称:
I2CReStart
函数功能:
发出重复起始信号
注意事项:
提示说明:
输 入:
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_Restart()
{
I2CStart();
if(!
I2C_WaitINT())returnI2C_ERR;
if(I2C_STATUS!
=I2C_RESTART) //检查是否重复启动成功
returnI2C_ERR;
returnI2C_CRR;
}
/*--------------------------------------------------------------------
函数名称:
I2C_SendWrDAdr
函数功能:
发送7位器件写地址:
XXXXXXX0
注意事项:
提示说明:
输 入:
写地址
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_SendWrDAdr(unsignedcharwrDAdr)
{
I2C_SendByte(wrDAdr); //设置器件写地址
if(!
I2C_WaitINT())returnI2C_ERR;
if(I2C_STATUS!
=I2C_MT_SLA_ACK)
returnI2C_ERR;
returnI2C_CRR;
}
/*--------------------------------------------------------------------
函数名称:
I2C_SendWrDAdr_
函数功能:
发送10位器件写地址:
11110XX0,XXXXXXXX
注意事项:
提示说明:
兼容发送7位器件写地址:
XXXXXXX0
输 入:
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_SendWrDAdr_(unsignedintwrDAdr)
{
if(wrDAdr&0xF000==0xF000) //判断是否为10位器件地址
if(I2C_SendWrDAdr((unsignedchar)wrDAdr>>8)==I2C_ERR)//设置(高位)器件写地址
returnI2C_ERR;
if(I2C_SendWrDAdr((unsignedchar)wrDAdr)==I2C_ERR)//设置(低位)器件写地址
returnI2C_ERR;
returnI2C_CRR;
}
/*--------------------------------------------------------------------
函数名称:
I2C_SendRdDAdr
函数功能:
发送7位器件读地址:
XXXXXXX1
注意事项:
提示说明:
输 入:
读地址
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_SendRdDAdr(unsignedcharrdDAdr)
{
I2C_SendByte(rdDAdr); //设置器件读地址
if(!
I2C_WaitINT())returnI2C_ERR;
if(I2C_STATUS!
=I2C_MR_SLA_ACK)
returnI2C_ERR;
returnI2C_CRR;
}
/*--------------------------------------------------------------------
函数名称:
I2C_SendRdDAdr_
函数功能:
发送10位器件读地址:
11110XX0,XXXXXXXX
注意事项:
提示说明:
兼容发送7位器件读地址:
XXXXXXX1
输 入:
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_SendRdDAdr_(unsignedcharrdDAdr)
{
if(rdDAdr&0xF000==0xF000) //判断是否为10位器件地址
if(I2C_SendWrDAdr((unsignedchar)rdDAdr>>8)==I2C_ERR)//设置(高位)器件读地址
returnI2C_ERR;
if(I2C_SendWrDAdr((unsignedchar)rdDAdr)==I2C_ERR)//设置(低位)器件读地址
returnI2C_ERR;
returnI2C_CRR;
}
/*--------------------------------------------------------------------
函数名称:
I2C_SendDat
函数功能:
I2C发送数据
注意事项:
提示说明:
输 入:
待发送的字节数据
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_SendDat(unsignedchardata)
{
I2C_SendByte(data);
if(!
I2C_WaitINT())returnI2C_ERR;
if(I2C_STATUS!
=I2C_MT_DATA_ACK)
returnI2C_ERR;
returnI2C_CRR;
}
/*--------------------------------------------------------------------
函数名称:
I2C_RcvNAckDat
函数功能:
I2C接收数据且不产生应答
注意事项:
提示说明:
输 入:
接收数据存储空间指针
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_RcvNAckDat(unsignedchar*pRdDat)
{
I2CRcvNckByte();
if(!
I2C_WaitINT())returnI2C_ERR;
if(I2C_STATUS!
=I2C_MR_DATA_NACK)
returnI2C_ERR;
*pRdDat=TWDR;
returnI2C_CRR;
}
/*--------------------------------------------------------------------
函数名称:
I2C_RcvAckDat
函数功能:
I2C接收数据且产生应答
注意事项:
提示说明:
输 入:
接收数据存储空间指针
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_RcvAckDat(unsignedchar*pRdDat)
{
I2CRcvAckByte();
if(!
I2C_WaitINT())returnI2C_ERR;
if(I2C_STATUS!
=I2C_MR_DATA_ACK)
returnI2C_ERR;
*pRdDat=TWDR;
returnI2C_CRR;
}
/*以下是API函数*/
//(ApplicationProgramInteRFace应用程序接口)
/*--------------------------------------------------------------------
函数名称:
I2C_Write(unsignedintwrDAdr,unsignedcharwordAdr,unsignedchardat)
函数功能:
I2C写器件,写一个字节
注意事项:
提示说明:
输 入:
wrDAdr:
writedevice-address写器件地址
wordAdr:
wordaddress从地址
dat:
data数据
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_Write(unsignedintwrDAdr,unsignedcharwordAdr,unsignedchardat)
{
if(I2C_Start()==I2C_ERR)
returnI2C_ERR;
//wrDAdr&=0xfffe;
if(I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR)//保证写控制位正确
returnI2C_ERR;
if(I2C_SendDat(wordAdr)==I2C_ERR)//从地址当作一般数据发送
returnI2C_ERR;
if(I2C_SendDat(dat)==I2C_ERR)
returnI2C_ERR;
I2CStop();
returnI2C_CRR;
}
/*--------------------------------------------------------------------
函数名称:
I2C_Write_
函数功能:
I2C写器件,写N个数据
注意事项:
提示说明:
输 入:
wrDAdr:
writedevice-address写器件地址
wordAdr:
wordaddress从地址
*pWrDat:
p->writedata写入数据的指针
num :
number写入数据个数
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_Write_(unsignedintwrDAdr,unsignedcharwordAdr,
unsignedchar*pWrDat,unsignedcharnum)
{
unsignedchari;
if(I2C_Start()==I2C_ERR)
returnI2C_ERR;
//wrDAdr&=0xfffe;
if(I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR)//保证写控制位正确
returnI2C_ERR;
if(I2C_SendDat(wordAdr)==I2C_ERR)//从地址当作一般数据发送
returnI2C_ERR;
for(i=0;i if(I2C_SendDat(*(pWrDat++))==I2C_ERR)
returnI2C_ERR;
I2CStop();
returnI2C_CRR;
}
/*--------------------------------------------------------------------
函数名称:
I2C_Read
函数功能:
I2C读器件,读一个数据
注意事项:
提示说明:
输 入:
rdDAdr:
readdevice-address读器件地址
wordAdr:
wordaddress从地址
*pRdDat:
p->readdata读取数据指针
返 回:
运行状况 I2C_ERR:
错误 I2C_CRR:
正确
--------------------------------------------------------------------*/
unsignedcharI2C_Read(unsignedintrdDAdr,unsignedcharwordAdr,unsignedchar*pRdDat)
{
if(I2C_Start()==I2C_ERR)
returnI2C_ERR;
//rdDAdr&=0xfffe;
if(I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR)//保证写控制位正确
returnI2C_E