📄 i2c.c
字号:
//Andreas Hagmann
#include <i2c.h>
void inline SetClk () {
*pFIO0_FLAG_S = SCLK;
ClkDelay ();
}
void inline ClrClk () {
*pFIO0_FLAG_C = SCLK;
ClkDelay ();
}
void inline SetData () {
*pFIO0_FLAG_S = SDATA;
ClkDelay ();
}
void inline ClrData () {
*pFIO0_FLAG_C = SDATA;
ClkDelay ();
}
bool inline GetAck () {
bool ret;
*pFIO0_DIR &= ~SDATA;
*pFIO0_INEN |= SDATA;
//ClrData ();
SetClk ();
ret = *pFIO0_FLAG_D & SDATA;
ClrClk ();
*pFIO0_DIR |= SDATA;
*pFIO0_INEN &= ~SDATA;
return ret;
}
void Init () {
*pFIO0_POLAR &= ~SDATA; // Enable Active High
*pFIO0_EDGE &= ~SDATA; // Enable Level Sensitivity
*pFIO0_DIR |= SCLK; // Set SCLK as output
*pFIO0_DIR |= SDATA;
*pFIO0_FLAG_S = SCLK;
*pFIO0_FLAG_S = SDATA;
}
void inline Start () {
ClrData ();
ClrClk ();
}
void inline Stop () {
ClrData ();
SetClk ();
SetData ();
}
void inline ClkDelay () {
int i;
for (i=0; i<CLK_DELAY; i++) {
asm ("nop;");
}
}
bool Write (unsigned char data) {
char i;
bool ret;
for (i=0; i<8; i++) {
if (data & 0x80) {
SetData ();
}
else {
ClrData ();
}
SetClk ();
ClrClk ();
data <<= 1;
}
ret = GetAck ();
return ret;
}
bool I2C_Write(unsigned char data_out, unsigned char address)
{
Start(); // Send start signal
if (Write(ADV7179_ADDRESS)) // Send identifier I2C address
{
Stop(); // Send I2C Stop Transfer
return true;
}
if (Write(address)) // Send address to device
{
Stop(); // Send I2C Stop Transfer
return true;
}
if (Write(data_out)) // Send byte to device
{
Stop(); // Send I2C Stop Transfer
return true;
}
Stop(); // Send I2C Stop Transfer
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -