历史上的今天
返回首页

历史上的今天

今天是:2025年06月03日(星期二)

正在发生

2018年06月03日 | 关于STM32的I2C硬件DMA实现

2018-06-03 来源:eefocus

网上看到很多说STM32的I2C很难用,但我觉得还是理解上的问题,STM32的I2C确实很复杂,但只要基础牢靠,并没有想象中的那么困难。

那么就先从基础说起,只说关键点,不涉及代码。

首先说I2C这个协议:协议包括START、ACK、NACK、STOP。尽管协议中规定START必须,其他几个非必须,但实际上其他三个仍旧非常重要。

主发从收:主 START -> 主发地址 -> 从 ACK -> (主发数据 -> 从 ACK (循环)) -> 主 STOP 或 主 START 启动下一次传输

这一过程中,主控SCL线,从只在ACK时控SDA线,其他时刻主控SDA线。

主收从发:主 START -> 从发地址 -> 主 ACK -> (从发数据 -> 主ACK (循环)) -> 接受至最后一个字节时,主 NACK -> 主 STOP 或 主 START 启动下一次传输

在这一过程中,主 START、主 ACK 时,主控总线;从发ACK时,主控SCL线,从控SDA线;在主接受数据时,虽然由主设备产生时钟,但从设备在数据未准备好时,拉低SCL线,这样主设备可知从设备未发送数据,从设备在数据准备好,可以发送的时候,停止拉低SCL线,这时候才开始真正的数据传输,换句话说,虽然时钟是由住设备产生,但在总线上未必就有时钟存在,这期间可以看做是从设备在控总线;当发送到最后一字节的时候,主设备发送NACK,从设备接受后,放弃对总线的控制。

STOP在单主环境下非必要,但在多主环境就非常必要,主控总线的设备发送STOP后,通知总线其他设备总线已经闲置。

以前的老器件很容易导致总线死锁,但现在的产品很多都带有超时机制,所以总线被锁的情况基本不怎么存在了。

下面要说的是STM32的寄存器,状态寄存器有两个,事件、错误状态一堆,看起来确实都算是有用,但实际使用的时候未必都要用到,还是要看情况,那么状态寄存器的清除就是个问题,有两个方法,一个是PE位禁止,不过除非在通讯结束,否则会扰乱总线上的电平,后果未知,争取的方法是:对于普通事件,先读SR1,再读SR2,如果是错误,那么就要再增加一个将SR1写 0 。想简单的话,那就用一个32位无符号整形,先读SR1,然后或上SR2左移16,再将SR1写 0,最后用这个变量和ST公司提供那个库中的状态比对就行了。

STM32的I2C和其他模块有些不同,其他模块完全可以交给DMA控制器,但I2C不行,必须结合中断或者IO方式,不建议IO方式,得等,万一出点岔子,被狗咬就麻烦了,所以最佳方式是结合中断。

主发时:PE位使能,PE位必须先使能,否则你操作不了其他位,然后使能ACK位,ITEVTEN位,DMA位,使能START位(这几个位可以同时置),然后进入事件中断,判断 I2C_EVENT_MASTER_MODE_SELECT ,将从地址写入 DR 寄存器,这里需要注意一点,就是从设备应答后,如果主设备不读状态寄存器,那么主设备就不会继续发送时钟来传输数据!这时候就体现出使用中断方式的另外一个好处,每次进中断的时候状态寄存器都要被读一下,不符合处理条件的你可以不管,但模块操作可以正确进行下去。数据开始传输时,控制就基本完全交给DMA控制器了,这时候一般也不会有什么状态中断产生,当然也不是绝对没有,有可能会有错误中断,也可能会由于MCU过忙产生事件中断,但这个事件一般影响不大,出错的时候你可能要处理一下。当数据传输完成后,会产生一个 I2C_EVENT_MASTER_BYTE_TRANSMITTED,注意这个不是只在数据传输完成才有!如果MCU过忙,DMA在I2C传输完上一个数据时,没能将下一个数据送到I2C,也会产生,这个事件只代表I2C位移寄存器内的数据被传完,而DR寄存器又没有被写入新的数据!所以,在这个状态产生的时候,要判断一下DMA的CNDTR寄存器,这是个递减的,如果是 0 ,那么就代表完成,可以去掉I2C的ACK位,使能STOP;或者是START进入下一轮数据传输。当然你不管也行,单主控下这不是必须的。

主收时:前面和主发时一样,但有一点要特别注意,那就是主控寄存器的LAST位,这个我在ST的库中没找到设置的函数,也可能是我没看仔细,反正我都是直接寄存器操作,不用库,除非是库中一些现成的状态可以用一下。这个位很重要,如果你只是一轮DMA传输,那么这个必须被置位,因为传输到最后一个字节的时候,主控需要发出NACK而不是ACK来通知从设备释放对总线的控制!LAST位就是做这个用的。主收的时候,传输完成就不是依靠I2C的事件中断来判断了,这个要通过DMA的IT_TC来完成,DMA中断产生后,做一下结束处理工作,最后别忘了清DMA的中断标志,不然会死循环在里面。

从发和从收这次就先不写了,相对简单一些,而且我感觉用的一般也不多吧,等有时间下次再写,另外再说一下,采用这种DMA+中断的方式,可以不去处理错误,操作开始的时候置一个标志,结束的时候清标注,在主程序中判断,如果超过一定时间标志还在那,那么就要考虑重置I2C了,一方面是错误状态太多……我真的判断不过来,也可能我比较懒吧,都给统一处理了。还有一个建议就是尽量采用STM32的硬件位域操作,因为一方面你有些操作要在主程序里,一些操作要在中断里,通常的读再写可能会导致错乱,位域操作就不会,即使不错乱,如果总线上产生错误,那么在操作某些位的时候会卡死在那,位域操作也不会卡死。

附一个位域操作宏

#define BITBAND_ADDRESS(x) (((x) & 0xF0000000) + 0x02000000 + (((x) & 0xFFFFF) << 5))
#define BITBAND(x,bit) (*(volatile uint32_t*)(BITBAND_ADDRESS((uint32_t)&(x)) + ((bit) << 2)))

使用 BITBAND(x,bit),x 代表 寄存器,bit 代表是操作哪个位。单独的一个位会被展开成一个32位整形,当然,你只能写 1 或 0

推荐阅读

史海拾趣

Fremont_Micro_Devices_USA公司的发展小趣事

Fremont Micro Devices USA公司的发展故事

故事一:初创与成长

Fremont Micro Devices USA(简称FMD或弗里蒙特微)的故事始于对高性能模拟及数模混合信号集成电路设计的执着追求。公司于多年前在加利福尼亚成立,起初是一家小型但充满活力的初创企业,专注于非易失性存储芯片、MCU芯片和电源管理芯片的研发。凭借其创始团队在半导体行业的深厚背景和技术专长,FMD迅速在消费电子、便携设备和通讯/网络领域崭露头角。通过持续的技术创新和产品研发,FMD逐渐积累了市场声誉,吸引了多家国际知名风险投资公司的关注和支持,为公司的快速发展奠定了坚实的基础。

故事二:技术突破与市场拓展

在FMD的发展历程中,技术突破是推动其不断前进的重要动力。公司研发团队拥有国内外顶尖半导体企业的工作经验,他们致力于全定制和半定制的数模混合芯片设计,不断提升产品的性能和可靠性。通过不断的技术积累和创新,FMD在Memory、MCU和PMIC等领域取得了显著的技术突破,拥有了业界领先的技术基础和IP积累。这些技术成果不仅提升了公司的市场竞争力,也为其在消费类、智能硬件、IOT和工控安防等应用领域的市场拓展提供了有力支持。

故事三:全球化布局与供应链管理

随着业务的不断扩张,FMD开始布局全球化市场。公司在美国本土建立了完善的研发和生产体系,同时在中国深圳设立了总部,并在香港设立了办事处,以便更好地服务亚太地区的客户。此外,FMD还积极与全球知名的电子元器件分销商合作,建立了稳定的供应链体系。通过优化供应链管理,FMD确保了产品的质量和交付速度,进一步提升了客户满意度和市场竞争力。

故事四:应对行业挑战与危机

在电子行业的发展过程中,FMD也面临着诸多挑战和危机。例如,全球半导体市场的周期性波动、国际贸易环境的变化以及新冠疫情的爆发等都对公司的运营和发展产生了一定的影响。然而,FMD凭借其强大的技术实力和市场敏锐度,积极应对这些挑战和危机。公司通过加强研发创新、优化产品结构、拓展新兴市场等方式,保持了业绩的稳定增长,并在逆境中实现了新的发展。

故事五:上市规划与未来发展

近年来,FMD在资本市场也取得了重要进展。公司已完成与中信证券的上市辅导协议签署,并在深圳证监局备案,拟在A股市场挂牌上市。这一举措不仅将为FMD带来更多的资金支持和发展动力,也将进一步提升公司的品牌影响力和市场竞争力。展望未来,FMD将继续秉承高性能、高可靠性和低成本的理念,加大在研发创新和市场拓展方面的投入力度,为客户提供更加优质的产品和服务,推动公司向更高层次的发展迈进。

Control Sciences Inc公司的发展小趣事

Control Sciences Inc公司在电子行业的初期,就以其技术创新而闻名。公司团队不断研发新的控制技术,成功打破了当时行业的局限。他们推出的首款智能控制系统,不仅提高了生产效率,还大大降低了能源消耗,为电子行业带来了巨大的经济效益。这一创新成果使得Control Sciences Inc在业界崭露头角,赢得了众多客户的青睐。

Capax Technologies Inc公司的发展小趣事

Capax Technologies Inc的崛起始于一次技术突破。公司研发团队成功开发出一种新型半导体材料,显著提高了电子设备的性能和能效。这一创新成果迅速在行业内引起关注,Capax Technologies Inc因此获得了大量订单和投资。随着技术的不断迭代和优化,Capax Technologies Inc逐渐在电子行业中崭露头角,成为一家备受瞩目的创新型企业。

HALO Electronics公司的发展小趣事

Capax Technologies Inc在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和节能技术生产电子产品。此外,Capax Technologies Inc还积极参与公益活动,为教育、扶贫等事业贡献力量。通过这些举措,公司不仅赢得了社会的认可和尊重,也为企业形象的提升和长期发展注入了正能量。

请注意,以上故事均基于虚构,不代表Capax Technologies Inc的实际发展历程。如果需要了解该公司真实的发展历程,建议查阅相关资料或联系公司获取更多信息。

得力(deli)公司的发展小趣事

得力公司最初以文具制造起家,但在电子科技快速发展的时代,公司意识到必须转型升级以适应市场需求。于是,得力决定进军专业门槛高、技术壁垒深的打印机产业。经过数年的科研攻坚,得力成功研发出首台激光工程机,并在随后几年内,发展成为国内唯一一家同时掌握激光、喷墨打印核心技术研发、生产能力的企业。这一跨越不仅展现了得力公司在科技创新方面的决心和毅力,也为其在电子行业树立了新的里程碑。

ETA Electric Industry Co Ltd公司的发展小趣事

近年来,ETA Electric Industry Co Ltd积极响应全球环保倡议,致力于实现可持续发展。他们优化了生产流程,减少了废弃物和污染物的排放。同时,公司还加大了对环保型电子元器件的研发力度,推出了一系列节能、环保的新产品。这些举措不仅提升了公司的社会形象,也为其在激烈的市场竞争中增添了新的优势。

上述五个故事,讲述了ETA Electric Industry Co Ltd在电子行业的发展历程。从起步之初的艰难,到技术创新的突破,再到市场拓展和质量管理的成功,最后到对环保和可持续发展的追求,每一步都体现了公司的成长和进步。

问答坊 | AI 解惑

变频器发生短路的原因及其解决方法

变压器短路事故情况 其事故主要表现形式为:       1) 外部多次短路冲击,线圈变形逐渐严重,最终绝缘击穿损坏居多;       2) 外部短时内频繁受短路冲击而损坏;       3) 长时 ...…

查看全部问答>

台湾清云科技大学TMS320C54X中文课件

台湾清云科技大学TMS320C54X中文课件…

查看全部问答>

430AD模块

本帖最后由 paulhyde 于 2014-9-15 04:16 编辑 超好用、超全面的AD底层程序,有了它,AD操作随心所欲!  …

查看全部问答>

发短信请假的童鞋们,想过老板的感受吗

春节回家,一位自己开公司的朋友聊起来,说也不知道现在的小孩是怎么回事,雇的一个小女孩请假从来都是用短信。而且比如说今天9点上班,她就8点45发短信给你,说要请假,弄得你一点儿办法都没有。跟她说过几次,还是这样。不过看着这小女孩平时做事 ...…

查看全部问答>

具体谈谈中国LED和国外LED封装的差异之六------------LED核心技术性能的差异!!!

LED器的性能核心指标主要表现在如下六方面 1亮度或流明值;2光衰;3失效率;4光效;5一致性;6光学分布特性 2、光衰 一般研究认为,光衰与芯片关联度不大,与封装材料与工艺关联度最大。影响光衰的封装材料主要有固晶底胶、荧光胶、外封胶等,影响 ...…

查看全部问答>

电脑通过并口转串口线接开发板好使么?

电脑没串口,只有个并口,想通过并口转串口线接开发板,这样做好用么?…

查看全部问答>

有关systick

 ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / 200);   那么systick应该是是每秒触发200次吧?,例程注释说是100次。看来例程里边的注释也是有错误的。…

查看全部问答>

关于我的e2world的生活臆断

准确的来讲,在“eeworld”里,我就是一位freshman,因为刚进来不久。看到这里面有这么多高手,还能下载那么多难能可贵的资料,我甚是欣喜.在这个电子行业里, 我还是一只菜鸟(或许菜鸟都谈不上)。想想自己都已经大三了,虽然对嵌入式系统很是感 ...…

查看全部问答>

upsd内部sram数据保存问题

如题,PC2脚接一电池,掉电情况下电池的电压下降得比较快(芯片功耗很大),当电压下降到低于2v时,就会丢数据了。哪位大哥了解的说一下啊…

查看全部问答>

做一个运放,把0832的电流输出转化为电压输出

各位,我想做一个运放,把0832的电流输出转化为电压输出,谁能提供点资料,我做了几个都不理想,用的是op07…

查看全部问答>