STM32硬件IIC实验(STM32CubeMx配置)

原理了解

IIC:Inter Integrated Circuit,集成电路总线,是一种同步 串行 半双工通信总线。
在这里贴一下硬件IIC和软件IIC的区别:
在这里插入图片描述
从图中可以看出两者的区别,硬件IIC比软件IIC的用法会比较复杂,但是这里如果不关注底层的实现去使用STM32CubeMx进行IIC的配置,再使用特定函数就能够实现IIC通讯,实际这个过程是非常简单,若想了解软件IIC的实现也可以参考我的另一篇文章:
软件模拟实现IIC
那么接下来看看如何使用STM32CubeMx配置IIC并使用

STM32CubeMx配置

首先根据硬件原理图:
在这里插入图片描述
在这里插入图片描述
EEPROM是连接在了PB6和PB7两个端口上,而PB6和PB7正好为硬件的IIC接口,所以就直接选用这两个口作为我们的IIC接口,STM32CubeMx配置如下:
在这里插入图片描述
打开I2C功能,发现下面的PB6和PB7就会自动配置为我们的SCL和SDA引脚,其余设置我们就不用进行修改了,保持默认即可:
在这里插入图片描述
接着就是打开串口通讯功能,通过串口进行函数的功能验证,剩下的配置就是配置时钟源,选择debug调试的接线方式以及配置外部晶振即可,接着就可以生成工程了。

工程生成及代码编写

工程生成

工程生成之后,可以看到左边已经有了相关的代码:
在这里插入图片描述
打开i2c.c可以看到
在这里插入图片描述
里面已经配置好了IIC的模式以及对应IO口的配置、使能相关时钟。在使用硬件IIC的过程中比较重要的函数如下:
在这里插入图片描述
可以看到里面包含了普通模式、中断模式、DMA模式下的函数,功能都是基本一样的,只是用在不同模式而已,而在这里介绍本实验用到的两个函数:

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);

这两个函数就是需要用到的写入和读取函数,先来分别看看对应的参数都是什么意思:

  1. I2C_HandleTypeDef *hi2c:句柄,即iic.c文件中开头定义的结构体 “I2C_HandleTypeDef hi2c1;”
  2. uint16_t DevAddress:从设备的通讯地址,比方要写入数据时,则为0xA0
  3. uint16_t MemAddress:内部寄存器地址(要写入或读取的地址) uint16_t
  4. MemAddSize:内部寄存器地址的大小,8/16位,即规定写入或读取的字节类型为8或16位
    4.1可在stm32f1xx_hal_i2c.h中找到相关定义:
/** @defgroup I2C_Memory_Address_Size I2C Memory Address Size
 * @{
  */
#define I2C_MEMADD_SIZE_8BIT            0x00000001U
#define I2C_MEMADD_SIZE_16BIT           0x00000010U
/**
 * @}
  */
  1. uint8_t *pData: 要写入或读取的数据的起始地址
  2. uint16_t Size:写入或读取的数据类型大小,单位:字节
  3. uint32_t Timeout:超时时间

代码编写

了解完以上内容后就可以开始编写实验的代码了,这里在iic.c文件的USER CODE BEGIN 1中开始添加实现IIC通讯的代码:

/* USER CODE BEGIN 1 */
#define AT24C02_Write_ADD 0xA0
#define AT24C02_Read_ADD 0xA1
uint8_t I2C_Write_Buffer[256];
uint8_t I2C_Read_Buffer[256];

void AT24C02Test(void)
{
    int i;
    printf("\r\n **********STM32CubeMx IIC Test********** \r\n");
    printf("\r\n I2C_Write_Buffer: \r\n");
    
    /* 生成256byte数据 */
    for(i = 0; i < 256; i++)
    {
        I2C_Write_Buffer[i] = i;
        printf("%02X ", I2C_Write_Buffer[i]);
    }
    
    /* Write Data To AT24C02 */
    for(i = 0; i < 256; i= i+8)
    {
        if(HAL_I2C_Mem_Write(&hi2c1, AT24C02_Write_ADD, i, I2C_MEMADD_SIZE_8BIT, &(I2C_Write_Buffer[i]), 8, 1000) == HAL_OK)
        {
            printf("\r\n Byte %02d to Byte %02d Write OK \r\n", i, i+8);
            HAL_Delay(5);
        }
        else
        {
            printf("\r\n Byte %02d to Byte %02d Write Failed \r\n", i, i+8);
        }
    }
    
    /* Read Data To AT24C02 */
    printf("\r\n Read from AT24C02 \r\n");
    HAL_I2C_Mem_Read(&hi2c1, AT24C02_Read_ADD, 0, I2C_MEMADD_SIZE_8BIT, I2C_Read_Buffer, 256, 1000);
    
    for(i = 0; i < 256; i++)
    {
        printf("0x%02X  ", I2C_Read_Buffer[i]);
    }
}

/* USER CODE END 1 */

