stm32的HAL库i2c从机实现

发布者:Yuexiang888最新更新时间:2019-07-09 来源: eefocus关键字:stm32  HAL库  i2c从机 手机看文章 扫描二维码
随时随地手机看文章

stm32的i2c默认就是slave模式,本文基于HAL库实现中断方式的接收和发送,首先是初始化gpio和i2c,代码如下:


I2C_HandleTypeDef I2cHandle;

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)

{

    GPIO_InitTypeDef GPIO_InitStruct; 

     __HAL_RCC_GPIOA_CLK_ENABLE() ;

     __HAL_RCC_GPIOC_CLK_ENABLE() ;

    /**I2C3 GPIO Configuration    

    PA8     ------> I2C3_SCL

    PC9     ------> I2C3_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_8;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;            //开漏输出(i2c需要这种模式)

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

      

    GPIO_InitStruct.Pin = GPIO_PIN_9;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;

    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

 

    /* Peripheral clock enable */

    __HAL_RCC_I2C3_CLK_ENABLE();

 

    /* Peripheral interrupt init */

    HAL_NVIC_SetPriority(I2C3_EV_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(I2C3_EV_IRQn);

    HAL_NVIC_SetPriority(I2C3_ER_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(I2C3_ER_IRQn);

}

void I2c_config()

{

  I2cHandle.Instance             = I2C3;                           //此处使用i2c3

 

  I2cHandle.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;        //7位地址模式

  I2cHandle.Init.ClockSpeed      = 1000000;                        //时钟支持最高1M

  I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;        //关闭双地址模式

  I2cHandle.Init.DutyCycle       = I2C_DUTYCYCLE_16_9;             

  I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;        

  I2cHandle.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLE;          

  I2cHandle.Init.OwnAddress1     = 0X34;                           //器件地址

  I2cHandle.Init.OwnAddress2     = 0;        

  

  if(HAL_I2C_Init(&I2cHandle) != HAL_OK)                            //调用初始化函数

  {

    /* Initialization Error */

    Error_Handler();    

  }

  HAL_I2C_Slave_Receive_IT(&I2cHandle,i2c_slave_recv,I2C_REC_BYTES);  //开启从机中断接收

}

i2c3中断回调函数:


void I2C3_ER_IRQHandler()                 //异常回调

{

    HAL_I2C_ER_IRQHandler(&I2cHandle);

}

void I2C3_EV_IRQHandler()                //事件回调(接收或发送)

{

    HAL_I2C_EV_IRQHandler(&I2cHandle);

}

  两个中断对应的中断事件如下图所示:



发送完成、接收完成和错误回调函数:


void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *I2cHandle)

{

       //发送完成回调函数 

       {

            //一些其他操作

        }

       HAL_I2C_Slave_Receive_IT(&I2cHandle,i2c_slave_recv,I2C_REC_BYTES);

        {

            //一些其他操作

        }

}

 

void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle)

{

       //接收完成回调函数

        {

            //一些其他操作

        }

        HAL_I2C_Slave_Transmit_IT(&I2cHandle,send_buffer,send_cnt);

        {

            //一些其他操作

        }

}

 

void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *I2cHandle)

{

       //错误异常回调函数

}

实际操作时可以在接收完成中断中处理数据然后开启从机发送中断,在发送完成中断中开启从机接收中断,可以实现收发。


目前用HAL库发送必须将send_cnt的字节全部发送完成才行,不然通信会出问题。这个问题需要进一步解决。



关键字:stm32  HAL库  i2c从机 引用地址:stm32的HAL库i2c从机实现

上一篇:STM32部分知识之I2C
下一篇:使用STM32hal库usart的接收中断分析及出现部分问题的解决

推荐阅读最新更新时间:2024-11-13 14:30

STM32串口下载方式简单总结
这里简单说明一下一键下载电路的原理,我们知道, STM32 串口下载的标准方法是 2 个步 骤: 1, 把 B0 接 V3.3(保持 B1 接 GND)。 2, 按一下复位按键。 通过这两个步骤,我们就可以通过串口下载代码了,下载完成之后,如果没有设置从 0X08000000 开始运行,则代码不会立即运行,此时,你还需要把 B0 接回 GND,然后再按一 次复位,才会开始运行你刚刚下载的代码。所以整个过程,你得跳动 2 次跳线帽,还得按 2 次 复位,比较繁琐。而我们的一键下载电路,则利用串口的 DTR 和 RTS 信号,分别控制 STM32 的复位和 B0,配合上位机软件(mcuisp),设置: DTR 的低电平复位, RTS
[单片机]
<font color='red'>STM32</font>串口下载方式简单总结
STM32片上外设时钟使能 失能和复位的区别
今天分享的关于时钟知识,可能很多人没有在意过。这也是之前有朋友问过的问题,这里就简单给大家普及一下吧。 1 RCC时钟说明 在STM32参考手册中,都有Reset and Clock Control(RCC)复位和时钟控制的章节。 在这一章节就可以看到有两类寄存器:peripheral reset register(RSTR)外设复位寄存器和peripheral clock enable register(ENR)外设时钟使能寄存器。 我们拿STM32F1参考手册为例,可以看到如下图寄存器: 一种是控制外设时钟的寄存器,一种是复位外设的寄存器。 2 外设时钟使能和失能 我们都知道,配置STM32外设,会先开启对应的时钟
[单片机]
<font color='red'>STM32</font>片上外设时钟使能 失能和复位的区别
STM32按键程序
u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1)) { delay_ms(10);//去抖动 key_up=0; if(KEY0==0)return 1; else if(KEY1==0)return 2; else if(KEY2==0)return 3; else if(KEY3==1)return 4; }else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;
[单片机]
如何设计STM32嵌入式程序的超时机制?
软件超时机制 1、背景 在嵌入式软件程序设计过程中中,经常会遇到超时(或定时)的处理情况,基本处理思想是在时间到的时候进行相关程序处理,下面介绍两种超时(或定时)的程序设计方案。 2、方案一 基本思想:定时器中断使用一个变量TICK,中断间隔时间t,在准备定时开始时读取此时刻的TICK,在程序运行过程中实时读取当前的TICK信息并计算即可。 因此在时间计算时只需计算开始STARTTICK和结束ENDTICK即可完成时间计算。时间计算T=(ENDTICK-STARTTICK) * t;使用一个定时器中断每t时间处理一次中断,中断里面时间计数值s_u32TCNT++,如下图所示: 程序中定义一个结构体来保存超时开始和超时结束时间,结
[单片机]
如何设计<font color='red'>STM32</font>嵌入式程序的超时机制?
stm32 HAL 重映射
以定时器重映射为例 部分重映射:只改变CH1、CH2管脚 完全重映射:CH1~CH4管脚全部改变 在stm32f1xx_hal_gpio_ex.h找到重映射语句 添加到管脚定义语句前 完成
[单片机]
【Alientek STM32 实验2】--按键输入
上一节介绍了STM32的IO口输出,这一节,我们将向大家介绍如何使用STM32的IO口作为输入用。通过本节的学习,你将了解到STM32的IO口作为输入使用的方法。本节分为如下几个小节: 3.2.1 STM32 IO口简介 3.2.2 硬件设计 3.2.3 软件设计 3.2.1 STM32 IO口简介 STM32的IO口在上一节已经有了详细的介绍,这里我们不再多说。STM32的IO口做输入使用的时候,是通过读取IDR的内容来读取IO口的状态的。了解了这点,就可以开始我们的代码编写了。 这一节,我们将通过MiniSTM32板上载有的3个按钮,来控制板上的2个LED,其中KEY0控制DS0,按一次亮,再按一次,就灭。KEY1控
[单片机]
【Alientek <font color='red'>STM32</font> 实验2】--按键输入
STM32时钟控制RCC探究
RTC是STM32单片机的脉搏,是单片机的驱动源。使用任何一个外设都必须打开相应的时钟。这样的好处就是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。 STM32单片机的时钟可以由以下3个时钟源提供: 1、HSI:高速内部时钟信号(high speed clock internal)stm32单片机内带的时钟(8M频率)精度较差 2、HSE:高速外部时钟信号(high speed clock external)精度高来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟 3、LSE:低速外部晶体(low speed external)32.768kH
[单片机]
使用MCU GD32替代STM32的体会
GD32作为国产MCU里的佼佼者,产品线也比较丰富,是替代STM32的一个很好的选择。前段时间有个项目用到GD32的单片机,今天来说说使用的一些体会。 1.硬件我用的单片机型号为GD32F405RGT6,对应STM32F405RGT6。首先,硬件上基本兼容,有一点不同的是GD32的31和47脚为NC,STM32的为VCAP。STM32这两个引脚需要分别连接一个电容到GND,而GD32则不需要。当然,有这两个电容也无所谓,所以,硬件上GD32可以直接替换STM32。 仿真器可以使用Jlink,也可以使用STLink,但是下载程序时会弹框提示,非ST芯片。 2.软件软件上,前期
[单片机]
使用MCU GD32替代<font color='red'>STM32</font>的体会
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved