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.

165 lines
3.9 KiB

1 year ago
#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);
}