📄 iic.c
字号:
#include "global.h"
#define EEPROM_PBYTE 16 // 24c16
#define EEPROM_PTIME 7 // wait 7 ms
/****************************************************************************/
void Short_Delay(BYTE Time)
{
while(Time --);
}
void DoWait(WORD Time) // delay 1ms
{
BYTE Counter;
for(; Time > 0; Time --)
{
Counter = 250;
while(--Counter);
Counter = 250;
while(--Counter);
}
}
/****************************************************************************/
// Software IIC
/****************************************************************************/
#ifdef _IICSW_
//---------------------------------------------------------------------------
void IIC_Start(void)
{
ResSDA;
ResSCL;
}
//---------------------------------------------------------------------------
void IIC_Stop(void)
{
SetSDA;
ResSDA;
SetSCL;
while(!GetSCL);
SetSDA;
}
//---------------------------------------------------------------------------
void Initial_I2C(void)
{
EEP_Wait = 0;
IIC_Stop();
}
//---------------------------------------------------------------------------
void IIC_Send1Byte(BYTE senddata)
{
BYTE i;
for(i = 0; i < 8; i++)
{
if(senddata & 0x80)
SetSDA;
else
ResSDA;
senddata <<=1;
SetSCL;
while(!GetSCL);
ResSCL;
}
ResSCL;
SetSDA;
SetSCL;
while(!GetSCL);
if (GetSDA)
bNoAck = 1;
else
bNoAck = 0;
ResSCL;
}
//---------------------------------------------------------------------------
BYTE IIC_Read1Byte(BIT noack)
{
BYTE i,readdata=0;
for(i = 0; i < 8; i++)
{
readdata <<= 1;
SetSDA;
SetSCL;
while(!GetSCL);
if(GetSDA)
readdata |= 0x01;
ResSCL;
}
if(noack)
SetSDA;
else
ResSDA;
SetSCL;
while(!GetSCL);
ResSCL;
return readdata;
}
/****************************************************************************/
// IIC write address
/****************************************************************************/
void IICSW_Write(BYTE id,BYTE addr,BYTE *databuf,WORD number)
{
int i;
BYTE count = 0;
do
{
count++;
// Stop
IIC_Stop();
Short_Delay(20);
// Start
IIC_Start();
// Slave ID
IIC_Send1Byte(id);
if (bNoAck)
continue;
// Address
IIC_Send1Byte(addr);
if (bNoAck)
continue;
// data
for(i = 0; i < number; i++)
{
IIC_Send1Byte(databuf[i]);
if(bNoAck)
break;
}
if (bNoAck)
continue;
// Stop
IIC_Stop();
}
while(bNoAck && count < 10);
}
/****************************************************************************/
// IIC Read address
/****************************************************************************/
void IICSW_Read(BYTE id,BYTE addr,BYTE *databuf,WORD number)
{
int i;
BYTE count = 0;
do
{
count++;
// Stop
IIC_Stop();
Short_Delay(20);
// Start
IIC_Start();
// Slave ID
IIC_Send1Byte(id);
if (bNoAck)
continue;
// Address
IIC_Send1Byte(addr);
if (bNoAck)
continue;
SetSDA;
SetSCL;
while(!GetSCL);
IIC_Start();
// Slave ID
IIC_Send1Byte(id | 0x01);
if (bNoAck)
continue;
// data
for(i = 0; i < number-1; i++)
{
databuf[i] = IIC_Read1Byte(0);
}
databuf[i] = IIC_Read1Byte(1);
// Stop
IIC_Stop();
}
while(bNoAck && count < 10);
}
#endif // #ifdef _IICSW_
/****************************************************************************/
// Hardware IIC
/****************************************************************************/
#ifdef _IICHW_
//--------------------------------------------------------
void Initial_I2C(void)
{
EEP_Wait = 0;
byMTV_IIC_CTR = 0x0; // STOP
byMTV_IIC_CTR = 0x2; // STOP
}
//--------------------------------------------------------
// Wait for MBUFL flag and clear it, return 1 if time out
//--------------------------------------------------------
void Wait_IIC_Ack(void)
{
Short_Delay(10);
IIC_Timer = 1;
while(IIC_Timer > 0 && (byMTV_IIC_INTFLG & 0x1) == 0);
if ((byMTV_IIC_STUS1 & 0x01 ) == 0)
bNoAck = 0;
else
bNoAck = 1;
byMTV_IIC_INTFLG = 0;
}
//--------------------------------------------------------
// IIC write address
//--------------------------------------------------------
void IIC_Write(BYTE id,BYTE addr,BYTE *databuf,WORD number)
{
int i;
BYTE count = 0;
do
{
count++;
// Stop
byMTV_IIC_CTR = 0x00;
byMTV_IIC_CTR = 0x02;
Short_Delay(20);
byMTV_IIC_INTFLG = 0x00;
// Slave ID
byMTV_IIC_MBUF = id;
// Start
byMTV_IIC_CTR = 0x00;
byMTV_IIC_CTR = 0x01;
Wait_IIC_Ack();
if (bNoAck)
continue;
// Address
byMTV_IIC_MBUF = addr;
Wait_IIC_Ack();
if (bNoAck)
continue;
// data
for(i = 0; i < number; i++)
{
byMTV_IIC_MBUF = databuf[i];
Wait_IIC_Ack();
if(bNoAck)
break;
}
}
while(bNoAck && count < 10);
// Stop
byMTV_IIC_CTR = 0x00;
byMTV_IIC_CTR = 0x02;
}
//--------------------------------------------------------
// IIC Read address
//--------------------------------------------------------
void IIC_Read(BYTE id,BYTE addr,BYTE *databuf,WORD number)
{
int i;
BYTE count = 0;
do
{
count++;
// Stop
byMTV_IIC_CTR = 0x00;
byMTV_IIC_CTR = 0x02;
Short_Delay(20);
byMTV_IIC_INTFLG = 0x00;
// Slave ID
byMTV_IIC_MBUF = id;
// Start
byMTV_IIC_CTR = 0x00;
byMTV_IIC_CTR = 0x01;
Wait_IIC_Ack();
if (bNoAck)
continue;
// Address
byMTV_IIC_MBUF = addr;
Wait_IIC_Ack();
if (bNoAck)
continue;
// Stop
byMTV_IIC_CTR = 0;
byMTV_IIC_CTR = 0x2;
Short_Delay(20);
// Slave ID
byMTV_IIC_MBUF = id | 0x01;
// Start
byMTV_IIC_CTR = 0x0;
byMTV_IIC_CTR = 0x1;
Wait_IIC_Ack();
if (bNoAck)
continue;
// useless data
databuf[0] = byMTV_IIC_MBUF;
// data
for(i = 0; i < number-1; i++)
{
Wait_IIC_Ack();
if(bNoAck)
break;
databuf[i] = byMTV_IIC_MBUF;
}
if(bNoAck)
continue;
byMTV_IIC_CTR = 0x05;
Wait_IIC_Ack();
if (bNoAck)
continue;
databuf[i] = byMTV_IIC_MBUF;
}
while(bNoAck && count < 10);
// Stop
byMTV_IIC_CTR = 0x00;
byMTV_IIC_CTR = 0x02;
}
#endif // #ifdef _IICSW_
/****************************************************************************/
void EEPROM_Write(WORD addr,BYTE *databuf,WORD number)
{
BYTE id,temp;
union W_TEMP addr1;
addr1.valW = addr;
while( number > 0)
{
id = I2C_EEP_ADDR + (addr1.valB[0] << 1);
temp = EEPROM_PBYTE -(addr1.valB[1]&(EEPROM_PBYTE-1));
if( temp > number)
temp = number;
while(EEP_Wait > 0);
WriteData(id,addr1.valB[1],databuf,temp);
EEP_Wait = EEPROM_PTIME;
number -= temp;
addr1.valW += temp;
databuf += temp;
}
}
/****************************************************************************/
void EEPROM_Read(WORD addr,BYTE *databuf,WORD number)
{
BYTE id;
union W_TEMP addr1;
addr1.valW = addr;
id = I2C_EEP_ADDR + (addr1.valB[0] << 1);
while(EEP_Wait > 0);
ReadData(id,addr1.valB[1],databuf,number);
}
/****************************************************************************/
void CS7111_Read(WORD addr,BYTE *databuf,WORD number)
{
ReadData(I2C_CS7111_ADDR,addr,databuf,number);
}
/****************************************************************************/
void CS7111_Write(BYTE addr,BYTE databuf)
{
WriteData(I2C_CS7111_ADDR,addr,&databuf,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -