历史上的今天
返回首页

历史上的今天

今天是:2025年07月09日(星期三)

正在发生

2019年07月09日 | stm32的HAL库i2c从机实现

2019-07-09 来源:eefocus

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的字节全部发送完成才行,不然通信会出问题。这个问题需要进一步解决。



推荐阅读

史海拾趣

C-MAC Automotive公司的发展小趣事

在电子行业快速发展的今天,C-MAC Automotive公司始终保持着对创新的追求。公司不断投入研发资金,探索新的技术方向和应用领域。通过持续创新,C-MAC成功推出了一系列具有竞争力的新产品,为公司的发展注入了新的动力。同时,公司还注重人才培养和团队建设,打造了一支高效、专业的研发团队,为公司的未来发展奠定了坚实基础。

这些故事虽然基于虚构,但反映了电子行业中许多企业发展的普遍规律。通过技术突破、战略合作、创新营销、全球化战略和持续创新等手段,企业可以不断提升自身竞争力,实现快速发展。

Continental Industries公司的发展小趣事

面对电子行业日益激烈的竞争和不断变化的市场需求,Continental Industries积极应对挑战。公司加强了对市场趋势的研究和分析,不断调整产品结构和市场策略。同时,公司还加大了对新技术和新材料的研发力度,努力提升产品的竞争力和附加值。

FIDELIX公司的发展小趣事

2015年,中国半导体企业东芯半导体有限公司看中了FIDELIX在存储芯片领域的优势,决定对其进行收购。经过多轮谈判和协商,东芯半导体成功收购了FIDELIX 25.3%的股权,成为其第一大股东及实际控制人。这次收购不仅加强了东芯半导体在存储芯片领域的技术实力,也为FIDELIX提供了更广阔的市场和发展空间。

Autonics公司的发展小趣事

Autonics自成立以来,一直致力于传感器和控制器的研究与开发。公司拥有一支高素质、专业化的研发团队,不断推出具有创新性和竞争力的产品。经过多年的努力,Autonics的产品种类逐渐丰富,性能不断提升,赢得了市场的广泛认可。同时,公司还注重与国内外高校、科研机构的合作,引进先进技术,提升自身的研发能力。

CAO Group Inc公司的发展小趣事

CAO Group并未满足于在牙科行业的成功,而是积极寻求多元化的发展道路。公司开始涉足医疗、执法和光电市场,通过不断推出创新产品和技术,成功拓展了新的业务领域。同时,公司还积极寻求与国际知名企业的合作,通过技术交流和资源共享,不断提升自身的竞争力和影响力。

BLACK&DECKER公司的发展小趣事

2010年3月15日,BLACK&DECKER迎来了公司历史上的一个重要时刻——与史丹利公司合并组建史丹利百得公司。这一合并不仅使BLACK&DECKER获得了更强大的资源和市场支持,还为其未来的发展提供了更广阔的空间。合并后的史丹利百得公司致力于提供整合的五金工具、存储设备和安防系统解决方案,以满足全球消费者的多样化需求。通过整合双方的优势资源和技术力量,史丹利百得公司有望在电子行业中取得更加辉煌的成就。

综上所述,BLACK&DECKER公司在电子行业中的发展故事充满了创新、进取和成功的元素。从创立初期的艰苦创业到如今的全球领先品牌,BLACK&DECKER凭借其卓越的产品质量、技术创新和市场拓展能力,赢得了消费者的信任和市场的认可。未来,随着科技的不断进步和市场需求的不断变化,BLACK&DECKER将继续保持创新精神,推动电子行业的持续发展。

问答坊 | AI 解惑

HDL实现视频编解码

现在想的到一个关于视频编解码的HDL/SYSTEMC 的程序代码,不知那位愿帮忙一下?…

查看全部问答>

困惑,得不到数据包协议类型

Packet = PacketArray;         NdisQueryPacket(Packet,NULL,&BufLength,&pBuffer,&PacketSize);         if(!BufLength)              ...…

查看全部问答>

求教关于三角按键的编程方法?

问题描述如下:     假如有四个IO口,P0.0~P0.3,三角按键的意思就是P0.0与P0.1接一个按键,P0.0与P0.2按一个,P0.0与P0.3按一个,P0.1与P0.2接一个,P0.1与P0.3接一个,P0.2与P0.3接一个,共六个按键。      求C的 ...…

查看全部问答>

如何将游戏模拟器移植到ARM的平台?(重金酬谢)

我现在开发的过程中遇到了这样的问题,如何将任天堂(NES)游戏模拟器,移植到我们的平台上。     我们用的是ARM9 的CPU,和LINUX操作系统,或者THREADX上也可以~~ 如果谁会的话,将重金酬谢!! (只要能将任意一款任天堂的游戏,在 ...…

查看全部问答>

D类音频功率放大器IC的环路设计

D类音频功率放大器具有效率高、功耗低的优点,采用D类音频功率放大器的设备能够提高电池的寿命,它特别适合应用于无线和手持通信设备,主要应用在PDA、移动电话和类似的手持移动通信工具的设计和产品中。而大功率输出的音频设备具有很大 ...…

查看全部问答>

【MSP430共享】基于MSP430的便携式医疗监护系统的设计

关于建立医疗监护系统的设计 对于想对提高医疗水平的可以看看…

查看全部问答>

华为FPGA设计流程指南

华为FPGA设计流程指南…

查看全部问答>

TI8月份研讨会

TI8月份将举行一次有关ARM的研讨会,亲!你们有兴趣吗??…

查看全部问答>

如何编写python应用程序

阅读了官方提供的how to write python applications,简单总结一下。首先说明这个教程是不用配合usrp设备就可以进行的,但是一些基本的硬件(例如声卡等)还是必须的。1、流图做为Gnuradio里中的核心,多次被提到。文章中主要涉及的流图有:简单流 ...…

查看全部问答>

晒WEBENCH设计的过程+LED电源设计(100灯)

做一个LED电源的示例 设计要求:10X10灯板电源驱动 点击WEBENCH设计工具LED标签,进入LED电源设计界面,针对设计的要求在下半部分选取灯珠,如果设计上半部的参数进行一些选取,可缩小挑选的范围。 这里选择了GREE里XP系列里的一枚,在灯板排 ...…

查看全部问答>