📄 iic.c
字号:
#include "golbal.h"
sbit SCL2 = P1^6;
sbit SDA2 = P1^7;
union {
BYTE ByteArray[32];
WORD WordArray[16];
LWORD DWordArray[8];
}idata IICBuf; // IIC data Address
BYTE idata IICWait;
BYTE * data IICBufPtr;
bit error;
void I2cStop(void)
{
byM230_IIC_CTR=0x00;
ShortDelay(1);
byM230_IIC_CTR=byM230_IIC_CTR|0x02; //P rise
}
void InitialIIC(void)
{
#ifdef SOFTIIC2
SCL2=1;
SDA2=1;
#else
I2cStop();
//HSCL=1; //han 4.3
//HSDA=1;
#endif
IICBufPtr=IICBuf.ByteArray;
}
#ifdef SOFTIIC2
void CheckIIC2Bus(void)
{
error=0;
if((SDA2!=1)||(SCL2!=1))
{
DelayX1ms(2);
if((SDA2!=1)||(SCL2!=1))
{
error=1;
return;
}
}
}
void IIC2_Start(void) {
SDA2=1;
IIC2Delay();
SCL2=1;
IIC2Delay(); //start condition setup time :4.7 us
_nop_();
_nop_();
_nop_();
_nop_();
SDA2=0;
IIC2Delay(); //start condition hold time :4 us
_nop_();
_nop_();
_nop_();
_nop_();
SCL2=0;
IIC2Delay();// bus free time for next transmission :4.7 us
}
void IIC2_Stop(void) {
SDA2=0;
IIC2Delay();
SCL2=1;
IIC2Delay();
_nop_();
_nop_();
_nop_();
_nop_();
SDA2=1;
IIC2Delay();
}
bit IIC2_Data_In(BYTE bytedata) {
BYTE data i;
bit ack;
for(i=0; i<8; i++) {
SDA2=bytedata & 0x80;
IIC2Delay(); //Clock Low Period : 4.7 us
SCL2=1;
IIC2Delay(); //Clock High Period
_nop_();
_nop_();
bytedata<<=1;
SCL2=0;
}
_nop_();
_nop_();
IIC2Delay();
SDA2=1;
IIC2Delay();
SCL2=1;
IIC2Delay();
_nop_();
_nop_();
ack=SDA2;
SCL2=0;
IIC2Delay();
//SDA2=0;
return ack;
}
//==============================================================================
BYTE IIC2_Data_Out(void) {
BYTE data i;
BYTE data bytedata=0;
SDA2=1;
for(i=0; i<8; i++) {
SCL2=1;
bytedata<<=1;
bytedata|=SDA2;
IIC2Delay();
SCL2=0;
IIC2Delay();
}
return bytedata;
}
void Send2_Acknowledge(bit ack) {
SDA2=ack;
IIC2Delay();
SCL2=1;
IIC2Delay();
SCL2=0;
IIC2Delay();
}
void IICWrite(BYTE device, BYTE address, BYTE count)
{
//CheckIIC2Bus();
//if(error)
//{
// IIC2_Stop();
// return;
///}
IIC2_Start();
error=IIC2_Data_In(device);
if(error)
{
IIC2_Stop();
return;
}
error=IIC2_Data_In(address);
if(error)
{
IIC2_Stop();
return;
}
while(count!=0)
{
error=IIC2_Data_In(*IICBufPtr);
if(error) break;
count--;
IICBufPtr++;
}
IIC2_Stop();
}
void IICRead(BYTE device, BYTE address, BYTE count)
{
//CheckIIC2Bus();
//if(error)
//{
// IIC2_Stop();
// return;
//}
IIC2_Start();
error=IIC2_Data_In(device);
if(error)
{
IIC2_Stop();
return;
}
error=IIC2_Data_In(address);
if(error)
{
IIC2_Stop();
return;
}
IIC2_Start();
error=IIC2_Data_In(device|1);
if(error)
{
IIC2_Stop();
return;
}
while(count!=0)
{
*IICBufPtr=IIC2_Data_Out();
if(count==1) // last byte
{
Send2_Acknowledge(1);
}
else
{
Send2_Acknowledge(0);
}
count--;
IICBufPtr++;
}
IIC2_Stop();
}
//iic write function with two byte address
void IIC_Write2(BYTE device, WORD address, BYTE count)
{
BYTE data j;
error=0;
if(error)
{
IIC2_Stop();
return;
}
IIC2_Start();
error=IIC2_Data_In(device);
if(error)
{
IIC2_Stop();
return;
}
error=IIC2_Data_In(address%256);
if(error)
{
IIC2_Stop();
return;
}
error=IIC2_Data_In(address/256);
if(error)
{
IIC2_Stop();
return;
}
while(count!=0)
{
j=*IICBufPtr;
error=IIC2_Data_In(*IICBufPtr);
if(error)
break;
count--;
IICBufPtr++;
}
IIC2_Stop();
}
//iic read function with two byte address
void IIC_Read2(BYTE device, WORD address, BYTE count)
{
if(error)
{
IIC2_Stop();
return;
}
IIC2_Start();
error=IIC2_Data_In(device);
if(error)
{
IIC2_Stop();
return;
}
error=IIC2_Data_In(address%256);
if(error)
{
IIC2_Stop();
return;
}
error=IIC2_Data_In(address/256);
if(error)
{
IIC2_Stop();
return;
}
IIC2_Stop();
IIC2_Start();
error=IIC2_Data_In(device|1);
if(error)
{
IIC2_Stop();
return;
}
while(count!=0)
{
*IICBufPtr=IIC2_Data_Out();
if(count==1) // last byte
{
Send2_Acknowledge(1);
}
else
{
Send2_Acknowledge(0);
}
count--;
IICBufPtr++;
}
IIC2_Stop();
}
#else
#ifdef HARDIIC2
// hardware IIC
// Wait for byM230_IIC_MBUFI flag and clear it, return 1 if time out, and check ack.
bit wait_IIC(void)
{
IICWait=IIC_WAIT_TIME;
error=0;
//check MBuf sent/received
while( (byM230_IIC_INTFLG&0x01)==0) // Wait for byM230_IIC_MBUFl
{
if(IICWait==0)
{
error=1;
break;
}
}
// check ack
if((byM230_IIC_STUS2&0x80) != 0)
{
error=1;
}
byM230_IIC_INTFLG=byM230_IIC_INTFLG&0xfe;
return(error);
}
void I2cStart(void)
{
byM230_IIC_CTR=0x00;
ShortDelay(1);
byM230_IIC_CTR=byM230_IIC_CTR|0x01; //S rise
}
/*
void I2cStop(void)
{
byM230_IIC_CTR=0x00;
ShortDelay(1);
byM230_IIC_CTR=byM230_IIC_CTR|0x02; //P rise
}
*/
/*
void SendAck(bit NoAck)
{
if(NoAck)
{
byM230_IIC_CTR=0x84;
}
else
{
byM230_IIC_CTR=0x80;
}
}*/
void IICWrite(BYTE slave,BYTE address,BYTE count)
{
BYTE data i;
byM230_IIC_INTFLG=byM230_IIC_INTFLG&0xfe;
byM230_IIC_MBUF=slave; // First byte of IIC data:slave address
I2cStart();
error=wait_IIC();
byM230_IIC_MBUF=address; // Send next byte:sub address
error=wait_IIC();
for(i=0; i<count; i++)
{
byM230_IIC_MBUF=*IICBufPtr; // Send next byte
IICBufPtr++;
error=wait_IIC();
if(error==1) break;
}
I2cStop();
}
void IICRead(BYTE slave, BYTE address, BYTE count)
{
BYTE data i;
byM230_IIC_INTFLG=byM230_IIC_INTFLG&0xfe;
//start
byM230_IIC_CTR=0x80; // S=0,P=0
byM230_IIC_MBUF=slave; // slave address (dummy write)
ShortDelay(1);
byM230_IIC_CTR=0x81; // S=1,P=0
error=wait_IIC();
//dummy write
ShortDelay(1);
byM230_IIC_MBUF=address; //sub address
error=wait_IIC();
//restart
byM230_IIC_CTR=byM230_IIC_CTR & 0xfe; // S set 0
byM230_IIC_MBUF=slave|0x01; //restart + slave address (read)
ShortDelay(1);
byM230_IIC_CTR=byM230_IIC_CTR | 0x01; // S set 1
error=wait_IIC();
//dummy read
ShortDelay(1);
IICBuf.ByteArray[0]=byM230_IIC_MBUF;
error=wait_IIC();
i=0;
while(count!=0)
{
if(count==1)
{
//byM230_IIC_CTR=byM230_IIC_CTR|0x04; //Ack=1
byM230_IIC_CTR=0x05; //Ack=1
}
ShortDelay(1);
*IICBufPtr=byM230_IIC_MBUF;
IICBufPtr++;
error=wait_IIC();
if(error==1) break;
count--;
i++;
}
I2cStop();
}
#else
// no define SOFTIIC2 or HARDIIC2
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -