STM32硬件IIC实验(STM32CubeMx配置)

这篇具有很好参考价值的文章主要介绍了STM32硬件IIC实验(STM32CubeMx配置)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原理了解

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

STM32CubeMx配置

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

工程生成及代码编写

工程生成

工程生成之后,可以看到左边已经有了相关的代码:
stm32cubemx配置iic,STM32学习记录,stm32,嵌入式硬件,单片机
打开i2c.c可以看到
stm32cubemx配置iic,STM32学习记录,stm32,嵌入式硬件,单片机
里面已经配置好了IIC的模式以及对应IO口的配置、使能相关时钟。在使用硬件IIC的过程中比较重要的函数如下:
stm32cubemx配置iic,STM32学习记录,stm32,嵌入式硬件,单片机
可以看到里面包含了普通模式、中断模式、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,STM32学习记录,stm32,嵌入式硬件,单片机
可以看到已经实现了实验所需的功能,那么在该实验中可以看出,使用STM32CubeMx配置好硬件IIC只需调用库中提供的函数就能轻松实现IIC通讯功能,而用户则可以更加专注于自己想要实现的功能,实际上也是方便很多。至此,硬件IIC实验就完成了,也欢迎大家有问题可以指出,一起讨论一下,谢谢!文章来源地址https://www.toymoban.com/news/detail-653134.html

到了这里,关于STM32硬件IIC实验(STM32CubeMx配置)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32CubeMX】教程二_IIC驱动0.96oled屏幕(SSD1306)

    本篇博客涉及以下内容 IIC通讯原理讲解、代码编写 SSD1306驱动芯片datasheet讲解、驱动代码编写、0.96oled模块原理图说明 STM32CubeMX配置IIC 使用硬件:STM32F103C8T6 使用软件:STM32CubeMX、keil5(MDK)、VSCode(搭载keil assistant插件) 提示:以下是本篇文章正文内容   在计算机科学里,大

    2023年04月21日
    浏览(45)
  • HAL库&STM32cubeMX工程软件模拟IIC,改改引脚即可直接使用

    c文件如下 h文件如下

    2024年02月14日
    浏览(53)
  • stm32硬件实现IIC

    2024年01月17日
    浏览(46)
  • STM32硬件IIC使用

    虽然STM32的硬件IIC据说有设计缺陷,但是经过我的实践,至少STM32F103的硬件IIC是没问题的。这里给出STM32的硬件IIC的使用以及编程思路。 在这里给出STM32F103的硬件IIC引脚,方便查阅使用 STM32的硬件IIC我认为是非常具有借鉴意义的,它使用了事件组的一个流程。以stm32为主设备,

    2024年03月14日
    浏览(47)
  • 模拟IIC通讯协议(stm32)(硬件iic后面在补)

            1、IIC通讯需要两条线就可以,SCL、SDA。         2、IIC的数据传输的速率,不同的ic是不同的,根据电平维持的延时函数的时间来确定IIC数据传输的速率.         3、IIC的延时函数可以使用延时函数,延时函数一般使用系统滴答时钟产生延时,也是在Sysclk频率总线的

    2024年04月15日
    浏览(57)
  • 【STM32+HAL库】---- 硬件IIC驱动0.96OLED

    代码借鉴学习于以下文章: STM32 使用硬件IIC驱动0.96寸4针IOLED显示器(HAL库) 略... 点击查看代码 首先在 main.c 中引入头文件 随即根据要求在 main函数 中添加对应功能函数即可 【 注意 】使用时应将编译器编码选项选择为 GBK系列 ,否则编译报错,尤其注意通过keil修改后,再

    2024年02月19日
    浏览(37)
  • STM32硬件IIC卡死问题和DMA发送数据异常问题

    问题1描述: 一直听说STM32的硬件IIC有问题,我平时做项目一直没有遇到过,这次做项目发现硬件IIC居然会自己卡死,现象就是IIC发不出数据,用逻辑分析仪捕捉不到任何电平,必须要重启单片机才能正常,接下来说一下我的硬件环境:STM32作为主机,IIC总线上挂载这AT24C02和一

    2024年02月03日
    浏览(32)
  • STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕

    📌相关篇《【STM32CubeIDE】STM32F103硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕》 ✨驱动效果就不做演示了,和上面的相关篇一样,主要是为了方便使用MDK Keil开发的使用。所以花了点时间从上面的工程当中做了分离,重新使用STM32CubeMX配置一个方便二次开发移植使用和配置的工程。本

    2024年02月03日
    浏览(47)
  • STM32 硬件IIC 控制OLED I2C卡死问题

    #更新通知:2023-09-06 STM32L151 固件库 使用I2C 太难了,又宕机了,建议不要在固件库版本上尝试硬件IIC 了,一般人真用不了,直接使用软件模拟的,或者不要使用固件库了,用HAL 库吧,据说HAL 库没这么多问题,不死心的我还是死心了,等有空再研究吧 3.1 I2C模式,我这里选的

    2024年02月09日
    浏览(45)
  • STM32Cubemxhal库硬件IIC驱动SHT40温湿度传感器

    STM32cubemx配置硬件IIC如图所示  SHT40的驱动代码 注意:在读sht40的寄存器之后一定要加10几个ms的延时

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包