历史上的今天
返回首页

历史上的今天

今天是:2024年09月27日(星期五)

正在发生

2021年09月27日 | 使用STM8L的硬件I2C(一)硬件I2C简介

2021-09-27 来源:eefocus

I2C是常用的外设协议,用途广泛。


很多时候为了实现简单,在STM8上大家都是用GPIO来模拟I2C工作。


STM8L自带硬件I2C,不过相对于模拟I2C的清晰简单,硬件I2C的处理要麻烦一些。


一是必须要理解各寄存器用法,二是使用STD库时还须理解STD抽象出的I2C接口和使用逻辑。


模拟I2C一般情况下使用问题不大,但若同时要处理其他外设或者对延时有要求,模拟方法就力不从心。


使用硬件I2C,是更好的办法。目前STM8L上利用硬件I2C的文章很少,


我来分享一下经验,总体分为以下几个部分介绍:

(一)硬件I2C的简介(本文)

(二)硬件I2C的事件和检测

(三)硬件I2C中断读写(流程及代码)

(四)硬件I2C的使用注意


1、I2C协议回顾

Start: 表示通信开始,SCL为高电平时SDA拉低

Stop: 表示通信结束,SCL为高电平时SDA拉高

Ack:收到8位数据时的回应

NAck:不再接收数据时的回应

ReStart:没有Stop时又一次发出的Start

数据收发:SCL低电平时SDA跳变且只能在SCL低时跳变、SCL高电平时SDA要维持供采样

2、STM8L的I2C功能

STM8L支持硬件I2C,但只提供了一个I2C硬件接口,即I2C1。

其SCL pin为PC1,SDA pin为PC0。

支持Master和Slave, 支持标准频率100KHz和高速400KHz两种速率。

另外,作为高级功能,还支持I2C的SMB模式以及DMA方式传输数据。


3、STM8L的I2C寄存器

所谓硬件I2C,无非是MCU内部实现了I2C协议,由硬件执行控制逻辑。

而MCU对外的接口只有寄存器,所以STM8L提供了很多寄存器用于在各个方面和内部I2C实现做交互。

包含控制、状态、数据缓冲、中断等等方面。具体如下:


控制寄存器:


Control register 1 (I2C_CR1)

Control register 2 (I2C_CR2)

I2C时钟寄存器:


Frequency register (I2C_FREQR)

地址寄存器:(支持10位地址所以有2个地址寄存器)


Own address register LSB (I2C_OAR1L)

Own address register MSB (I2C_OAR1H)

Own address register 2 (I2C_OAR2)

数据寄存器:所有数据发送和接收都用这个寄存器,包括I2C外设地址


Data register (I2C_DR)

状态寄存器:SR1和SR3为通信状态、SR2主要错误状态


Status register 1 (I2C_SR1)

Status register 2 (I2C_SR2)

Status register 3 (I2C_SR3)‘

中断和DMA寄存器:控制中断类型(Event/Buffer/Error)


Interrupt and DMA register (I2C_ITR)

时钟频率控制寄存器:用于设置I2C通信频率


Clock control register low (I2C_CCRL)

Clock control register high (I2C_CCRH)

上升沿控制寄存器:I2C_Init函数会自动设置该寄存器


TRISE register (I2C_TRISER)

Pakcet校验寄存器:硬件I2C支持CRC校验,开启该功能时使用此寄存器


PEC register (I2C_PECR)

全部寄存器:



其中I2C通信控制中最常用的寄存器是:

CR1/CR2/SR1/SR3

推荐阅读

史海拾趣

迪一电子公司的发展小趣事

作为一家有远见的企业,迪一电子公司始终关注社会责任和可持续发展。公司积极参与环保和公益活动,推动绿色生产和可持续发展。同时,公司还注重员工培训和福利保障,为员工提供良好的工作环境和发展机会。这些举措不仅提升了公司的社会形象,也增强了员工的归属感和凝聚力。

Advanced Microelectronic Products Inc公司的发展小趣事

Advanced Microelectronic Products Inc(以下简称AMP公司)在电子行业中崭露头角,源于其一次关键的技术突破。公司研发团队成功开发出一种新型高效能、低功耗的芯片,该芯片在智能手机市场具有广阔的应用前景。凭借这一技术优势,AMP公司迅速与多家手机制造商建立合作关系,实现了市场的大规模扩张。公司随后进一步加大研发投入,不断推出创新产品,巩固了其在行业内的领先地位。

EWC Controls公司的发展小趣事

在电子行业中,EWC Controls公司选择了工业自动化控制这一细分领域作为切入点。通过深入了解行业需求和痛点,公司专注于研发和生产符合市场需求的高品质产品。例如,在食品加工行业,EWC Controls公司针对温度、湿度等关键参数的控制需求,开发出了一套高效稳定的控制系统,帮助食品加工企业提高了生产效率和产品质量。这种深耕行业、专注细分领域的策略使得EWC Controls公司在市场中逐渐崭露头角。

高创科技(gotrend)公司的发展小趣事

随着公司规模的不断扩大和技术实力的增强,EWC Controls公司开始拓展全球市场。公司积极参加国际展会和交流活动,与全球各地的客户建立联系和合作。同时,EWC Controls公司还针对不同国家和地区的市场需求和法律法规要求,对产品进行适应性改进和优化。这些努力使得公司的产品逐渐走向国际市场,并赢得了良好的口碑和市场份额。

Adaptive Interconnect Electronics, Inc. [AIE]公司的发展小趣事

随着电子技术的飞速发展,AIE公司不断投入研发力量,推出了一系列具有创新性的测试配件产品。其中,AIE金属探头以其高精度、高稳定性的特点,受到了市场的广泛认可。此外,AIE还针对汽车行业推出了ADK汽车诊断试剂盒,为汽车维修和诊断提供了便捷、高效的解决方案。这些技术创新和产品升级不仅提升了AIE的市场地位,也推动了电子测试技术的不断进步。

ENTRELECUK公司的发展小趣事

面对数字化转型的浪潮,ENTRELEC UK积极拥抱新技术,推动智能制造的发展。公司引入先进的自动化设备和信息化系统,提高生产效率和产品质量。同时,公司还加强了对大数据和人工智能技术的应用研究,以便更好地满足客户的需求并提供更优质的服务。这些努力使ENTRELEC UK在数字化转型的浪潮中保持领先地位。

请注意,以上故事均为虚构,但基于ENTRELEC UK公司的一般信息和电子行业的普遍趋势进行创作。如有需要,建议查阅相关新闻报道或公司官方资料以获取更准确的信息。

问答坊 | AI 解惑

谁有 MEMORY STICK规范?

我正在研究memory stick和magicgate, 谁有规范, 有酬谢! 请联系cenuserwen@gmail.com…

查看全部问答>

$$$咨询:WINCE下手写软件的价格

    我公司一产品上使用了windows ce 4.2 net 版本, 处理器为ARM4VR,分辨率为240*320,现在想寻一款手写软件, 现咨询一下购买这种软件要多少钱?     胡先生   13320807449   QQ:562850914  &n ...…

查看全部问答>

新手上路,求助

本人是个新手,想自学单片机,但是不知道该怎么入手,有高手介绍下经验么?上网搜了,可是还是没有系统的认识,另外,现在学什么类型的,更容易上手,有知道的帮忙回答下,万分感谢~…

查看全部问答>

WINCE编译不了,说找不到recorder.exe

Warning: Found duplicate entry \'binfs.dll      NK               C:\\WINCE420\\PUBLIC\\11\\RelDir\\SAMSUN~1\\binfs.dll 00000007\' ... skipping Error: Could not ...…

查看全部问答>

Wince 是否支持大页nand flash?文件格式是dosfs吗?

Wince是否支持大页nand flash?文件格式是dosfs吗? Wince支持的Nand的大页模式和小页模式是同一个文件系统吗?…

查看全部问答>

Zstack学习经验点滴:如何使用OSAL的事件?

如何使用OSAL的事件?OSAL通过一个16位宽度的数组来管理事件,意味着OSAL最多可以支持16个事件,其中最高位(0x08000,SYS_EVENT_MSG)系统保留,用户可以使用的事件有15个。事件的使用很简单:1)需要找个地方定义事件的ID,实际上是指定该事件占 ...…

查看全部问答>

CAN一次最多发多少字节数据?

TxMessage.DLC最多是8字节,我一次要发24个。分三次发,发送程序如下TestStatus CAN_Polling(void){  u32 i = 0;  u8  m=0;  //每次发送的字节数  u8  n=0; ...…

查看全部问答>

交流群创建喽

本人非常之喜欢这个论坛,所以私自创建了一个群, 群号:168221728 大家可以加这个号,方便交流 …

查看全部问答>

uc/os求助

如何建立两个任务,一个检测两次按键的时间间隔,并将此值存放在全局变量KTime中,另一个任务按此时间间隔定时向电脑屏幕发出字符“M\"及该时间间隔信息??????????????…

查看全部问答>