69 lines
1.9 KiB
C
69 lines
1.9 KiB
C
#include "gp8302.h"
|
|
|
|
#define I2C_GP8302_1_SCL_PORT I2C2_SCL_GPIO_Port
|
|
#define I2C_GP8302_1_SCL_PIN I2C2_SCL_Pin
|
|
#define I2C_GP8302_1_SDA_PORT I2C2_SDA_GPIO_Port
|
|
#define I2C_GP8302_1_PIN I2C2_SDA_Pin
|
|
#define I2C_GP8302_1_DETECTION_PORT ALARM1_GPIO_Port
|
|
#define I2C_GP8302_1_DETECTION_PIN ALARM1_Pin
|
|
|
|
#define I2C_GP8302_2_SCL_PORT I2C3_SCL_GPIO_Port
|
|
#define I2C_GP8302_2_SCL_PIN I2C3_SCL_Pin
|
|
#define I2C_GP8302_2_SDA_PORT I2C3_SDA_GPIO_Port
|
|
#define I2C_GP8302_2_PIN I2C3_SDA_Pin
|
|
#define I2C_GP8302_2_DETECTION_PORT ALARM2_GPIO_Port
|
|
#define I2C_GP8302_2_DETECTION_PIN ALARM2_Pin
|
|
|
|
static gp8302_t gp8302[GP8302_MAX];
|
|
|
|
void gp8302_init(void)
|
|
{
|
|
i2c_gpio_group_t gpios;
|
|
gpios.scl = gpio_create(I2C_GP8302_1_SCL_PORT, I2C_GP8302_1_SCL_PIN);
|
|
gpios.sda = gpio_create(I2C_GP8302_1_SDA_PORT, I2C_GP8302_1_PIN);
|
|
gp8302[GP8302_1].i2c = i2c_create(gpios, 0);
|
|
|
|
gpios.scl = gpio_create(I2C_GP8302_2_SCL_PORT, I2C_GP8302_2_SCL_PIN);
|
|
gpios.sda = gpio_create(I2C_GP8302_2_SDA_PORT, I2C_GP8302_2_PIN);
|
|
gp8302[GP8302_2].i2c = i2c_create(gpios, 0);
|
|
}
|
|
|
|
BOOL gp8302_detection(void)
|
|
{
|
|
BOOL res = FALSE;
|
|
if (GPIO_READ(I2C_GP8302_1_DETECTION_PORT, I2C_GP8302_1_DETECTION_PIN) == 0)
|
|
{
|
|
res = TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (GPIO_READ(I2C_GP8302_2_DETECTION_PORT, I2C_GP8302_2_DETECTION_PIN) == 0)
|
|
{
|
|
res = TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
void gp8302_output(gp8302_number_e no, uint16_t pressure)
|
|
{
|
|
uint16_t hi = ((pressure >> 8) << 4) + ((uint8_t)pressure >> 4);
|
|
uint8_t lo = ((uint8_t)pressure) << 4;
|
|
pressure = (hi << 8) + lo;
|
|
i2c_t *p = gp8302[no].i2c;
|
|
p->interface.start(p);
|
|
p->interface.write_byte(p, 0xb0);
|
|
p->interface.wait_ack(p);
|
|
p->interface.write_byte(p, 2);
|
|
p->interface.wait_ack(p);
|
|
p->interface.write_word(p, pressure);
|
|
p->interface.wait_ack(p);
|
|
p->interface.stop(p);
|
|
}
|