driver/gp8302.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);
}