?? i2c.c
字號:
#include "types.h"
#include "i2cdef.h"
#include "board.h"
#include "debug.h"
#include "misc.h"
#define i2cSlaveAddr(deviceID, addr) deviceID|((addr>>8)<<1)
#define i2cWordAddr(addr) addr&0xFF
//====================================
// Setup i2c Start condition
Bool i2c_Start(void)
{ Set_i2c_SDA();
Delay4us();
Set_i2c_SCL();
Delay4us();
if (i2c_SDALo() || i2c_SCLLo())
return FALSE;
Clr_i2c_SDA();
Delay4us();
Clr_i2c_SCL();
return TRUE;
}
//=============================================
// Setup i2c Stop condition
void i2c_Stop(void)
{ // SCL=L, SDA=L, Stop condition.
Clr_i2c_SCL();
Delay4us();
Clr_i2c_SDA();
Delay4us();
Set_i2c_SCL();
Delay4us();
Set_i2c_SDA();
}
//============================================
Bool i2c_SendByte(BYTE value)
{ BYTE i;
Bool result;
for (i=0; i<8; i++) // Send data via i2c pin
{ if (value&BIT7)
Set_i2c_SDA();
else
Clr_i2c_SDA();
Delay4us();
Set_i2c_SCL();
value<<=1;
Delay4us(); //0329
Clr_i2c_SCL();
}
Set_i2c_SDA();
Delay4us();
Set_i2c_SCL();
Delay4us(); //0329
result=i2c_SDALo(); // see if ACK
Clr_i2c_SCL();
Delay4us();
Clr_i2c_SDA();
return result;
}
//============================================
BYTE i2c_ReceiveByte(const Bool ack)
{ BYTE i;
BYTE value;
for (i=0; i<8; i++)
{ value<<=1;
Set_i2c_SDA();
Set_i2c_SCL();
Delay4us();
if (i2c_SDAHi())
value|=BIT0;
Clr_i2c_SCL();
}
if (ack)
Clr_i2c_SDA();
else
Set_i2c_SDA();
Delay4us();
Set_i2c_SCL();
Delay4us();
Clr_i2c_SCL();
return value;
}
Bool i2c_BurstWrite(BYTE count, BYTE *buffer)
{ while (count--)
{ if (i2c_SendByte(*(buffer++))==FALSE)
return FALSE;
}
return TRUE;
}
Bool i2c_BurstRead(BYTE count, BYTE * buffer)
{ BYTE i;
for (i=0; i<count-1; i++)
*(buffer+i)=i2c_ReceiveByte(1);
*(buffer+i)=i2c_ReceiveByte(0);
i2c_Stop();
return TRUE;
}
Bool i2c_MasterStart(I2C_Direction direct, BYTE addr)
{ BYTE retry=5;
if (direct==I2C_READ) // Set I2C direction bit.
addr|=BIT0;
else
addr&=~BIT0;
while (retry--)
{ if (i2c_Start()==FALSE)
continue;
if (i2c_SendByte(addr)==TRUE) // send address success
return TRUE;
i2c_Stop();
Delay1ms(1);
}
return FALSE;
}
void i2c_WriteTBL(BYTE deviceID, WORD addr, BYTE *buffer, BYTE count)
{ BYTE slaveAddr;
BYTE wordAddr;
BYTE offset=0;
BYTE tempSize;
Bool succ=TRUE;
while (count)
{ slaveAddr=i2cSlaveAddr(deviceID, addr+offset);
wordAddr=i2cWordAddr(addr+offset);
if (i2c_MasterStart(I2C_WRITE, slaveAddr)==FALSE)
break;
if (i2c_BurstWrite(1, &wordAddr)==FALSE)
break;
tempSize=0x10-(wordAddr&0xF);
if (count>tempSize)
{ if (i2c_BurstWrite(tempSize, (BYTE*)(buffer+offset))==FALSE)
break;
i2c_Stop();
count-=tempSize;
offset+=tempSize;
}
else if (count>0x10)
{ if (i2c_BurstWrite(0x10, (BYTE*)(buffer+offset))==FALSE)
break;
i2c_Stop();
count-=0x10;
offset+=0x10;
}
else
{ if (i2c_BurstWrite(count, (BYTE*)(buffer+offset))==FALSE)
break;
i2c_Stop();
count=0;
}
ForceDelay1ms(5); //0329//1); //ASW for some slower eeprom
}
i2c_Stop();
ForceDelay1ms(10); //0329
}
void i2c_ReadTBL(BYTE deviceID, WORD addr, BYTE *buffer, BYTE count)
{ WORD retry=5;
BYTE slaveAddr;
BYTE wordAddr;
slaveAddr=i2cSlaveAddr(deviceID, addr);
wordAddr=i2cWordAddr(addr);
while (retry--)
{ if (i2c_MasterStart(I2C_WRITE, slaveAddr)==FALSE)
continue;
if (i2c_BurstWrite(1, &wordAddr)==FALSE)
continue;
if (i2c_MasterStart(I2C_READ, slaveAddr)==FALSE)
continue;
if (i2c_BurstRead(count, buffer)==FALSE)
continue;
return;
}
}
#if 0
void i2c_WriteByte(BYTE deviceID, WORD addr, BYTE *value)
{ i2c_WriteTBL(deviceID, addr, value, 1);
}
void i2c_ReadByte(BYTE deviceID, WORD addr, BYTE *value)
{ i2c_ReadTBL(deviceID, addr, value, 1);
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -