历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2018年11月26日 | STM32L151 I2C从机实现

2018-11-26 来源:eefocus

 网上很多STM32的I2C都是基于F系列去实现的,其他的系列的芯片实现很少。


 而对于STM32L151系列的I2C从机设计,用STM32CubeMX生成的简单DEMO里,就会有提供库接口实现,比如:


 HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);


 HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);


 但其实,如果是调用库接口,只能实现从机接收或者是只实现从机发送实现,调用现成接口貌似很难做到既接收有发送(至少个人没有试验出来)。


  不过如果使用中断,实现起来就非常简单了。


  首先使用STM32CubeMX生成一个简单的I2C demo,设置在MX_I2C1_Init接口里面设置好从机的一些基本信息(从机地址,使用几位从机地址等);


/* I2C1 init function */


void MX_I2C1_Init(void)


{

 

  hi2c1.Instance = I2C1;


  hi2c1.Init.ClockSpeed = 100000;


  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;


  hi2c1.Init.OwnAddress1 = 0x90;


  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;


  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;


  hi2c1.Init.OwnAddress2 = 0;


  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;


  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;


  if (HAL_I2C_Init(&hi2c1) != HAL_OK)


  {


    _Error_Handler(__FILE__, __LINE__);


  }

 

}


    然后重写I2C1_EV_IRQHandler中断函数,并使能中断;


void I2C1_EV_IRQHandler(void)


{


  if (hi2c1.Instance->SR1 & (I2C_FLAG_BERR | I2C_FLAG_ARLO | I2C_FLAG_OVR)) {


    HAL_I2C_ER_IRQHandler(&hi2c1);


  } else {


    HAL_I2C_EV_IRQHandler(&hi2c1);


  }


}


   至于中断函数就直接使用工具生成的就可以了。


值得注意的是:


STM32L151芯片在工具生成的DEMO里面,从机模式无论是接收还是发送都是一个字节一个字节进行的,如果你需要接收或者是发送多个字节,需要稍微更改一下接收和发送的函数。


static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c)


{   


while(hi2c->XferSize > 0U)


    {


      /* Wait until TXE flag is set */

      

if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, 0xffffffff, 0) != HAL_OK)

      

{


        /* Disable Address Acknowledge */


        CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);


        if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)


        {


          return HAL_ERROR;


        }


        else


        {


          return HAL_TIMEOUT;


        }


      }

 

      /* Write data to DR */


      hi2c->Instance->DR = (*hi2c->pBuffPtr++);


      hi2c->XferCount--;


      hi2c->XferSize--;


    }


    if((hi2c->XferCount == 0U) && (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN))


    {


      /* Last Byte is received, disable Interrupt */


      __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);


       /* Set state at HAL_I2C_STATE_LISTEN */

 

      hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;


      hi2c->State = HAL_I2C_STATE_LISTEN;

 

      /* Call the Tx complete callback to inform upper layer of the end of receive process */


      HAL_I2C_SlaveTxCpltCallback(hi2c);


    }

  return HAL_OK;


}


static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c)


{


  while(hi2c->XferCount != 0U)


  {

  

      /* Wait until RXNE flag is set */


      if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, 0xffffffff, 0) != HAL_OK)      


      {


        /* Disable Address Acknowledge */


        CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);


        if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)


        {


          return HAL_TIMEOUT;


        }


        else


        {


          return HAL_ERROR;


        }


      }


    /* Read data from DR */

 

   (*hi2c->pBuffPtr++) = hi2c->Instance->DR;


    hi2c->XferCount--;

 

    if((hi2c->XferCount == 0U) && (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN))


    {


      /* Last Byte is received, disable Interrupt */


      __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);

 

      /* Set state at HAL_I2C_STATE_LISTEN */


      hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;


      hi2c->State = HAL_I2C_STATE_LISTEN;

 

      /* Call the Rx complete callback to inform upper layer of the end of receive process */


      HAL_I2C_SlaveRxCpltCallback(hi2c);


    }


  }


  return HAL_OK;


}


    改造了之后,就可以直接接收/发送多个字节的数据啦啦啦~

推荐阅读

史海拾趣

长江微电(cjiang)公司的发展小趣事

随着新能源汽车市场的快速发展,汽车电子领域对电感产品的需求不断增长。长江微电敏锐地捕捉到这一市场机遇,加大了对汽车电子领域的投入力度。公司推出的车规级系列电感产品广泛应用于汽车LED驱动电路、汽车多媒体系统、车联网系统等领域。凭借优异的产品性能和稳定可靠的质量保障,长江微电在汽车电子领域树立了良好的口碑和品牌形象。

Focus公司的发展小趣事

Focus科技股份有限公司(此处假设为一家虚构的、与“焦点科技”类似的公司)自成立之初就专注于将传统制造业与互联网深度融合。随着电子商务的兴起,该公司于2005年推出了自己的外贸电商平台“GlobalFocus”,旨在帮助中国供应商直接触达全球买家。通过持续的技术创新和平台优化,“GlobalFocus”迅速成为国际市场上知名的B2B采购平台,吸引了大量海外采购商和国内优质供应商入驻。公司还积极拓展跨境物流、支付、金融等增值服务,为中小企业提供了全方位的外贸解决方案。

Catalyst / ON Semiconductor公司的发展小趣事

随着技术的不断进步,Catalyst / ON Semiconductor公司逐渐在半导体领域取得了重要的技术突破。公司投入大量资源进行研发,成功开发出了一系列高性能、低功耗的半导体产品,这些产品在市场上受到了广泛的欢迎。这些技术突破不仅提升了公司的市场竞争力,也为整个电子行业的发展注入了新的活力。

Beta Dyne Inc公司的发展小趣事

随着社会对环保问题的关注度不断提高,Beta Dyne也积极响应国家号召,将环保理念融入公司的经营发展中。公司采用环保材料和生产工艺,减少生产过程中的污染排放。同时,Beta Dyne还积极参与社会公益事业,为当地社区的发展做出了积极贡献。

这些故事虽然是以虚构的形式呈现,但它们反映了电子行业中许多公司可能经历的发展阶段和挑战。每个公司都有其独特的发展历程和故事,Beta Dyne Inc也不例外。如果您对该公司的具体发展情况感兴趣,建议查阅相关资料或联系该公司以获取更准确的信息。

Comtronic Gmbh-Verbindungstechnik公司的发展小趣事

近年来,电子行业面临着技术更新换代迅速、市场竞争激烈的挑战。Beta Dyne也不例外,公司面临着来自同行的竞争压力以及客户需求不断变化的挑战。为了应对这些挑战,Beta Dyne不断调整产品策略,加大研发投入,推出了一系列创新产品,并积极拓展新的应用领域。

Cypress(赛普拉斯)公司的发展小趣事

Cypress公司成立于1982年,总部设在美国加州的San Jose。创业之初,公司专注于高速CMOS SRAM、EEPROM、PAL器件和TTL逻辑器件的设计和开发。这一时期,Cypress通过引入创新的技术和产品设计,在竞争激烈的电子芯片市场中逐渐崭露头角。公司凭借对技术的持续投入和积累,为未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

从WiFi收发器的PCB布局看射频电路电源和接地的设计方法

射频(RF)电路的电路板布局应在理解电路板结构、电源布线和接地的基本原则的基 础上进行。本文探讨了相关的基本原则,并提供了一些实用的、经过验证的电源布 线、电源旁路和接地技术,可有效提高RF 设计的性能指标。考虑到实际设计中 PLL 杂散信 ...…

查看全部问答>

4路模拟量数据采集

本人欲外包一项目,价格再议,其具体要求如下:     1、4路 4--20ma电流型传感器的数据采集;     2、精度要求12位以上;     3、采用51系列单片机,C语言编程;     4、有隔离栅功能,能进行过流保护 ...…

查看全部问答>

win CE 初学平台如何搭建啊

请大虾们列下自己的开发软件 …

查看全部问答>

在使用:ARM926EJ-S MP2530F方案的机器上,运行程序报非法应用程序错误

在使用ARM926EJ-S MP2530F方案的导航仪上,程序运行报非法应用程序错误,请问怎么办?怎样做与系统无关的程序?…

查看全部问答>

为什么要划分operating mode?

在arm上有7种模式:user fiq irq 。。。。 为什么要作这样的划分?作用是什么? 每一种模式的限制在哪里? 有没有什么书,会比较详细的介绍这些问题的? 谢谢。…

查看全部问答>

我在本机上写了个网页,怎么用pda模拟器来访问??

如题,还有我准备用asp.net来做这个网页,怎么控制这个网页的长宽比呢??就是说大小问题.本机是800*600的大小.怎么适应pda的屏幕呢??…

查看全部问答>

上传一个lm3s8962较新的勘误文档

如果你采用的硅版本是A1或者A2的话,有些时候程序出现莫名奇妙的问题,有可能不是你的错,看看勘误文档能不能帮你迅速找到出错的地方,以及在使用的时候去避免这些芯片本身的小问题,应该是有点帮助的。 [ 本帖最后由 academic 于 2010-11-16 09: ...…

查看全部问答>

【求助】430双电源设计

我做的双电源设计 锂电池3.6V---二极管-------MSP430 ××CC DVCC 纽扣电池3V------二极管------msp430 ××CC 用作外部电池断电以后 RAM 数据保持 不知是否可行,还有就是不知道二极管再导通后的功耗多大 请教楼住 有没有成 ...…

查看全部问答>

一个车友的请教。求帮助

比亚迪汽车车载导航用的是winc5.0的系统ARM9+64MB内存的一体机,我们研究发现只有用他原厂的导航软件才有声音出来,如果换了导航软件就不出声了。具体分析了原厂导航软件的启动过程,发现他是调用了coredll、dll文件的函数了?我想问问一体机的注册 ...…

查看全部问答>

(74HC595驱动3个数码管+2个按键)模块原理图和电路板

这个模块是我前些日子给人开发产品的一部分电路,可以给设计人员一个参考。…

查看全部问答>