在这里调用HAL_I2C_Mem_Write()函数的过程中需要注意,由于硬件使用的是AT24C02,在其手册中说明了EEPROM完整写入的时间需要等待5ms,所以这里需要添加一个延时函数以保证数据成功写入EEPROM,若实验未成功也可适当将延时函数延长为10ms。

接着在main.c中调用我们的功能函数即可:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
    printf("sys run\r\n");
    AT24C02Test();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

实现效果

在这里插入图片描述
可以看到已经实现了实验所需的功能,那么在该实验中可以看出,使用STM32CubeMx配置好硬件IIC只需调用库中提供的函数就能轻松实现IIC通讯功能,而用户则可以更加专注于自己想要实现的功能,实际上也是方便很多。至此,硬件IIC实验就完成了,也欢迎大家有问题可以指出,一起讨论一下,谢谢!

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STM32Cube是一款用于开发和编程STM32微控制器的综合软件平台,其中包含一系列的软件库和工具。在STM32Cube中,可以方便地使用I2C(Inter-Integrated Circuit)总线进行设备间的通信。 I2C总线是一种串行通信协议,常用于短距离的内部通信,特别适合连接多个芯片。在STM32Cube中,可以通过配置I2C控制器来实现对外设(如传感器、存储器等)的读写操作。 使用STM32Cube进行I2C编程的步骤通常如下: 1. 配置GPIO引脚:首先,需要使用CubeMX工具配置STM32微控制器的GPIO引脚,将其设置为I2C功能,以便与外设进行通信。 2. 配置I2C控制器:在CubeMX工具中,可以选择I2C控制器,并设置其工作模式、时钟频率、地址等参数。 3. 生成代码:在完成GPIO和I2C控制器的配置后,可以通过CubeMX工具生成相应的初始化代码,以便在开发环境中使用。 4. 编写应用程序:使用生成的代码作为基础,可以在开发环境中编写应用程序,实现对I2C外设的读写操作。在应用程序中,可以使用STM32提供的相关库函数,如I2C读写数据等。 需要注意的是,使用STM32Cube进行I2C编程时,开发者需要了解I2C总线的工作原理和协议规范,以及相关外设的通信方式和寄存器配置。在编程过程中,还需注意时序的控制和错误处理。 综上所述,STM32Cube可以方便地进行I2C编程,通过配置GPIO和I2C控制器,生成相应的初始化代码,并编写应用程序实现对I2C外设的读写操作。这样可以快速开发出基于I2C通信的STM32应用程序。 ### 回答2: STM32Cube是STMicroelectronics(ST)推出的一种软件开发工具,用于支持STM32系列微控制器。IIC是一种串行通信协议,也被称为I2C。在STM32Cube中,IIC功能可以通过库函数进行配置和使用。 要使用STM32Cube中的IIC功能,首先需要在代码中包含相关库文件,并初始化IIC引脚。接下来,可以使用库函数来配置IIC的工作模式、速率和地址等参数。 配置完成后,可以使用IIC库函数来发送和接收数据。发送数据时,需要指定要发送的数据以及目标设备的地址。接收数据时,需要提供一个缓冲区来存储接收到的数据。可以使用轮询方式或中断方式来进行数据传输。 使用STM32CubeIIC功能还可以支持其他高级特性,例如多主模式、主机轮询模式和DMA传输模式等。这些特性可以根据具体应用需求进行配置和使用。 总之,STM32Cube提供了便利的开发环境和强大的功能库,可以简化STM32微控制器的开发过程。对于IIC通信问题,可以通过学习相关文档和实例代码来理解和解决。 ### 回答3: STM32Cube是一个软件开发平台,用于开发基于STMicroelectronics的STM32系列微控制器的应用程序。在STM32Cube中,有一种称为I2C(Inter-Integrated Circuit)的通信协议,也被称为IIC(Inter-Integrated Circuit)。下面是关于STM32CubeIIC问题的回答: IIC是一种串行通信协议,常用于连接多个芯片或器件。在STM32Cube中,IIC通过两根线(SDA和SCL)进行双向通信。SDA线用于数据传输,SCL线用于时钟同步。STM32Cube提供了一套库函数,用于在STM32微控制器上进行IIC通信。 在使用STM32CubeIIC功能时,首先需要配置相关的引脚为IIC模式,并初始化IIC外设。可以通过STM32CubeMX工具生成相应的初始化代码。然后,可以使用库函数来发送和接收数据。例如,使用函数HAL_I2C_Master_Transmit可以向从设备发送数据,函数HAL_I2C_Master_Receive可以从从设备读取数据。这些函数可以设置数据的长度、超时时间和其他参数。 在使用STM32CubeIIC功能时,需要注意以下几点: 1. 配置正确的引脚和外设时钟。 2. 确保主设备和从设备的地址设置正确。 3. 设置正确的数据长度、超时时间和其他参数。 4. 注意处理错误和中断。 总之,STM32Cube提供了强大的工具和库函数,使得在STM32微控制器上进行IIC通信变得更加简单和方便。通过合理配置和使用库函数,可以轻松实现各种IIC通信需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛叶灬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值