📄 new_i2c.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 + -