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

📄 new_i2c.c

📁 有关于USB的一些主机端驱动
💻 C
字号:
#include "omap30.h"
#include "omap1510.h"
#include "new_i2c.h"

static volatile unsigned char* pI2C_DEVICE_REG 			= (unsigned char*)0xFFFB3800;
static volatile unsigned char* pI2C_ADDRESS_REG 		= (unsigned char*)0xFFFB3804;
static volatile unsigned char* pI2C_DATA_WRITE_REG 		= (unsigned char*)0xFFFB3808;
static volatile unsigned char* pI2C_DATA_READ_REG 	    = (unsigned char*)0xFFFB380C;
static volatile unsigned char* pI2C_CMD_REG				= (unsigned char*)0xFFFB3810;
static volatile unsigned char* pI2C_CONF_FIFO_REG		= (unsigned char*)0xFFFB3814;
static volatile unsigned char* pI2C_CONF_CLK_REG	 	= (unsigned char*)0xFFFB3818;
static volatile unsigned char* pI2C_CONF_CLK_REF_REG 	= (unsigned char*)0xFFFB381C;
static volatile unsigned char* pI2C_STATUS_FIFO_REG		= (unsigned char*)0xFFFB3820;
static volatile unsigned char* pI2C_STATUS_ACTIVITY_REG = (unsigned char*)0xFFFB3824;

/*---------------------------------------------------------------------------*/
void InitI2c(void)
{
	//enable peripheral reset
	//* pARM_RSTCT2 |= 0x1;
	// *pARM_RSTCT2 |= PER_EN;
	
	//enable peripheral clock
	// *pARM_IDLECT2  |= EN_XORPC_CK;
	
	// disable clock for i2c interface core
	* pI2C_CMD_REG &= ~I2C_EN_CLK;
	 
	//  set divisor_2 = 9 for 100K/400KHz 
	* pI2C_CONF_CLK_REF_REG = 0x089; 
	
	//set speed to 100 and spike filter to 3
	* pI2C_CONF_CLK_REG = 0xD2;
	
	// enable clock for i2c interface core 
	* pI2C_CMD_REG |= I2C_EN_CLK;
	
	//reset fifo
	* pI2C_CMD_REG |= I2C_SOFT_REST ;
	* pI2C_CMD_REG &= ~I2C_SOFT_REST ;
	
	// set fifo to 1
	* pI2C_CONF_FIFO_REG = 0xF0;
}

/*---------------------------------------------------------------------------*/
char WriteI2c(unsigned char device, unsigned char subaddr, unsigned char data)
{
	//reset fifo
	* pI2C_CMD_REG |= I2C_SOFT_REST ;
	* pI2C_CMD_REG &= ~I2C_SOFT_REST ;
	
	// set fifo to 1
	* pI2C_CONF_FIFO_REG = 0xF0;
			
	/* Fill the FIFO */
	* pI2C_DATA_WRITE_REG = data;
	
	/* Set I2C Host Registers to write */
	* pI2C_CMD_REG &= ~I2C_RW;
	
	* pI2C_DEVICE_REG = device ;   
		
	* pI2C_ADDRESS_REG = subaddr;
	
	// wait until i2c is idle
	while(* pI2C_STATUS_ACTIVITY_REG & I2C_BUSY);
	{
		int i;
		for(i=0;i<100;i++);
	}
	
	// Start I2C Bus cycle now
	* pI2C_CMD_REG |= I2C_START;
	{
		int i;
		for(i=0;i<100;i++);
	}
		
	//wait until transmission is finished
	while(* pI2C_STATUS_ACTIVITY_REG & I2C_BUSY);
	{
		int i;
		for(i=0;i<100;i++);
	}
	
	// check for error device
	if (* pI2C_STATUS_ACTIVITY_REG & I2C_ERROR_DEVICE)
		return 1;
	
	// check for error data (sub address or data transmission)
	if (* pI2C_STATUS_ACTIVITY_REG & I2C_ERROR_DATA)
		return 1;
	
	//perform a simple read to validate the data
	
	//set i2c to read
	* pI2C_CMD_REG |= I2C_RW;
	
	//set i2c simple read.  
	* pI2C_CMD_REG &= ~I2C_COMB_READ;
	
	// wait until i2c is idle
	while(* pI2C_STATUS_ACTIVITY_REG & I2C_BUSY);
	{
		int i;
		for(i=0;i<100;i++);
	}
	
	// Start I2C Bus cycle now
	* pI2C_CMD_REG |= I2C_START ;
	
	//wait until transmission is finished
	while(* pI2C_STATUS_ACTIVITY_REG & I2C_BUSY);
	{
		int i;
		for(i=0;i<100;i++);
	}
	
	// check for error device
	if (* pI2C_STATUS_ACTIVITY_REG & I2C_ERROR_DEVICE)
		return 1;
	
	// check for error data (sub address or data transmission)
	if (* pI2C_STATUS_ACTIVITY_REG & I2C_ERROR_DATA)
		return 1;
	
	//verify that data read = data written
	//if (* pI2C_DATA_READ_REG != data)
	//	return 1;
	
	return 0;
}

/*---------------------------------------------------------------------------*/
char ReadI2c(unsigned char device, unsigned char subaddr, unsigned char * data)
{
	//reset fifo
	* pI2C_CMD_REG |= I2C_SOFT_REST ;
	* pI2C_CMD_REG &= ~I2C_SOFT_REST ;
	
	// set fifo to 1
	* pI2C_CONF_FIFO_REG = 0xF0;
			
	// Set I2C Host Registers to read 
	* pI2C_CMD_REG |= I2C_RW;
	
	//set i2c combined read.  
	* pI2C_CMD_REG |= I2C_COMB_READ;
	
	//set device id
	* pI2C_DEVICE_REG = device ;  
	
	//set subaddress to read
	* pI2C_ADDRESS_REG = subaddr;
	
	// wait until i2c is idle
	while(* pI2C_STATUS_ACTIVITY_REG & I2C_BUSY);
	
	// Start I2C Bus cycle now
	* pI2C_CMD_REG |= I2C_START ;
		
	//wait until transmission is finished
	while(* pI2C_STATUS_ACTIVITY_REG & I2C_BUSY);
	
	// check for error device
	if (* pI2C_STATUS_ACTIVITY_REG & I2C_ERROR_DEVICE)
		return 1;
	
	// check for error data (sub address or data transmission)
	if (* pI2C_STATUS_ACTIVITY_REG & I2C_ERROR_DATA)
		return 1;
	
	*data = *pI2C_DATA_READ_REG;
	return 0;
	
}

/*---------------------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -