static void __zyI2cAckSend(void)
{
__ZY_I2C_SDA=0;
__ZY_I2C_DELAY();
__ZY_I2C_SCL=1;
__ZY_I2C_DELAY();
__ZY_I2C_SCL=0;
}
static void __zyI2cNakSend(void)
{
__ZY_I2C_SDA=1;
__ZY_I2C_DELAY();
__ZY_I2C_SCL=1;
__ZY_I2C_DELAY();
__ZY_I2C_SCL=0;
}
static char __zyI2cIsAck(void)
{
__ZY_I2C_SDA=1;
__ZY_I2C_DELAY();
__ZY_I2C_SCL=1;
__ZY_I2C_DELAY();
if(__ZY_I2C_SDA==1){
__ZY_I2C_SCL=0;
return 0;
}
__ZY_I2C_SCL=0;
return 1;
}
static void __zyI2cByteSend(unsigned char ucData)
{
unsigned char i;
/***发送数据 ***/
i=8;
do{
__zyI2cBitSend(ucData);
ucData=ucData<<1;
}while(--i!=0);
}
static unsigned char __zyI2cByteReceive(void)
{
unsigned char ucRt; //返回值
unsigned char i;
ucRt=0;
__ZY_I2C_SDA=1; //设置为输入
/**************接收数据*************/
i=8;
do{
ucRt=(ucRt<<1)+__zyI2cBitReceive();
}while (--i!=0);
return ucRt;
}
char zyI2cInit(void)
{
__ZY_I2C_SCL=0;
__zyI2cStopSend();
return 0;
}
unsigned char zyI2cWrite(unsigned char ucAddr,
unsigned int uiRegAddr,
unsigned char ucRegAddrLen,
unsigned char *pucData,
unsigned char ucDataLen)
{
unsigned char i;
if(ucDataLen==0||pucData==0){
return 0;
}
i=ucDataLen;
__zyI2cStartSend(); //发送START信号
__zyI2cByteSend(ucAddr&0xfe); //发送写信号
if(!__zyI2cIsAck()){ //接收ACK信号
/***
发送寄存器地址
*************/
while(ucRegAddrLen>0) {
__zyI2cByteSend(uiRegAddr); //发送一个字节寄存器地址
if (!__zyI2cIsAck()){
break;
}
ucRegAddrLen--;
uiRegAddr=uiRegAddr>>8;
}
if(ucRegAddrLen==0){ /*
* 发送寄存器地址成功就发送数据
*/ do{
__zyI2cByteSend(*pucData++);
if(!__zyI2cIsAck()){ //接收ACK信号
break;
}
}while(--i!=0);
}
}
__zyI2cStopSend(); //发送停止信号
return (ucDataLen-i);
}
不知道 为什么 总是存不了。。忘大家帮帮忙。 |