RMUL2025/hw/bsp/atom/drivers/bsp_i2c.c

150 lines
4.4 KiB
C

#include "bsp_i2c.h"
#include "bsp_def.h"
#include "main.h"
#include "stm32g4xx_hal_i2c.h"
extern I2C_HandleTypeDef hi2c1;
static bsp_callback_t callback_list[BSP_I2C_NUM][BSP_I2C_CB_NUM];
static bsp_i2c_t i2c_get(I2C_HandleTypeDef *hi2c) {
if (hi2c->Instance == I2C1) {
return BSP_I2C_MAGN;
}
/*
else if (hi2c->Instance == I2CX)
return BSP_I2C_XXX;
*/
else {
return BSP_I2C_ERR;
}
}
static void bsp_i2c_callback(bsp_i2c_callback_t cb_type,
I2C_HandleTypeDef *hi2c) {
bsp_i2c_t bsp_i2c = i2c_get(hi2c);
if (bsp_i2c != BSP_I2C_ERR) {
bsp_callback_t cb = callback_list[bsp_i2c][cb_type];
if (cb.fn) {
cb.fn(cb.arg);
}
}
}
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) {
bsp_i2c_callback(BSP_I2C_RX_CPLT_CB, hi2c);
}
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) {
bsp_i2c_callback(BSP_I2C_TX_CPLT_CB, hi2c);
}
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) {
bsp_i2c_callback(BSP_I2C_RX_CPLT_CB, hi2c);
}
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) {
bsp_i2c_callback(BSP_I2C_TX_CPLT_CB, hi2c);
}
I2C_HandleTypeDef *bsp_i2c_get_handle(bsp_i2c_t i2c) {
switch (i2c) {
case BSP_I2C_MAGN:
return &hi2c1;
/*
case BSP_I2C_XXX:
return &hi2cX;
*/
default:
return NULL;
}
}
bsp_status_t bsp_i2c_register_callback(bsp_i2c_t i2c, bsp_i2c_callback_t type,
void (*callback)(void *),
void *callback_arg) {
assert_param(callback);
assert_param(type != BSP_I2C_CB_NUM);
callback_list[i2c][type].fn = callback;
callback_list[i2c][type].arg = callback_arg;
return BSP_OK;
}
bsp_status_t bsp_i2c_transmit(bsp_i2c_t i2c, uint8_t addr, uint8_t *data,
size_t size, bool block) {
if (block) {
return HAL_I2C_Master_Transmit(bsp_i2c_get_handle(i2c), addr << 1, data,
size, 10) == HAL_OK
? BSP_OK
: BSP_ERR;
} else {
return HAL_I2C_Master_Transmit_DMA(bsp_i2c_get_handle(i2c), addr << 1, data,
size) == HAL_OK
? BSP_OK
: BSP_ERR;
}
}
bsp_status_t bsp_i2c_receive(bsp_i2c_t i2c, uint8_t addr, uint8_t *buff,
size_t size, bool block) {
if (block) {
return HAL_I2C_Master_Receive(bsp_i2c_get_handle(i2c), addr << 1, buff,
size, 10) == HAL_OK
? BSP_OK
: BSP_ERR;
} else {
return HAL_I2C_Master_Receive_DMA(bsp_i2c_get_handle(i2c), addr << 1, buff,
size) == HAL_OK
? BSP_OK
: BSP_ERR;
}
}
uint8_t bsp_i2c_mem_read_byte(bsp_i2c_t i2c, uint8_t addr, uint8_t reg) {
uint8_t buff = 0;
HAL_I2C_Mem_Read(bsp_i2c_get_handle(i2c), addr << 1, reg,
I2C_MEMADD_SIZE_8BIT, &buff, 1, 10);
return buff;
}
bsp_status_t bsp_i2c_mem_write_byte(bsp_i2c_t i2c, uint8_t addr, uint8_t reg,
uint8_t data) {
return HAL_I2C_Mem_Write(bsp_i2c_get_handle(i2c), addr << 1, reg,
I2C_MEMADD_SIZE_8BIT, &data, 1, 10) == HAL_OK
? BSP_OK
: BSP_ERR;
}
bsp_status_t bsp_i2c_mem_read(bsp_i2c_t i2c, uint8_t addr, uint8_t reg,
uint8_t *data, size_t size, bool block) {
if (block) {
return HAL_I2C_Mem_Read(bsp_i2c_get_handle(i2c), addr << 1, reg,
I2C_MEMADD_SIZE_8BIT, data, size, 10) == HAL_OK
? BSP_OK
: BSP_ERR;
} else {
return HAL_I2C_Mem_Read_DMA(bsp_i2c_get_handle(i2c), addr << 1, reg,
I2C_MEMADD_SIZE_8BIT, data, size) == HAL_OK
? BSP_OK
: BSP_ERR;
}
}
bsp_status_t bsp_i2c_mem_write(bsp_i2c_t i2c, uint8_t addr, uint8_t reg,
uint8_t *buff, size_t size, bool block) {
if (block) {
return HAL_I2C_Mem_Write(bsp_i2c_get_handle(i2c), addr << 1, reg,
I2C_MEMADD_SIZE_8BIT, buff, size, 10) == HAL_OK
? BSP_OK
: BSP_ERR;
} else {
return HAL_I2C_Mem_Write_DMA(bsp_i2c_get_handle(i2c), addr << 1, reg,
I2C_MEMADD_SIZE_8BIT, buff, size) == HAL_OK
? BSP_OK
: BSP_ERR;
}
}