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