Files
ETH_TCP_Demo/drivers/hal/stm32f4_hal_i2c.c
2026-03-09 15:34:18 +08:00

144 lines
3.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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