20230731_XiaoFuZi_emb/ZheDaXiaoFuZiBoot/Src/Usr/Bsp/McuBspI2c.c
Rjh913828050 a8560d741e 类型:重构
内容:重新整理项目文件分类
人员:任家豪
2023-10-08 16:10:23 +08:00

196 lines
6.8 KiB
C
Raw 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.

#include "McuBspI2c.h"
#define MCU_BSP_I2C_DISABLE 0
#define MCU_BSP_I2C_ENABLE 1
I2C_HandleTypeDef I2cHandle2; // 使用了IIC2作为BME680的数据处理
uint8_t I2C2InitFlag = MCU_BSP_I2C_DISABLE; // 防止挂载多个设备时,重复初始化
int McuBspI2cInit(unsigned char I2cId)
{
if (I2cId == MCU_BSP_I2C2_ID){
if (MCU_BSP_I2C2_USE_FLAG == MCU_BSP_I2C_DISABLE) {
return -1;
}
if (I2C2InitFlag == MCU_BSP_I2C_ENABLE) {
return 0;
}
I2cHandle2.Instance = I2C2;
I2cHandle2.Init.ClockSpeed = MCU_BSP_I2C2_CLOCKSPEED;
I2cHandle2.Init.DutyCycle = MCU_BSP_I2C2_DUTYCYCLE;
I2cHandle2.Init.OwnAddress1 = MCU_BSP_I2C2_I2C_ADDRESS1;
I2cHandle2.Init.AddressingMode = MCU_BSP_I2C2_ADDRESS_MODE;
I2cHandle2.Init.DualAddressMode = MCU_BSP_I2C2_DUALADDRESS_MODE;
I2cHandle2.Init.OwnAddress2 = MCU_BSP_I2C2_I2C_ADDRESS2;
I2cHandle2.Init.GeneralCallMode = MCU_BSP_I2C2_GENERALCALL_MODE;
I2cHandle2.Init.NoStretchMode = MCU_BSP_I2C2_NOSTRETCH_MODE;
HAL_I2C_DeInit(&I2cHandle2);
if(HAL_I2C_Init(&I2cHandle2) != HAL_OK) {
return -1;
}
I2C2InitFlag = MCU_BSP_I2C_ENABLE;
} else {
return -1;
}
return 0;
}
int McuBspI2cSendData(unsigned char type, unsigned char I2cId, unsigned short DevAddress, unsigned short MemAddress,
unsigned short MemAddSize, unsigned char *pData, unsigned short Size)
{
if (type == MCU_BSP_I2C_MASTER) {
if(I2cId == MCU_BSP_I2C2_ID) {
if (MCU_BSP_I2C2_USE_FLAG == MCU_BSP_I2C_DISABLE) {
return -1;
}
if (HAL_OK != HAL_I2C_Master_Transmit(&I2cHandle2, DevAddress, pData, Size, 300)) {
return -1;
}
} else {
return -1;
}
} else if (type == MCU_BSP_I2C_SALVE) {
if(I2cId == MCU_BSP_I2C2_ID) {
if (MCU_BSP_I2C2_USE_FLAG == MCU_BSP_I2C_DISABLE) {
return -1;
}
if (HAL_OK != HAL_I2C_Slave_Transmit(&I2cHandle2, pData, Size, 300)) {
return -1;
}
} else {
return -1;
}
} else if (type == MCU_BSP_I2C_REG) {
if(I2cId == MCU_BSP_I2C2_ID) {
if (MCU_BSP_I2C2_USE_FLAG == MCU_BSP_I2C_DISABLE) {
return -1;
}
if (HAL_OK != HAL_I2C_Mem_Write(&I2cHandle2, DevAddress, MemAddress, MemAddSize, pData, Size, 300)) {
return -1;
}
} else {
return -1;
}
} else {
return -1;
}
return 0;
}
/* IIC接收函数 */
int McuBspI2cRecvData(uint8_t type, uint8_t I2cId, uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
{
if (type == MCU_BSP_I2C_MASTER) {
if(I2cId == MCU_BSP_I2C2_ID) {
if (MCU_BSP_I2C2_USE_FLAG == MCU_BSP_I2C_DISABLE) {
return -1;
}
if (HAL_OK != HAL_I2C_Master_Receive(&I2cHandle2, DevAddress, pData, Size, 300)) {
return -1;
}
} else {
return -1;
}
} else if (type == MCU_BSP_I2C_SALVE) {
if(I2cId == MCU_BSP_I2C2_ID) {
if (MCU_BSP_I2C2_USE_FLAG == MCU_BSP_I2C_DISABLE) {
return -1;
}
if (HAL_OK != HAL_I2C_Slave_Receive(&I2cHandle2, pData, Size, 300)) {
return -1;
}
} else {
return -1;
}
} else if (type == MCU_BSP_I2C_REG) {
if(I2cId == MCU_BSP_I2C2_ID) {
if (MCU_BSP_I2C2_USE_FLAG == MCU_BSP_I2C_DISABLE) {
return -1;
}
if (HAL_OK != HAL_I2C_Mem_Read(&I2cHandle2, DevAddress, MemAddress, MemAddSize, pData, Size, 300)) {
return -1;
}
} else {
return -1;
}
} else {
return -1;
}
return 0;
}
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{
GPIO_InitTypeDef GPIO_InitStruct;
if (hi2c->Instance == I2C2) {
MCU_BSP_I2C2_SCL_GPIO_CLK_ENABLE();
MCU_BSP_I2C2_SDA_GPIO_CLK_ENABLE();
__HAL_RCC_I2C2_CLK_ENABLE();
GPIO_InitStruct.Pin = MCU_BSP_I2C2_SCL_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(MCU_BSP_I2C2_SCL_GPIO, &GPIO_InitStruct);
GPIO_InitStruct.Pin = MCU_BSP_I2C2_SDA_GPIO_PIN;
HAL_GPIO_Init(MCU_BSP_I2C2_SDA_GPIO, &GPIO_InitStruct);
}
}
void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
{
if (hi2c->Instance == I2C2) {
__HAL_RCC_I2C2_FORCE_RESET();
__HAL_RCC_I2C2_RELEASE_RESET();
__HAL_RCC_I2C2_CLK_DISABLE();
I2C2InitFlag = MCU_BSP_I2C_DISABLE;
HAL_GPIO_DeInit(MCU_BSP_I2C2_SCL_GPIO, MCU_BSP_I2C2_SCL_GPIO_PIN);
HAL_GPIO_DeInit(MCU_BSP_I2C2_SDA_GPIO, MCU_BSP_I2C2_SDA_GPIO_PIN);
}
}
/* IIC SLEEP */
void McuBspI2cSleep(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* 由于IIC有上拉电阻所以本身就应该设置为上拉输出 */
if (MCU_BSP_I2C2_USE_FLAG == MCU_BSP_I2C_ENABLE) {
if (I2C2InitFlag == MCU_BSP_I2C_ENABLE) {
__HAL_RCC_I2C2_CLK_DISABLE();
MCU_BSP_I2C2_SCL_GPIO_CLK_ENABLE();
MCU_BSP_I2C2_SDA_GPIO_CLK_ENABLE();
GPIO_InitStruct.Pin = MCU_BSP_I2C2_SCL_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(MCU_BSP_I2C2_SCL_GPIO, &GPIO_InitStruct);
GPIO_InitStruct.Pin = MCU_BSP_I2C2_SDA_GPIO_PIN;
HAL_GPIO_Init(MCU_BSP_I2C2_SDA_GPIO, &GPIO_InitStruct);
HAL_GPIO_WritePin(MCU_BSP_I2C2_SCL_GPIO, MCU_BSP_I2C2_SCL_GPIO_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(MCU_BSP_I2C2_SDA_GPIO, MCU_BSP_I2C2_SDA_GPIO_PIN, GPIO_PIN_SET);
}
}
}
/* IIC WakeUp */
void McuBspI2cWakeUp(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
if (I2C2InitFlag == MCU_BSP_I2C_ENABLE) {
__HAL_RCC_I2C2_CLK_ENABLE();
MCU_BSP_I2C2_SCL_GPIO_CLK_ENABLE();
MCU_BSP_I2C2_SDA_GPIO_CLK_ENABLE();
GPIO_InitStruct.Pin = MCU_BSP_I2C2_SCL_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(MCU_BSP_I2C2_SCL_GPIO, &GPIO_InitStruct);
GPIO_InitStruct.Pin = MCU_BSP_I2C2_SDA_GPIO_PIN;
HAL_GPIO_Init(MCU_BSP_I2C2_SDA_GPIO, &GPIO_InitStruct);
}
}