📄 i2c.c
字号:
//------------------------------
// AverLogic Technology Co.Ltd.
// File Name : i2c.c
// Author : Casper Chou
//------------------------------
#ifndef _I2C_C
#define _I2C_C
#include "define.h"
#include "ext_var.h"
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//------------------------------
void i2c_wait(void)
{
_nop_();
_nop_();
_nop_(); // 2002-12-20 more add!
#if (XTAL>=12000000)
_nop_();
_nop_();
_nop_(); // 2002-12-20 more add!
_nop_(); // 2002-12-20 more add!
#endif
}
//------------------------------
void i2c_start(void)
{
SDA_P=1;
SCL_P=1;
i2c_wait();
SDA_P=0;
i2c_wait();
SCL_P=0;
}
//------------------------------
void i2c_stop(void)
{
SDA_P=0;
_nop_();
SCL_P=1;
i2c_wait();
SDA_P=1;
}
//------------------------------
BOOL i2c_tx_byte(BYTE TxData)
{
BYTE i;
BOOL ack;
for(i=0;i<8;i++)
{
if(TxData&0x80)
SDA_P=1;
else
SDA_P=0;
TxData<<=1;
i2c_wait();
SCL_P=1;
i2c_wait();
SCL_P=0;
i2c_wait();
}
SDA_P=1; // ready to wait ack...
_nop_();
SCL_P=1;
i2c_wait();
ack=SDA_P;
SCL_P=0;
i2c_wait();
return ack;
}
//------------------------------
BYTE i2c_rx_byte(void)
{
BYTE i, RecvData=0x00;
SDA_P=1; // prevent i2c_tx_ack(FALSE)'s bug... 2003-08-19
for(i=0;i<8;i++)
{
SCL_P=1;
i2c_wait();
RecvData<<=1;
if(SDA_P)
RecvData|=0x01;
SCL_P=0;
i2c_wait();
}
return RecvData;
}
//------------------------------
// ack="0" / non-ack="1"
void i2c_tx_ack(BOOL ack)
{
SDA_P=ack;
SCL_P=1;
i2c_wait();
SCL_P=0;
}
//------------------------------
BYTE i2c_read_byte(BYTE slave_addr, BYTE reg_addr)
{
BYTE rc;
while(1)
{
i2c_start();
if(i2c_tx_byte(slave_addr))
{
i2c_stop();
continue;
}
if(i2c_tx_byte(reg_addr))
{
i2c_stop();
continue;
}
i2c_start();
if(!i2c_tx_byte(slave_addr|0x01))
break;
i2c_stop();
}
rc=i2c_rx_byte();
i2c_tx_ack(TRUE);
i2c_stop();
return rc;
}
//------------------------------
void i2c_write_byte(BYTE slave_addr, BYTE reg_addr, BYTE val)
{
while(1)
{
i2c_start();
if(i2c_tx_byte(slave_addr))
{
i2c_stop();
continue;
}
if(i2c_tx_byte(reg_addr))
{
i2c_stop();
continue;
}
if(i2c_tx_byte(val))
{
i2c_stop();
continue;
}
i2c_stop();
break;
}
}
//------------------------------
WORD i2c_read_word(BYTE slave_addr, BYTE reg_addr)
{
WORD rc=0xFFFF;
while(1)
{
i2c_start();
if(i2c_tx_byte(slave_addr))
{
i2c_stop();
continue;
}
if(i2c_tx_byte(reg_addr))
{
i2c_stop();
continue;
}
i2c_start();
if(i2c_tx_byte(slave_addr+1))
{
i2c_stop();
continue;
}
rc=i2c_rx_byte()*256; // high byte
i2c_tx_ack(FALSE);
rc|=i2c_rx_byte(); // low byte
i2c_tx_ack(TRUE);
i2c_stop();
break;
}
return rc;
}
//------------------------------
void i2c_write_word(BYTE slave_addr, BYTE reg_addr, WORD val)
{
while(1)
{
i2c_start();
if(i2c_tx_byte(slave_addr))
{
i2c_stop();
continue;
}
if(i2c_tx_byte(reg_addr))
{
i2c_stop();
continue;
}
if(i2c_tx_byte(val>>8)) // high byte
{
i2c_stop();
continue;
}
if(i2c_tx_byte(val)) // low byte
{
i2c_stop();
continue;
}
i2c_stop();
break;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -