You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
3.9 KiB
164 lines
3.9 KiB
#include "bsp_iic3.h"
|
|
///#include "gplib.h"
|
|
|
|
#define SC7A20_SLAVE_ID 0x32//0x4E ,erichan 20150529
|
|
|
|
#define G_SlaveAddr SC7A20_SLAVE_ID
|
|
static INT8U g_level;
|
|
|
|
static OS_EVENT *sw_i2c_sem = NULL;
|
|
|
|
static INT8U G_sensor_status=0;
|
|
|
|
//====================================================================================================
|
|
void I2C_delay (
|
|
INT16U i
|
|
) {
|
|
INT16U j;
|
|
|
|
for (j=0;j<(i<<8);j++)
|
|
i=i;
|
|
}
|
|
|
|
void g_delay(INT16U i)
|
|
{
|
|
INT16U k;
|
|
|
|
for(k=0;k<i;k++)
|
|
I2C_delay(100);
|
|
}
|
|
|
|
|
|
//============================================
|
|
void I2C_start (void)
|
|
{
|
|
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
|
|
I2C_delay (1);
|
|
gpio_write_io(I2C_SDA, DATA_HIGH); //SDA1
|
|
I2C_delay (1);
|
|
gpio_write_io(I2C_SDA, DATA_LOW); //SDA0
|
|
I2C_delay (1);
|
|
}
|
|
//===================================================================
|
|
void I2C_stop (void)
|
|
{
|
|
I2C_delay (1);
|
|
gpio_write_io(I2C_SDA, DATA_LOW); //SDA0
|
|
I2C_delay (1);
|
|
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
|
|
I2C_delay (1);
|
|
gpio_write_io(I2C_SDA, DATA_HIGH); //SDA1
|
|
I2C_delay (1);
|
|
}
|
|
|
|
|
|
//===================================================================
|
|
void I2C_w_phase (INT16U value)
|
|
{
|
|
INT16U i;
|
|
|
|
for (i=0;i<8;i++)
|
|
{
|
|
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
|
|
I2C_delay (1);
|
|
if (value & 0x80)
|
|
gpio_write_io(I2C_SDA, DATA_HIGH); //SDA1
|
|
else
|
|
gpio_write_io(I2C_SDA, DATA_LOW); //SDA0
|
|
// sccb_delay (1);
|
|
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
|
|
I2C_delay(1);
|
|
value <<= 1;
|
|
}
|
|
// The 9th bit transmission
|
|
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
|
|
gpio_init_io(I2C_SDA, GPIO_INPUT); //SDA is Hi-Z mode
|
|
I2C_delay(1);
|
|
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
|
|
I2C_delay(1);
|
|
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
|
|
gpio_init_io(I2C_SDA, GPIO_OUTPUT); //SDA is Hi-Z mode
|
|
}
|
|
|
|
//===================================================================
|
|
INT16U I2C_r_phase (void)
|
|
{
|
|
INT16U i;
|
|
INT16U data;
|
|
|
|
gpio_init_io(I2C_SDA, GPIO_INPUT); //SDA is Hi-Z mode
|
|
data = 0x00;
|
|
for (i=0;i<8;i++)
|
|
{
|
|
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
|
|
I2C_delay(1);
|
|
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
|
|
data <<= 1;
|
|
data |=( gpio_read_io(I2C_SDA));
|
|
I2C_delay(1);
|
|
}
|
|
// The 9th bit transmission
|
|
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
|
|
gpio_init_io(I2C_SDA, GPIO_OUTPUT); //SDA is output mode
|
|
gpio_write_io(I2C_SDA, DATA_HIGH); //SDA0, the nighth bit is NA must be 1
|
|
I2C_delay(1);
|
|
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
|
|
I2C_delay(1);
|
|
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
|
|
return data;
|
|
}
|
|
|
|
//====================================================================================================
|
|
void I2C_gpio_init (
|
|
INT32U nSCL, // Clock Port No
|
|
INT32U nSDA // Data Port No
|
|
){
|
|
//init IO
|
|
gpio_set_port_attribute(nSCL, ATTRIBUTE_HIGH);
|
|
gpio_set_port_attribute(nSDA, ATTRIBUTE_HIGH);
|
|
gpio_init_io(nSCL, GPIO_OUTPUT); //set dir
|
|
gpio_init_io(nSDA, GPIO_OUTPUT); //set dir
|
|
gpio_write_io(nSCL, DATA_HIGH); //SCL1
|
|
gpio_write_io(nSDA, DATA_HIGH); //SDA0
|
|
}
|
|
|
|
|
|
|
|
void g_sensor_write(INT8U id, INT8U addr, INT8U data)
|
|
{
|
|
// 3-Phase write transmission cycle is starting now ...
|
|
I2C_start(); // Transmission start
|
|
I2C_w_phase(id); // Phase 1: Device ID
|
|
I2C_w_phase(addr); // Phase 2: Register address. High pass filter enable
|
|
I2C_w_phase(data); // Phase 3: Data value
|
|
I2C_stop(); // Transmission stop
|
|
}
|
|
|
|
INT16U g_sensor_read(INT8U id, INT8U addr)
|
|
{
|
|
INT16U redata;
|
|
|
|
I2C_start(); // Transmission start
|
|
I2C_w_phase(id); // Phase 1: Device ID
|
|
I2C_w_phase(addr); // Phase 2: Register address. Transient source
|
|
I2C_start(); // Transmission start
|
|
I2C_w_phase(id | 0x01); // Phase 1 (read)
|
|
redata = (INT8U) I2C_r_phase(); // Phase 2
|
|
I2C_stop(); // Transmission stop
|
|
|
|
return redata;
|
|
}
|
|
|
|
void sw_i2c_lock(void)
|
|
{
|
|
INT8U err;
|
|
|
|
OSSemPend(sw_i2c_sem, 0, &err);
|
|
}
|
|
|
|
void sw_i2c_unlock(void)
|
|
{
|
|
OSSemPost(sw_i2c_sem);
|
|
}
|
|
|
|
|
|
|