150 lines
4.4 KiB
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;
|
|
}
|
|
}
|