144 lines
3.8 KiB
C
144 lines
3.8 KiB
C
/*
|
||
* STM32F4 I2C硬件抽象层实现
|
||
* 功能:实现STM32F4平台的I2C硬件抽象层
|
||
* 依赖硬件:STM32F407VE
|
||
* 跨平台适配点:通过硬件抽象层接口适配不同平台
|
||
*/
|
||
|
||
#include "hal.h"
|
||
#include "stm32f4xx_hal.h"
|
||
|
||
/* I2C句柄 */
|
||
static I2C_HandleTypeDef hi2c1;
|
||
|
||
/**
|
||
* @brief I2C初始化
|
||
* @param clock_speed: 时钟速度
|
||
* @return hal_status_t: 操作结果
|
||
* @note 初始化I2C硬件
|
||
*/
|
||
static hal_status_t stm32f4_i2c_init(hal_i2c_clock_speed_t clock_speed)
|
||
{
|
||
hi2c1.Instance = I2C1;
|
||
hi2c1.Init.ClockSpeed = clock_speed;
|
||
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
|
||
hi2c1.Init.OwnAddress1 = 0;
|
||
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
||
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
|
||
hi2c1.Init.OwnAddress2 = 0;
|
||
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
|
||
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
|
||
|
||
if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
|
||
return HAL_STATUS_ERROR;
|
||
}
|
||
|
||
return HAL_STATUS_OK;
|
||
}
|
||
|
||
/**
|
||
* @brief I2C反初始化
|
||
* @return hal_status_t: 操作结果
|
||
* @note 反初始化I2C硬件
|
||
*/
|
||
static hal_status_t stm32f4_i2c_deinit(void)
|
||
{
|
||
if (HAL_I2C_DeInit(&hi2c1) != HAL_OK) {
|
||
return HAL_STATUS_ERROR;
|
||
}
|
||
|
||
return HAL_STATUS_OK;
|
||
}
|
||
|
||
/**
|
||
* @brief I2C主模式发送数据
|
||
* @param dev_addr: 设备地址
|
||
* @param data: 数据指针
|
||
* @param len: 数据长度
|
||
* @param timeout: 超时时间
|
||
* @return hal_status_t: 操作结果
|
||
* @note 发送数据,使用阻塞方式
|
||
*/
|
||
static hal_status_t stm32f4_i2c_master_transmit(uint16_t dev_addr, const uint8_t *data, uint32_t len, uint32_t timeout)
|
||
{
|
||
if (HAL_I2C_Master_Transmit(&hi2c1, dev_addr, (uint8_t *)data, len, timeout) != HAL_OK) {
|
||
return HAL_STATUS_ERROR;
|
||
}
|
||
|
||
return HAL_STATUS_OK;
|
||
}
|
||
|
||
/**
|
||
* @brief I2C主模式接收数据
|
||
* @param dev_addr: 设备地址
|
||
* @param data: 数据指针
|
||
* @param len: 数据长度
|
||
* @param timeout: 超时时间
|
||
* @return hal_status_t: 操作结果
|
||
* @note 接收数据,使用阻塞方式
|
||
*/
|
||
static hal_status_t stm32f4_i2c_master_receive(uint16_t dev_addr, uint8_t *data, uint32_t len, uint32_t timeout)
|
||
{
|
||
if (HAL_I2C_Master_Receive(&hi2c1, dev_addr, data, len, timeout) != HAL_OK) {
|
||
return HAL_STATUS_ERROR;
|
||
}
|
||
|
||
return HAL_STATUS_OK;
|
||
}
|
||
|
||
/* I2C硬件抽象层操作结构体 */
|
||
const hal_i2c_ops_t stm32f4_i2c_ops = {
|
||
.init = stm32f4_i2c_init,
|
||
.deinit = stm32f4_i2c_deinit,
|
||
.master_transmit = stm32f4_i2c_master_transmit,
|
||
.master_receive = stm32f4_i2c_master_receive
|
||
};
|
||
|
||
/**
|
||
* @brief I2C MSP初始化
|
||
* @param i2cHandle: I2C句柄
|
||
* @return 无
|
||
* @note 初始化I2C的MSP
|
||
*/
|
||
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||
if(i2cHandle->Instance==I2C1)
|
||
{
|
||
/* I2C1 clock enable */
|
||
__HAL_RCC_I2C1_CLK_ENABLE();
|
||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||
|
||
/**I2C1 GPIO Configuration
|
||
PB6 ------> I2C1_SCL
|
||
PB7 ------> I2C1_SDA
|
||
*/
|
||
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
|
||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief I2C MSP反初始化
|
||
* @param i2cHandle: I2C句柄
|
||
* @return 无
|
||
* @note 反初始化I2C的MSP
|
||
*/
|
||
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
|
||
{
|
||
if(i2cHandle->Instance==I2C1)
|
||
{
|
||
/* Peripheral clock disable */
|
||
__HAL_RCC_I2C1_CLK_DISABLE();
|
||
|
||
/**I2C1 GPIO Configuration
|
||
PB6 ------> I2C1_SCL
|
||
PB7 ------> I2C1_SDA
|
||
*/
|
||
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
|
||
}
|
||
} |