📄 bfiic.c
字号:
#include <cdefBF561.h>
#include <ccblkfn.h>
#include <sysreg.h>
#include "BFIIC.h"
void Bf_Iic_Init(void)
{
*pFIO0_DIR |= BF_IIC_SCL | BF_IIC_SDA;
*pFIO0_FLAG_S = BF_IIC_SCL | BF_IIC_SDA;
}
void Bf_Iic_Delay(int value)
{
while (value--);
}
void Bf_Iic_Generate_Start(void)
{
*pFIO0_FLAG_S = BF_IIC_SDA;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_S = BF_IIC_SCL;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_C = BF_IIC_SDA;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_C = BF_IIC_SCL;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
}
void Bf_Iic_Send(int data, int length)
{
int data_mask;
if (length > 0 && length < 16)
{
data_mask = 0x0001;
data_mask <<= length - 1;
while (length--)
{
if (data & data_mask)
*pFIO0_FLAG_S = BF_IIC_SDA;
else
*pFIO0_FLAG_C = BF_IIC_SDA;
data <<= 1;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_S = BF_IIC_SCL;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_C = BF_IIC_SCL;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
}
}
}
int Bf_Iic_Read_Ack(void)
{
int ack;
*pFIO0_DIR &= ~BF_IIC_SDA;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_S = BF_IIC_SCL;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
ack = *pFIO0_FLAG_D & BF_IIC_SDA;
*pFIO0_FLAG_C = BF_IIC_SCL;
*pFIO0_DIR |= BF_IIC_SDA;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
return(ack);
}
int Bf_Iic_Receive(int length)
{
int data = 0;
if (length > 0 && length < 16)
{
*pFIO0_DIR &= ~BF_IIC_SDA;
*pFIO0_INEN |= BF_IIC_SDA;
while (length--)
{
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_S = BF_IIC_SCL;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
data <<= 1;
if (*pFIO0_FLAG_D & BF_IIC_SDA)
data |= 0x0001;
else
data &= 0xfffe;
*pFIO0_FLAG_C = BF_IIC_SCL;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
}
*pFIO0_INEN &= ~BF_IIC_SDA;
*pFIO0_DIR |= BF_IIC_SDA;
}
return(data);
}
void Bf_Iic_Generate_Ack(int ack_type)
{
if (ack_type)
*pFIO0_FLAG_S = BF_IIC_SDA;
else
*pFIO0_FLAG_C = BF_IIC_SDA;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_S = BF_IIC_SCL;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_C = BF_IIC_SCL;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
}
void Bf_Iic_Generate_Stop(void)
{
*pFIO0_FLAG_C = BF_IIC_SDA;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_S = BF_IIC_SCL;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
*pFIO0_FLAG_S = BF_IIC_SDA;
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
}
void Bf_Iic_V2w_Write(char dev_id, int address, char data)
{
Bf_Iic_Delay(BF_IIC_DEF_DELAY);
Bf_Iic_Generate_Start();
Bf_Iic_Send(dev_id & 0xfe, 0x08);
Bf_Iic_Read_Ack();
Bf_Iic_Send(address >> 8, 0x08);
Bf_Iic_Read_Ack();
Bf_Iic_Send(address & 0x00ff, 0x08);
Bf_Iic_Read_Ack();
Bf_Iic_Send(data, 0x08);
Bf_Iic_Read_Ack();
Bf_Iic_Generate_Stop();
}
char Bf_Iic_V2w_Read(char dev_id, int address)
{
char result;
Bf_Iic_Generate_Start();
Bf_Iic_Send(dev_id & 0xfe, 0x08);
Bf_Iic_Read_Ack();
Bf_Iic_Send((address >> 8), 0x08);
Bf_Iic_Read_Ack();
Bf_Iic_Send(address & 0x00ff, 0x08);
Bf_Iic_Read_Ack();
Bf_Iic_Generate_Start();
Bf_Iic_Send(dev_id | 0x01, 0x08);
Bf_Iic_Read_Ack();
result = Bf_Iic_Receive(0x08);
Bf_Iic_Generate_Ack(0);
Bf_Iic_Generate_Stop();
return(result);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -