/*---------------------------------------------------------------------------- * 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); } }