⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bfiic.c

📁 此代码为ADSP系列 BF上实现IIC的C语言代码
💻 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 + -