📄 i2c.c
字号:
#include "bf5xx.h"
#include "types.h"
#include "I2C.h"
//------------------------------------------------------------------------------
// I2C 接口函数定义
//------------------------------------------------------------------------------
void Init(void);
void Start(void);
void Stop(void);
bool Write(uint8_t data_out);
bool Read(uint8_t *data_in, bool send_ack);
void SetSCLK(bool state);
void SetSDATA(bool state);
bool GetSDATA();
#define DELAY 0
//------------------------------------------------------------------------------
// I2C 设备地址
//------------------------------------------------------------------------------
uint8_t IdentAddr = 0xdc;
/****************************************************************************
* 名称 : delay
* 功能 : 延时函数
* 入口参数 :value 参数值越大延时的时间就长
* 出口参数 :无
****************************************************************************/
void delay(int value)
{
unsigned int i,j;
for (i=0; i<value; i++)
for (j=0; j<10; j++)
asm("nop;nop;");
}
/****************************************************************************
* 名称 : IICint
* 功能 : I2C 空闲函数 启动总线时先运行次函数
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void IICint()
{
SET_PF(SCL);
SET_PF(SDA);
delay(150);
delay(150);
}
/****************************************************************************
* 名称 : I2C_Write
* 功能 : I2C 写数据函数
* 入口参数 :address 为器件子地址 data_out_l 为数据值 在此为一字节写操作
* 出口参数 :无
****************************************************************************/
bool I2C_Write(uint8_t address,uint8_t data_out_l)
{
Start();
delay(300);
Write(IdentAddr);
delay(300);
Write(address);
delay(300);
//Write(data_out_h);
Write(data_out_l);
delay(300);
Stop();
delay(15000);
return true;
}
/****************************************************************************
* 名称 : I2C_Read
* 功能 : I2C 读数据函数
* 入口参数 :address 为器件子地址 data_out_l 为数据值 在此为一字节写操作
* 出口参数 :无
****************************************************************************/
bool I2C_Read(uint8_t address,uint8_t *data_in_l)
{
Start();
delay(300);
Write(IdentAddr);
delay(300);
Write(address);
delay(300);
Stop();
Start();
delay(300);
Write(IdentAddr+1);
delay(300);
//Read(data_in_h, true);
Read(data_in_l, false);
delay(15000);
Stop();
delay(150);
return true;
}
/****************************************************************************
* 名称 : INL Start
* 功能 : I2C 其始函数
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void INL Start(void)
{
delay(150);
SetSCLK(1);
delay(150);
SetSDATA(0);
delay(150);
SetSCLK(0);
delay(150);
}
/****************************************************************************
* 名称 : INL Stop
* 功能 : I2C 结束函数
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void INL Stop(void)
{
delay(150);
SetSDATA(0);
delay(150);
SetSCLK(1);
delay(150);
SetSDATA(1);
}
/****************************************************************************
* 名称 : INL Write
* 功能 : I2C 发送串行数据
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
bool INL Write(uint8_t data_out)
{
int index;
for(index = 0; index < 8; index++)
{
SetSDATA(((data_out & 0x80) ? 1 : 0));
data_out <<= 1;
SetSCLK(1);
delay(300);
SetSCLK(0);
}
delay(150);
SetSDATA(1);
delay(150);
SetSCLK(1);
if (!GetSDATA())
{
SetSCLK(0);
return true;
}
else
{
SetSCLK(0);
return false;
}
}
/****************************************************************************
* 名称 : INL Read
* 功能 : I2C 读串行数据
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
bool INL Read(uint8_t *data_in, bool send_ack)
{
int index;
*data_in = 0x00;
SetSDATA(1);
SetSCLK(0);
for(index = 0; index < 8; index++)
{
*data_in <<= 1;
SetSCLK(1);
*data_in |= GetSDATA();
*pFIO_INEN = 0;
*pFIO_FLAG_C = SDA;
*pFIO_INEN |= SDA;
delay(150);
SetSCLK(0);
}
if (send_ack)
SetSDATA(0);
else
SetSDATA(1);
SetSCLK(1);
SetSCLK(0);
SetSDATA(0);
SetSDATA(1);
return true;
}
/****************************************************************************
* 名称 :INL SetSDATA
* 功能 : 置位函数
* 入口参数 :state 为0或1 则 SDA 位为0或1
* 出口参数 :无
****************************************************************************/
void INL SetSDATA(bool state)
{
unsigned int i;
if (state)
{
*pFIO_DIR &= ~SDA;
}
else
{
*pFIO_INEN = 0x0;
*pFIO_FLAG_C = SDA;
*pFIO_DIR |= SDA;
*pFIO_FLAG_C = SDA;
*pFIO_INEN |= SDA;
}
for (i = 0; i < DELAY; i++)
{
asm("nop;");
}
}
/****************************************************************************
* 名称 :INL SetSCLK
* 功能 : 置位函数
* 入口参数 :state 为0或1 则 SCLK 位为0或1
* 出口参数 :无
****************************************************************************/
void INL SetSCLK(bool state)
{
unsigned int i;
if (state)
{
*pFIO_FLAG_D |= SCL; // Set SCLK high.
}
else
{
*pFIO_FLAG_D &= ~SCL; // Set SCLK low.
}
for(i = 0; i < DELAY; i++)
{
asm("nop;");
}
}
/****************************************************************************
* 名称 :INL GetSDATA
* 功能 : 读FLAG 寄存器
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
bool INL GetSDATA()
{
return ((*pFIO_FLAG_D & SDA) ? 1 : 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -