mcu_hi3321_watch/tjd/driver/hr/hr_port.c
2025-05-26 20:15:20 +08:00

156 lines
4.5 KiB
C

/*----------------------------------------------------------------------------
* Copyright (c) TJD Technologies Co., Ltd. 2020. All rights reserved.
*
* Description: hr_port.c
*
* Author: liangjianfei
*
* Create: 2024-4-26
*--------------------------------------------------------------------------*/
#include "common_i2c.h"
#include "gpio.h"
#include "hr_port.h"
#include "sys_config.h"
#include "common_pm.h"
#include "tcxo.h"
#include "cmsis_os.h"
#include "pinctrl.h"
#define I2C_REPEAT_TIME 3
#define ENABLE_PRINT_INFO 1
#if ENABLE_PRINT_INFO
#define static_print_info(...) sys_hr_log_i(__VA_ARGS__) //一般信息打印宏控制
#define static_print_warn(...) sys_hr_log_w(__VA_ARGS__) //警告信息打印一般常开
#define static_print_error(...) sys_hr_log_e(__VA_ARGS__) //错误信息打印一般常开
#else
#define static_print_info(...)
#define static_print_warn(...)
#define static_print_error(...)
#endif
#ifdef TJD_PCBA_0
static i2c_bus_t hrsensor_bus = I2C_BUS_0;
static uint32_t hrsensor_baudrate = 100000;
static uint8_t hrsensor_hscode = 0;
static uint8_t hrsensor_addr = 0x44;
#elif defined(TJD_PCBA_1)
#define HR3695_I2C_ADDR 0x44
static i2c_bus_t hrsensor_bus = I2C_BUS_2;
static uint32_t hrsensor_baudrate = 400000;
static uint8_t hrsensor_addr = HR3695_I2C_ADDR;
#else
static i2c_bus_t hrsensor_bus = I2C_BUS_0;
static uint32_t hrsensor_baudrate = 100000;
static uint8_t hrsensor_hscode = 0;
static uint8_t hrsensor_addr = 0x44;
#endif
errcode_t hrsensor_iic_init(void)
{
errcode_t ret;
ret = tjd_driver_common_i2c_get_ops()->open(I2C_MODEL_HRSENSOR_ID, hrsensor_bus, hrsensor_addr, hrsensor_baudrate);
if (ret != ERRCODE_SUCC && ret != ERRCODE_I2C_ALREADY_INIT) {
static_print_error("hrsensor_iic_init fail. ret:%x", ret);
return ret;
} else {
static_print_info("hrsensor_iic_init succ. ret:%x", ret);
}
struct power_manager_class_ops *pm_api = tjd_driver_common_pm_get_ops();
pm_api->set_model_power_status(POWER_MODEL_HRSENSOR_ID, PM_POWER_STATUS_ON);
// ret = uapi_gpio_set_dir(S_AGPIO_R2, GPIO_DIRECTION_OUTPUT);
// if (ret != 0) {
// static_print_error("uapi_gpio_set_dir FAIL");
// }
// ret = uapi_gpio_set_val(S_AGPIO_R2, GPIO_LEVEL_LOW);
// if (ret != 0) {
// static_print_error("uapi_gpio_set_val FAIL");
// }
osDelay(30);
return ret;
}
errcode_t hrsensor_iic_deinit(void)
{
errcode_t ret;
ret = tjd_driver_common_i2c_get_ops()->close(I2C_MODEL_HRSENSOR_ID);
if (ret != ERRCODE_SUCC) {
static_print_error("hrsensor_iic_deinit fail. ret:%x", ret);
return ret;
} else {
static_print_info("hrsensor_iic_deinit succ.");
}
struct power_manager_class_ops *pm_api = tjd_driver_common_pm_get_ops();
pm_api->set_model_power_status(POWER_MODEL_HRSENSOR_ID, PM_POWER_STATUS_OFF);
osDelay(30);
return ret;
}
errcode_t hrsensor_iic_write_reg(uint8_t addr, uint8_t data)
{
errcode_t ret;
uint32_t retry;
i2c_data_t i2c_data = {0};
uint8_t sendbuf[] = {addr, data};
i2c_data.send_buf = sendbuf;
i2c_data.send_len = 2;
for (retry = 0; retry < I2C_REPEAT_TIME; retry++) {
ret = tjd_driver_common_i2c_get_ops()->write(I2C_MODEL_HRSENSOR_ID, &i2c_data);
if (ret == ERRCODE_SUCC) {
break;
}
}
if(ret != ERRCODE_SUCC){
static_print_info("hrsensor_write_reg fail:%x ", ret);
}
return ret;
}
errcode_t hrsensor_iic_read_reg(uint8_t addr, uint8_t *recvbuf, uint8_t length)
{
errcode_t ret;
uint32_t retry;
i2c_data_t i2c_data = {0};
uint8_t sendbuf[] = {addr};
i2c_data.receive_buf = recvbuf;
i2c_data.send_buf = sendbuf;
i2c_data.receive_len = length;
i2c_data.send_len = 1;
for (retry = 0; retry < I2C_REPEAT_TIME; retry++) {
ret = tjd_driver_common_i2c_get_ops()->writeread(I2C_MODEL_HRSENSOR_ID, &i2c_data);
if (ret == ERRCODE_SUCC) {
break;
}
}
if(ret != ERRCODE_SUCC){
static_print_info("hrsensor_read_reg fail:%x ", ret);
}
return ret;
}
void hrsensor_delay_us(uint32_t us)
{
uapi_tcxo_delay_us(us);
}
void hrsensor_delay_ms(uint32_t ms)
{
if(ms>20){
osDelay(ms);
}else{
uapi_tcxo_delay_ms(ms);
}
}