📄 tsem0108llib.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <io.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOLEAN;
#define FALSE 0;
#define TRUE 1;
// Configure Slave Address to 160d
#define I2C_DATA_R 0xA1
#define I2C_DATA_W 0xA0
sbit TSEM_SCL = P2^0;
sbit TSEM_SDA = P2^1;
/*
Pulls SCL High, returns a 1 if successful else 0
*/
bit TSEM_I2CSCLHigh()
{
BYTE cnt;
TSEM_SCL = 1;
for(cnt = 8;cnt > 0;cnt--)
if(TSEM_SCL) return 1;
return 0;
}
bit TSEM_I2CStart()
{
TSEM_SDA = 0;
_nop_();
_nop_();
TSEM_SCL = 0;
return 1;
}
bit TSEM_I2CStop()
{
TSEM_SCL = 1;
_nop_();
_nop_();
TSEM_SDA = 1;
return 1;
}
/*
Returns a 1 if byte is successfully sent with Ack, else
return zero, if either SCL is not clockable or no ack from
I2C Device
*/
bit TSEM_I2CSend(BYTE SendData)
{
BYTE mask;
/*
Strobe first 8 bit of data with
MSB first to I2C bus
*/
mask = 0x80;
do
{
TSEM_SDA = ((SendData & mask) != 0);
mask = mask >> 1;
if(TSEM_I2CSCLHigh() == 0) return 0;
TSEM_SCL = 0;
}while(mask);
/*
Check for number 9 acknowledgement bit
from I2C Device
*/
TSEM_SDA =1 ;
_nop_();
_nop_();
if(TSEM_I2CSCLHigh() == 0) return 0;
if(TSEM_SDA == 0)
{
// Device has acknowledged
_nop_();
TSEM_SCL = 0;
return 1;
};
return 0;
}
bit TSEM_I2CReceive(BYTE *pReceiveData,bit Ack)
{
BYTE i,mask;
TSEM_SDA = 1;
mask = 0x80;
i = 0;
_nop_();
do
{
if(TSEM_I2CSCLHigh() == 0) return 0;
_nop_();
if(TSEM_SDA) i = i | mask;
TSEM_SCL = 0 ;
_nop_();
mask = mask >> 1;
}while(mask);
if(Ack)
TSEM_SDA = 1;
else
TSEM_SDA = 0;
if(TSEM_I2CSCLHigh() == 0) return 0;
_nop_();
*pReceiveData = i;
TSEM_SCL = 0;
return 1;
}
void Wr_command(BYTE cCommand)
{
TSEM_I2CStart(); //Single Master, ignores bus contention
if (TSEM_I2CSend(I2C_COMMAND_W))
{
TSEM_I2cSend(cCommand);
TSEM_I2cStop();
}
else
{
TSEM_SCL = 1;
TSEM_SDA = 1;
}
}
void Rd_Ndata(BYTE *POINTER,BYTE N)
{
BYTE count;
bit ReceiveAck ;
TSEM_I2CStart(); //Single Master, ignores bus contention
if (TSEM_I2CSend(I2C_DATA_R))
{
for(count = 0;count < N;count++)
{
ReceiveAck = (count == (N - 1));
TSEM_I2CReceive(POINTER + count, ReceiveAck);
}
}
TSEM_I2CStop();
}
/*
Read ambient temperature and object temperature pixel 1 - 8
*/
BOOLEAN Read_Temperatures(WORD* uiAmbTemp,WORD uiObjTemp[])
{
#define swap(ptr1,ptr2,idx1,idx2) (*((ptr1) + (idx1)) = (ptr2[idx2]); \
*((ptr1) + (idx2)) = (ptr2[idx1]);)
BYTE cCommand;
BYTE cReceivedByte[18];
BYTE* pByte;
cCommand = 7; // Command: Read temperatures (7)
/*
Write command to I2C-Slave
cCommand: Command to read I2C-Slave-EEPROM (7)
*/
Wr_command(cCommand);
/*
Receive ambient temperature and object temperature from I2C-Slave
*/
Rd_Ndata(cReceivedByte, 18);
pByte = (BYTE *)uiAmbTemp;
swap(pByte, cReceivedByte, 0, 1);
pByte = (BYTE *)uiObjTemp;
swap(pByte, cReceivedByte, 2, 3);
swap(pByte, cReceivedByte, 4, 5);
swap(pByte, cReceivedByte, 6, 7);
swap(pByte, cReceivedByte, 8, 9);
swap(pByte, cReceivedByte, 10, 11);
swap(pByte, cReceivedByte, 12, 13);
swap(pByte, cReceivedByte, 14, 15);
swap(pByte, cReceivedByte, 16, 17);
// Return from function
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -