历史上的今天
返回首页

历史上的今天

今天是:2025年04月02日(星期三)

正在发生

2019年04月02日 | STM32 I2C Slave(SMBUS)模式软件参考设计

2019-04-02 来源:eefocus

I2C大家都很熟悉,总共2根线,CLK和DATA,stm32的I2C相信大家就更熟悉了,采用写控制器的方式,直接由控制器去完成I2C时序操作,用户无需关心具体产生的逻辑。然而,大部分情况下,使用的都是I2C Master模式,即主设备模式,很少当成slave模式即从设备模式来用,这篇文章讲的是如何把stm32  I2C当成slave模式来使用,更严格来说,本篇讲的是smbus模式。


从官网stm32手册上我们发现了smbus和I2C区别,大家自行理解:



真正使用时,可以把smbus等同于I2C来设置和使用,从代码上看,除了I2C Clock设置为20K之外,其它暂无明显区别。以下为I2C  smbus模式的设置:


void IIC_Init(void)  

 

{  

 

  GPIO_InitTypeDef GPIO_InitStructure;  

 

  I2C_InitTypeDef I2C_InitStructure;  

 

  

 

//  RCC_APB2PeriphClockCmd  (RCC_APB2Periph_GPIOB , ENABLE);  

 

  

 

   /* Configure I2C1 pins: SCL and SDA */   

 

   GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_6|GPIO_Pin_7; //6:SCL 7:SDA  

 

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

 

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//Out_PP;  

 

   GPIO_Init(GPIOB, &GPIO_InitStructure);   

 

   

 

//   RCC_APB1PeriphClockCmd  (RCC_APB1Periph_I2C1, ENABLE);   

 

   

 

   // Initialize I2C1 clock

 

   // Reset I2C1 device clock in order to avoid non-cleared error flags

 

   //__I2C_RCC_RESET(CPAL_I2C_CLK [Device]);

 

   RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,ENABLE);

 

   RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,DISABLE);

 

   // Enable I2C1 device clock

 

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);

 

   

 

   I2C_DeInit(I2C1);  

 

   I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusDevice;  

 

   I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;  

 

   I2C_InitStructure.I2C_OwnAddress1 = 0x76;//slave addr  

 

   I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;  

 

   I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;  

 

   I2C_InitStructure.I2C_ClockSpeed = 20000;//20K

 

   I2C_Init(I2C1, &I2C_InitStructure);  

 

   I2C_ITConfig(I2C1, I2C_IT_EVT|I2C_IT_BUF, ENABLE);  

 

   I2C_ITConfig(I2C1, I2C_IT_ERR, ENABLE);

 

   I2C_Cmd(I2C1,ENABLE);  

 

   

 

}  

 


void NVIC_Configuration(void)  

 

{  

 

  NVIC_InitTypeDef NVIC_InitStructure;  

 

 

 

     /* Configure and enable I2Cx event interrupt -------------------------------*/  

 

    NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;  

 

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

 

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  

 

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

 

    NVIC_Init(&NVIC_InitStructure);  

 

  

 

}  

从以上代码可以看出,I2C初始化的是I2C的IO映射、工作模式I2C_Mode_SMBusDevice、slave地址0x76(可以自定义)、I2C  Clock、I2C中断向量等参数。设置完成之后,每当I2C有数据产生时,就会产生IRQ中断,同时进入中断处理函数I2C1_EV_IRQn,如下所示:


void I2C1_EV_IRQHandler(void)  

 

{  

 

uint32_t  I2CFlagStatus;  

 

static uint8_t IIC_Data=0;

 

 

 

I2CFlagStatus = I2C_GetLastEvent(I2C1);  // =>  (SR2<<16|SR1)  

 

 

 

// print_info("I2CFlagStatus=0x%x rn",I2CFlagStatus);

 

IIC1_EV_INT_Flag=1;

 

IIC_Get_Data_Flag=1;

 

 

 

if ((I2CFlagStatus & I2C_SR1_ADDR) != 0)//bit1:addr matched  

 

{

 

//print_info("4rn");

 

if(I2CFlagStatus & I2C_SR1_TXE) //bit7 Data register empty (transmitters)  

 

{//read          

 

   Rx_Idx=0;

 

   Tx_Idx = 0;    

 

   I2C_SendData(I2C1, I2C_Buffer_Tx[Tx_Idx]);

 

}

 

else

 

{   

 

}  

 

}

 

 

 

else if((I2CFlagStatus & I2C_SR1_RXNE) != 0)//bit6  RxNE    -Data register not empty (receivers))  

 

{

 

IIC_Data=I2C_ReceiveData(I2C1);

 

I2C_Buffer_Rx[Frame_Idx][Rx_Idx] = IIC_Data;

 

Rx_Idx++;

 

}

 

else if((I2CFlagStatus & I2C_SR1_STOPF) != 0)//bit4  STOPF -Stop detection (slave mode)  

 

{

 

//I2C_Buffer_Rx[0] = num-1;      

 

I2C1->CR1 |= 0x1000;//CR1_PEC_Set;  

 

Rx_Idx_t=Rx_Idx;

 

Rx_Idx=0;

 

Frame_Idx++;

 

I2C1->SR1=0;  

 

I2C1->SR2=0;  

 

}

 

else

 

{  

 

}  

 

}  

 


中断处理函数中,产生中断后,把标志位IIC_Get_Data_Flag置1,根据读到的I2CFlagStatus状态位,来获取当前I2C的状态,获取数据,然后在main函数中根据该标志位来处理I2C产生的数据,处理完成后,再把IIC_Get_Data_Flag标志位置0,这是一种很好的处理数据方法。(PS:中断处理函数不能处理太复杂及费时的事务,以免影响中断响应的实时性,所以把处理数据的过程放到main函数中)


推荐阅读

史海拾趣

Hanghsing Enterprise Co Ltd公司的发展小趣事

HANA Micron公司在电子行业的五个发展故事

故事一:2.5D封装技术的突破

HANA Micron,作为韩国顶尖的后端工艺和外包半导体组装测试(OSAT)公司,近年来在2.5D封装技术领域取得了显著进展。随着高性能人工智能(AI)芯片需求的急剧增长,该公司致力于开发一种能够水平组装不同类型AI芯片的封装技术,如高带宽内存(HBM)。这一技术对于生产像英伟达H100这样的顶级AI加速器至关重要。公司CEO Lee Dong-cheol表示,他们已将未来寄托在HBM和其他AI芯片的先进2.5D封装技术上,并透露公司已生产出原型,尽管全面商业化尚需时日。HANA Micron的这一努力不仅提升了其技术实力,也为公司在全球芯片封装市场的竞争中占据了有利位置。

故事二:越南市场的扩张

为了进一步扩大业务版图,HANA Micron在越南进行了大规模的投资。自2016年在越南北宁省成立公司进军东南亚市场以来,该公司已累计投资高达7000亿韩元(约合5.25亿美元)。其北江省云中工业园的2号制造工厂于2023年正式落成,标志着公司在越南半导体封装和测试领域迈出了重要一步。这一投资不仅提升了公司的产能,还为公司带来了更多的业务机会和市场份额。HANA Micron计划到2025年将月产量提高到2亿个,并预计越南业务的销售额将很快达到万亿韩元。

故事三:多元化产品线的拓展

除了在传统存储芯片封装领域保持领先地位外,HANA Micron还积极拓展多元化产品线。公司目前正在开发针对可穿戴设备和医疗设备的封装技术,以提高这些设备的灵活性和可靠性。这一项目的第一个成果是去年年底开发的针对医疗贴片的心电图传感器模块,该模块允许传感器的功率低于1mA,延迟低于5ms。这一创新不仅展示了公司在封装技术上的深厚积累,也为其在未来医疗和可穿戴设备市场中的发展奠定了坚实基础。

故事四:与国际巨头的合作与竞争

在电子行业的激烈竞争中,HANA Micron不仅与国内同行如三星、SK海力士等展开合作与竞争,还与国际巨头如台积电、英特尔等保持着紧密的联系。公司CEO Lee Dong-cheol透露,台积电已成功研发出英伟达H100的2.5D封装技术,而三星和SK海力士也在积极跟进。在这种背景下,HANA Micron不断加大研发投入,以确保自己在封装技术上的领先地位。同时,公司还通过与国际巨头的合作与交流,不断提升自身的技术水平和市场竞争力。

故事五:应对市场波动与未来展望

面对全球电子市场的波动和不确定性,HANA Micron展现出了较强的抗风险能力和市场适应能力。公司CEO Lee Dong-cheol表示,尽管过去几年存储市场有所放缓,但随着电子产品制造商和AI设备制造商对先进芯片需求的不断增长,预计2024年的业绩将有所改善。为了实现这一目标,公司将继续加大在研发、生产和市场拓展等方面的投入力度。同时,公司还计划将系统芯片的比例提高到50%以上,以降低市场波动对公司业绩的影响。这一战略调整不仅体现了公司对未来的信心和决心,也为公司的可持续发展奠定了坚实基础。

Eurohm Resistors公司的发展小趣事

随着市场的不断扩张和竞争的加剧,Eurohm Resistors始终坚持品质至上的原则。公司建立了严格的质量控制体系,从原材料采购到生产流程,再到成品检验,每一个环节都严格把关。这种对品质的坚守不仅赢得了客户的信任,也为公司赢得了良好的口碑。

Elcos AG公司的发展小趣事

随着全球对环保和可持续发展的重视,Elcos AG也开始注重自身的环保责任和可持续发展战略。公司采用环保材料和生产工艺,减少了对环境的污染和资源的浪费。同时,Elcos AG还积极参与社会公益事业和环保活动,通过捐款、赞助和志愿服务等方式回馈社会。这些举措不仅提升了公司的社会形象和品牌价值,也为公司的长期发展奠定了坚实的基础。

强盛电子(AEC)公司的发展小趣事

AEC深知人才是企业发展的根本。因此,公司一直高度重视人才的引进、培养和使用。通过制定完善的人才政策,AEC吸引了一大批高素质的人才加入公司。同时,公司还建立了完善的培训体系,为员工提供广阔的职业发展空间。在人才的支撑下,AEC不断推陈出新,实现了持续稳健的发展。

这些故事是基于一般性的行业发展和企业成长模式构建的,并不特定于强盛电子(AEC)公司的实际经历。如果您需要更具体、更准确的关于强盛电子(AEC)的发展故事,建议您查阅该公司的官方资料、行业报告或相关新闻报道。

GHI Electronics公司的发展小趣事

GHI Electronics深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,致力于开发具有自主知识产权的产品。其中,ARM微控制器、显示模块、空气质量传感器、模块化系统以及微处理器等主打产品系列,凭借其卓越的性能和稳定的品质,在消费电子、便携设备、通讯/网络等领域获得了广泛应用。这些技术创新不仅巩固了GHI Electronics在市场上的领先地位,也为其未来的发展奠定了坚实的基础。

CT Micro公司的发展小趣事
  1. 创业初期与技术创新

CT Micro公司最初由几位电子工程领域的专家创立,他们看到了微型计算机断层扫描(Micro-CT)技术在电子行业中的巨大潜力。初期,公司面临着资金短缺和技术难题,但他们通过不断研发和创新,成功开发出了一款具有高性价比的Micro-CT设备,迅速获得了市场的认可。

  1. 市场拓展与合作伙伴关系

随着产品的成熟,CT Micro开始积极寻求市场拓展。他们与多家电子制造企业建立了合作关系,为这些企业提供Micro-CT设备的定制服务。通过与这些企业的合作,CT Micro不仅扩大了市场份额,还进一步提升了产品的技术水平和应用范围。

  1. 研发升级与产品迭代

面对日益激烈的市场竞争,CT Micro不断投入研发力量,对Micro-CT设备进行升级和迭代。他们成功推出了多款新型设备,具有更高的分辨率、更快的扫描速度和更低的辐射剂量。这些新产品的推出,进一步巩固了CT Micro在电子行业中的领先地位。

  1. 国际化战略与市场拓展

随着国内市场的饱和,CT Micro开始实施国际化战略。他们积极参与国际展览和研讨会,展示自己的产品和技术实力。同时,他们还在海外设立了销售和服务中心,为国际客户提供更加便捷的服务。通过这些努力,CT Micro成功打开了国际市场的大门。

  1. 社会责任与可持续发展

在快速发展的同时,CT Micro也积极履行社会责任。他们注重环保和可持续发展,采用环保材料和节能技术生产产品。此外,他们还积极参与公益事业,为贫困地区的教育和医疗事业贡献力量。这些举措不仅提升了公司的社会形象,也为其可持续发展奠定了坚实基础。

请注意,这些故事框架是虚构的,并不代表CT Micro公司的实际发展情况。如果您需要了解CT Micro公司或类似公司的真实故事,建议您查阅相关公司的官方网站、新闻报道或行业分析报告。

问答坊 | AI 解惑

初学PIC单片机

想知道学PIC单片机需要什么软件? 在网上查的是需要: 1、MPLABV8.43(从microchip网站下的) 2、PICC编译器(C语言编译器) 3、PIC单片机单片机烧写器(具体软件暂时没查到)    有精通PIC单片机的高手请给予一下指点,其中第二,第 ...…

查看全部问答>

gogogo

[url=http://www.artgoin.com][/url]爱艺购,艺术的天堂,艺术的宝库,爱好艺术的人都该去看看,获取能找到一件稀世珍宝欧…

查看全部问答>

关于加速计和陀螺仪的测试

各位高手有没有测试过加速计和陀螺仪这两颗的功能阿,三轴加速计有X,Y,Z三个电压输出,都是经过其内部的AD转换后输出的,不知道这三个方向上的电压是怎么变化的,是有加速度的时候变化呢,还是位置改变了变化啊? 陀螺仪有X,Y两个电压输出,也是 ...…

查看全部问答>

关于MTD驱动的问题

很多MTD驱动都有调用simple_map_init()函数来初始化read,write等函数,不知道这个函数的用法,请大虾帮忙讲一讲啊,如果我需要改变这些read,write函数,该怎么办啦?…

查看全部问答>

求职: 请问有没有人需要高级WINCE工程师--限深圳地区!

求职: 请问有没有人需要高级WINCE驱动工程师--限深圳地区! 如有,请如下EMAIL联系 lumit_hu@126.com…

查看全部问答>

英蓓特STM32ARM开发板的初级改造(有图)

上周在研讨会上买了英蓓特的开发板,试了下,感觉有几个地方不爽,所以就自己动手DIY了:1)USB供电问题,必须插2条USB线,可怜我的本本一共才3个,鼠标用了一个,被他全占了,其它USB-232就没法用了;2)板子附带的1602没有接背光,而实际这 ...…

查看全部问答>

關於LMF232H5QD的UART問題

各位高手大家好,小妹我用此板子的UART出了一點問題,大家可以幫幫我嗎? 感激不盡 問題是這樣的,我開啟了八個UART,為了使輸入資料可以做辨識,個別在UART4跟UART5的地方 加了三個#字號跟一個通道編號 例如:UART4是  ###Edata 這樣 ...…

查看全部问答>

今年会出功率放大类的吗?

本帖最后由 paulhyde 于 2014-9-15 03:16 编辑 今年会出功率放大类的吗    …

查看全部问答>

这几天学习SimpliciTI协议栈的小总结合小纠结

SimpliciTI简介: SimpliciTI是TI开发的专门针对其CCxxxx系列无线通信芯片的网络协议。 它支持两种网络拓扑结构:严格的点对点通信和基于星型的网络拓扑结构,在星型连接中Hub点在SimplciTI被称为Access Point,简称AP.(AP就是常说的网关,数据中 ...…

查看全部问答>

TM4C 1294XL

老师给了一块tm4c 1294的launchpad,说让我们自己玩,但之前没接触过arm这些东西,接触过单片机;所以完全不知道怎么开始??这块板子能干嘛我都不知道,该怎么学习??完全处于迷茫状态??望大神相助,指点一二,让我有个方向!!非常感谢! …

查看全部问答>