/*******************************************************************************
* Copyright (C) 2021-2025, All Rights Reserved.
*
* File:        hal_i2c_master.h
* Description  hal i2c master模块接口头文件
* Version      V0.1
* Date         2023-07-27
* Author       swx
*******************************************************************************/
#ifndef __HAL_I2C_MASTER_H__
#define __HAL_I2C_MASTER_H__

/*******************************************************************************
* 1.Included files
*******************************************************************************/
#include "tau_device_datatype.h"
#include "tau_common.h"
#include "string.h"

/*******************************************************************************
* 2.Global constant and macro definitions using #define
*******************************************************************************/

/*******************************************************************************
* 3.Global structures, unions and enumerations using typedef
*******************************************************************************/

/*******************************************************************************
* 4.Global variable extern declarations
*******************************************************************************/

/*******************************************************************************
* 5.Global function prototypes
*******************************************************************************/
/**
* @brief  hal_i2cm_init
* @param  index: I2Cx index
* @param  slave_addr: 从机地址
* @param  addr_bits: 从机地址位数
* @param  i2c_m_speed_hz: 主机速率设置
* @retval none
*/
void hal_i2cm_init(i2c_index_e index, uint16_t slave_addr, uint8_t addr_bits, uint32_t i2cm_speed_hz);

/**
* @brief  hal_i2cm_deinit
* @param  index: I2Cx index
* @retval none
*/
void hal_i2cm_deinit(i2c_index_e index);

/**
* @brief  hal_i2cm_set_slave_addr
* @param  index: I2Cx index
* @param  slave_addr: 从机地址
* @param  addr_bits: 从机地址位数
* @retval none
*/
void hal_i2cm_set_slave_addr(i2c_index_e index, uint16_t slave_addr, uint8_t addr_bits);

/**
* @brief  i2c master 发送数据
* @param  index: I2Cx index
* @param  tx_buffer: 发送数据buffer
* @param  tx_size: 发送数据个数
* @retval true/false: 成功/失败
*/
bool hal_i2cm_write(i2c_index_e index, const uint8_t *tx_buffer, uint32_t tx_size);

/**
* @brief  i2c master 接收数据
* @param  index: I2Cx index
* @param  reg_address：寄存器地址
* @param  reg_size: 寄存器地址size
* @param  rx_buffer: 接收数据buffer
* @param  rx_size: 接收数据个数
* @retval true/false: 成功/失败
*/
bool hal_i2cm_read(i2c_index_e index, uint32_t reg_address, size_t reg_size, uint8_t *rx_buffer, size_t rx_size);

/**
* @brief  i2c master 多地址参数接收数据
* @param  index: I2Cx index
* @param  reg_address：寄存器地址
* @param  reg_size: 寄存器地址size
* @param  rx_buffer: 接收数据buffer
* @param  rx_size: 接收数据个数
* @retval true/false: 成功/失败
*/
bool hal_i2cm_multi_params_read(i2c_index_e index, uint8_t *reg_address, size_t reg_size, uint8_t *rx_buffer, size_t rx_size);

/**
* @brief  i2c master dma 发送数据
* @param  index: I2Cx index
* @param  tx_buffer: 发送数据buffer
* @param  tx_size: 发送数据个数
* @retval true: 数据已排入 DMA 通道，但不一定全部发送
*         false：发送出错，需要重新调用函数发送
*/
bool hal_i2cm_dma_write(i2c_index_e index, const uint8_t *tx_buffer, uint32_t tx_size);

/**
* @brief  i2c master dma 接收数据
* @param  index: I2Cx index
* @param  reg_address：寄存器地址
* @param  reg_size: 寄存器地址size
* @param  rx_buffer: 接收数据buffer
* @param  rx_size: 接收数据个数
* @retval true：寄存器地址发送成功，并已配置DMA接收通道，但不一定完成接收
*         false：接收出错，需要重新调用函数接收
*/
bool hal_i2cm_dma_read(i2c_index_e index, uint32_t reg_address, size_t reg_size, uint8_t *rx_buffer, size_t rx_size);

/**
* @brief  i2c master dma 多地址参数接收数据
* @param  index: I2Cx index
* @param  reg_address：寄存器地址
* @param  reg_size: 寄存器地址size
* @param  rx_buffer: 接收数据buffer
* @param  rx_size: 接收数据个数
* @retval true：寄存器地址发送成功，并已配置DMA接收通道，但不一定完成接收
*         false：接收出错，需要重新调用函数接收
*/
bool hal_i2cm_multi_params_dma_read(i2c_index_e index, uint8_t *reg_address, size_t reg_size, uint8_t *rx_buffer, size_t rx_size);

/**
* @brief  获取 i2c master 发送状态
* @param  index: I2Cx index
* @retval true/false
*/
bool hal_i2cm_get_transfer_complete(i2c_index_e index);

#endif /* __HAL_I2C_MASTER_H__*/

