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

📄 i2c.c

📁 此程序是在blackfin下实现的摄像头程序
💻 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 + -