📄 i2c.c
字号:
#include "..\includes\includes.h"
#define ERRORCOUNT 3
void busDelay(void)
{
#asm
nop;
nop;
nop;
nop;
nop;
#endasm
}
void IICStart(void)
{
SCL=0;
SDA=1;
busDelay();
SCL=1;
busDelay();
SDA=0;
busDelay();
SCL=0;
SDA=1;
}
void IICStop(void)
{
SCL=0;
SDA=0;
busDelay();
SCL=1;
busDelay();
SDA=1;
busDelay();
SCL=0;
}
bit temp;
bit IICRecAck(void)
{ // bit temp;
SCL=0;
SDA=1;
SCL=1;
TRISA4=1;
temp=SDA; //因为返回值总是放在CY中的
SCL=0;
TRISA4=0;
return(temp);
}
void IICACK(void)
{
SDA=0;
SCL=1;
busDelay();
SCL=0;
SDA=1;
}
void IICNoAck(void)
{
SDA=1;
SCL=1;
busDelay();
SCL=0;
}
void IICSendByte(INT8U sendbyte)
{
INT8U j=8;
for(;j>0;j--)
{
SCL=0;
busDelay();
sendbyte<<=1;
SDA=CARRY;
busDelay();
SCL=1;
busDelay();
}
SCL=0;
}
unsigned char IICReceiveByte(void)
{ char receivebyte,i=8;
SDA=1;
SCL=0;
while(i--)
{
SCL=1;
busDelay();
receivebyte=(receivebyte<<1)|SDA;
busDelay();
SCL=0;
}
return(receivebyte);
}
/*
INT8U IIcRead(INT8U Address)
{
INT8U bank;
INT8U DataBuff;
INT8U i=ERRORCOUNT;
if ((Address&0x8000)==0x8000) //IIC地止最高位1表示外部卡
bank=0xAE;
else bank=0xA0;
Address=Address&0x7FFF;
while(i--)
{ IICStart();
IICSendByte(bank); //写控制字到E2PROM
if (IICRecAck())
continue;
IICSendByte((unsigned char)(Address>>8));
if (IICRecAck())
continue;
IICSendByte((unsigned char)Address);
if (IICRecAck())
continue;
IICStart();
IICSendByte(bank+1);
if(IICRecAck())
continue;
DataBuff=IICReceiveByte(); //read last byte data
IICNoAck();
break;
}
IICStop();
return(DataBuff);
}
bit IIcWrite(INT8U DataBuff,INT8U Address)
{
INT8U bank;
INT8U IICFlag=FALSE;
INT8U i=ERRORCOUNT;
if ((Address&0x8000)==0x8000)
bank=0xAE;
else bank=0xA0;
Address=Address&0x7FFF;
while(i--)
{ IICStart();
IICSendByte(bank); //写控制字到E2PROM
if (IICRecAck())
continue;
IICSendByte((unsigned char)(Address>>8));
if (IICRecAck())
continue;
IICSendByte((unsigned char)Address);
if (IICRecAck())
continue;
IICSendByte(DataBuff);
IICRecAck();
IICFlag=TRUE;
break;
}
IICStop();
//IIcWriteDelays(10); //changed 2007.11.16
return(IICFlag);
}
*/
INT8U I2C_WriteNByte(INT8U chip,INT8U mode,INT8U addr,INT8U *p,INT8U sum)
{
INT8U flag;
INT8U i,r;
flag=0;
r=ERRORCOUNT;
while(r--)
{ IICStart();
IICSendByte(chip);
if (IICRecAck())
continue;
IICSendByte(addr);
if (IICRecAck())
continue;
for (i=0;i<sum;i++)
IICSendByte(*(p+i));
IICRecAck();
flag=TRUE;
break;
}
IICStop();
return(flag);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -