Silicon Labs(亦称“芯科科技”)EFM8 8位MCU系列产品的用户在开发产品时,需要进一步了解如何使用EFM8LB1 / EFM8BB3 I2C slave器件,使它看起来与SMBus的外设完全不同?对此,我们制作了一篇知识库文章,引导工程师们加快设计流程。欢迎往下阅读或点击“阅读原文”至Silicon Labs中文社区观看完整文章。
M8LB1 /BB3包含一个I2CSLAVE外设,它包含许多有助于高速传输的功能,但可能会使熟悉传统SMBus操作的用户感到困惑。在这里,我们简要介绍I2CSLAVE器件,并附加I2C SLAVE器件引导加载器示例代码以供参考。此代码示例是为EFM8BB3编写的,但如果需要,可以轻松移植到EFM8LB1。
I2C外设包含2字节FIFO和1字节移位寄存器,分别用于TX/ RX。I2C SLAVE器件支持自动ACK / NACK I2C master器件,由I2C0CN0寄存器的BUSY bit控制。默认情况下,BUSY为“1”,器件不响应I2Cmaster器件。发送到器件的所有I2C数据都将被NACKed。我们应将此BUSYbit设置为“0”,器件将确认I2Cmaster器件。 master设备持续向设备发送数据,设备自动向master设备确认最多3个ACK,因为FIFO中有两个字节,移位寄存器中有1个字节。然后SCL保持低电平以表示设备无法接收更多数据。我们应检查I2C0FCN1寄存器的RXE位,以了解FIFO中是否有数据,从I2C0DIN寄存器读取接收数据。
自动ACK功能使流量控制变得困难,如上所述,当RX FIFO已满时,SCL保持低电平,因此器件可以处理数据。 masster如何改变读/写方向呢?还有另一个功能可以帮助解决这种情况。 I2C0ADM寄存器的FACS位字段。默认值为“1”,表示FORCE_STRETCH。该位置为1时,时钟拉伸始终发生在地址字节的ACK之后,直到固件清零I2C0INT位。通过这种时钟拉伸功能,我们可以在读/写方向变化期间进行流量控制。
这里有一个基于AN945的I2C SLAVE引导加载程序示例代码,请查看它并参考I2C SLAVE机状态机的工作原理。 I2C Slave状态机在参考手册中的两个流程图(图17.7和图17.8)中可以看到,可以压缩到此状态解码表(参考手册中的表17.1 -
https://www.silabs.com/documents/public/reference-manuals/efm8bb3-rm.pdf)
I2C Bootloader的工作原理与SMBus Bootloader类似,详见AN945 -
https://www.silabs.com/documents/public/application-notes/an945-efm8-factory-bootloader-user-guide.pdf。附件中的boot_I2C.c文件显示了I2CSlave外设的使用方式 - 人们可能会注意到代码中只定义了三种状态,而上面显示的表描述了更多。有几个原因导致某些状态未包含在Bootloader代码中–
-
Bootloader代码的编写方式使得上述某些情况永远不会发生,即使它们发生,它们也可以在默认情况下捆绑在一起。我们主要关注RD,WR和RD+ NACK状态。
-
Bootloader的代码受大小限制。我们尝试将其放入一个Flash页面,这反过来意味着我们包含的代码只是Bootloader运行所必需的,而不是考虑永远不会发生的情况。
-
嵌入式
+关注
关注
5082文章
19104浏览量
304796 -
Silicon Labs
+关注
关注
11文章
328浏览量
62469 -
efm8lb1
+关注
关注
0文章
2浏览量
3243
原文标题:【MCU知识库】如何使用EFM8 8位MCU的I2C Slave外设
文章出处:【微信号:SiliconLabs,微信公众号:Silicon Labs】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论