📄 si2chost.c
字号:
#define _SI2C_HOST_C_
#include "mreg51.h"
#include "board.h"
#include <intrins.h>
#include "DataType.h"
#include "R8051XC.h"
#include "i2c.h"
#include "SI2cHost.h"
// Use software I2C bus at this moment, it needs to implement the H/W I2C bus later
// kevin 071027_0
extern BOOL IIC_AccessStart(BYTE ucSlaveAdr, BYTE trans_t);
extern BYTE IIC_GetByte (U16 bAck);
extern void IIC_Stop(void);
extern BOOLEAN IIC_SendByte(U8 u8dat);
void SI2cByteDelay(WORD delay)
{
while(delay--)
{
SWIIC_Delay();
}
}
void SI2cHostWrite(BYTE * pAddr, BYTE addrSize, BYTE * pData, BYTE dataSize)
{
BYTE ucDummy,ucCount;
BYTE ucSlaveAdr=SI2C_SLAVEADDR;
ET0 = 0;
ucDummy = I2C_ACCESS_DUMMY_TIME;
while (ucDummy--)
{
if (IIC_AccessStart(ucSlaveAdr, SWIIC_WRITE) == FALSE)
continue;
SI2cByteDelay(SI2C_BYTE_DELAY);
for( ucCount=0;ucCount<addrSize;ucCount++)
{
if (IIC_SendByte(pAddr[ucCount]) == I2C_NON_ACKNOWLEDGE)
continue;
SI2cByteDelay(SI2C_BYTE_DELAY);
}
while(dataSize--)
{
IIC_SendByte(*(pData++));
SI2cByteDelay(SI2C_BYTE_DELAY);
}
break;
}
IIC_Stop();
ET0 = 1;
}
BYTE SI2cHostRead(BYTE * pAddr, BYTE addrSize)
{
BYTE ucDummy,ucCount,ucData;
BYTE ucSlaveAdr=SI2C_SLAVEADDR;
ET0 = 0;
ucDummy = I2C_ACCESS_DUMMY_TIME;
while (ucDummy--)
{
if (IIC_AccessStart(ucSlaveAdr, SWIIC_WRITE) == FALSE)
continue;
SI2cByteDelay(SI2C_BYTE_DELAY);
for( ucCount=0;ucCount<addrSize;ucCount++)
{
if (IIC_SendByte(pAddr[ucCount]) == I2C_NON_ACKNOWLEDGE)
continue;
SI2cByteDelay(SI2C_BYTE_DELAY);
}
IIC_Stop();
SI2cByteDelay(SI2C_READ_DELAY);
if (IIC_AccessStart(ucSlaveAdr, I2C_TRANS_READ) == FALSE)
continue;
ucData=IIC_GetByte(0); // receive byte
break;
} // while
IIC_Stop();
ET0 = 1;
return ucData;
}
void SI2cHostWrite4Bytes(BYTE data1, BYTE data2, BYTE data3, BYTE data4)
{
BYTE addr[4];
addr[0]=data1;
addr[1]=data2;
addr[2]=data3;
addr[3]=data4;
SI2cHostWrite(addr,sizeof(addr),NULL,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -