【使用C++开发MCU】03-IIC实例之UML画个图展现设计(分析NXP S32SDK IIC Driver)

S32K144:12.LPI2C驱动AT24C16 1.打开官方例程 2.修改引脚配置 3.时钟可按照实际情况修改,也可不用更改,本例时钟不做更改 4.配置LPI2C模块 设置从机地址:从机地址如下图所示,低三位表示为AT24C16的块地址,AT24C16将2KB的内存空间分为8个块,每个块256个字节的数据,此处先读写块0的内存,故将地址设置为0x50。 I2C频率设置:此处使用标准模式速率为100KHz。按照AT24C16手册,也可配置为快速模式400KHz或1MHz,可按照需求配置。 5.按页写入数据到AT24C16 按照时序,先发送器件地 阅读详情

为什么用UML画图

茂哥是初入职时的导师,他评审检视我的代码、指导我的设计(使用UML),在此,致敬茂哥!

当时对UML体会不深,同样的随着工作的积累,发现UML是一个好的工具,来表达、呈现和分析各方的设计。

本文主题

使用UML进行代码分析,主要是NXP官方S32SDK,该SDK真是一个不错的东西,顺带画个图描叙一下使用C++开发MCU专栏中IIC实例的Demo调用关系。

主业务流程

主业务流程
主业务代码实现详见【使用C++开发MCU】IIC实例之读取温度传感器(基于NXP S32K146 MCU)
。
这里我们实现了一个温度传感器TMP类CTmp,一个I2C接口II2C,应用向tmp对象请求温度,tmp对象调用I2C的读取接口,我们C++版本的IIC驱动再封装了NXP官方的驱动(为了省事,当然也可以全部用C++实现)。

下面两个小结则用UML分析NXP官方的驱动,只展现了中断方式的。

写入接口分析

写入数据
调发送接口,对驱动状态(state)进行赋值,排队发送从机地址,发送起始信号,发送数据,设置TXFIFO,启动中断。然后触发了中断(TXFIFO==0),中断中关闭发送中断,结束。

调用LPI2C_Cmd_MasterTransmit将字节流写入MTDR,将会立即启动发送。
但S32SDK可能考虑到数据太多上次还没发完TXFIFO不够等因数,又实现了一个软件Queue队列,增加了一个排队发送函数LPI2C_DRV_MasterQueueData,该函数判断软件队列是否为空,为空则直接调用LPI2C_Cmd_MasterTransmit直接写硬件TXFIFO立即发送。

若上述是直接写硬件TXFIFO,接下来设置LPI2C_Set_MasterTxFIFOWatermark为0,则必然进一次中断,在中断中调用LPI2C_Set_MasterInt(baseAddr, LPI2C_MASTER_TRANSMIT_DATA_INT, false);关闭发送中断。

若上述是写入软件Queue队列,后续设置TxFIFOWatermark为0,也必然进一次中断,进入中断后,先将软Queue中数据调用LPI2C_Cmd_MasterTransmit发完,再将txBuff调用LPI2C_DRV_MasterQueueData发送,最终txSize为0时,结束发送(发送停止信号),发送相关信号量与事件。

通过上述的软Queue,避免了上层用户发送IIC数据时判断TXFIFO满不能发送,然后死等这种情况,S32SDK通过合理的软队列搭配中断这种套餐,很好的实现了异步发送。通过提供LPI2C_DRV_MasterSendDataBlocking这种Blocking接口,在异步接口的基础上又很好的实现了同步发送。

PS:文字后续又进行了补充(2021/12/22),UML图中可能不能很好的正确表达。

读取接口分析

读取数据
调读取接口,对驱动状态(state)进行赋值,排队发送从机地址,发送起始信号,发送数据,设置RXFIFO的Watermark为我们读取数据的大小,使能中断。

若总线上接收到数据,将触发了中断,中断中读取MRDR到缓冲区rxBuff,然后收尾。

S32SDK同样也考虑到了rxSize大于RXFIFOSIZE的情况,在中断中对Watermark也进行调节。同上写入接口分析分析小节,很好的实现了异步接收。

结语

我的UML功底不强,欢迎指导。

【使用C++开发MCU】01-IIC实例之接口概述(基于NXP S32K1 MCU) 本文基于S32SDK描述C++版本IIC Driver所需功能,供上层用户使用。 阅读详情

相关推荐

S32K144之SDK版:IIC模块使用(多从机)

目录 1.添加IIC模 2.配置IIC模块​ 3.配置EDMA模块 ​4.代码 1.添加IIC模 2.配置IIC模块 3.配置EDMA模块 4.代码 EDMA_DRV_Init(&dmaController1_State, &dmaController1_InitConfig0, edmaChnStateArray,edmaChnConfigArray, EDMA_CONFIGURED_CHANNELS_COUNT); ///默认第一个从机地址 I2C_Maste

balance_c的博客 3535

S32DS踩坑日记四-增加I2C

LPI2C_DRV_MasterReceiveDataBlocking函数的波形是这样(因为RTC地址设置的不对,所以没有应答)LPI2C_DRV_MasterSendDataBlocking函数的波形是这样(因为RTC地址设置的不对,所以没有应答)之后又打算先尝试着把RTC调试出来,然后就遇到莫名奇妙的问题了。然后又重新编译了几次,为什么是几次,因为前两次不知道为什么不行,后面发现示波器有波形了。RTC采用的MCP7940N芯片,是I2C接口的。波形不好看,示例工程中也是这样的,继续调试,

u011226925的博客 806

S32K1XX_IIC通信之AT24C02

基于AT2402这块EEPROM芯片,介绍S32K1XX的IIC通信的驱动搭建与是实现

weixin_43445379的博客 1651

S32K144从入门到入土(4)lpuart、lpiic、lpspi模块

本篇讲述了常见的通信协议,概述了同步异步通信的区别。SPI、IIC和UART是三种常见的串行通信协议。SPI(Serial Peripheral Interface)是一种高速、全双工、同步的串行通信协议,用于连接微控制器和外设,比如闪存、传感器、LCD显示器等。SPI协议使用至少4根线(时钟线、数据输入线、数据输出线、从设备选择线),能够实现高速数据传输和多设备通信。

qq_51350904的博客 4168

NXP S32K146 CAN通讯 TJA1043(一)

今天来调一下nxp S32K146的CAN通讯,硬件部分使用的是NXP TJA1043 CAN通讯芯片先翻译一下数据手册。 TJA1043 有这么几个特点吧: ①几种保护和诊断功能,包括母线短路检测和电池连接检测 ②CANFD快速阶段以高达5Mbit/s的数据速率进行可靠的通信。 ③用于节点诊断和故障控制的仅监听模式 ④传输数据(TXD)主要超时功能与诊断(如何实现?) ⑤TJA1043支持五种操作模式。控制引脚STB_N和EN用于选择操作模式。 在模式之间切换允许通过引脚ERR_N访问许多诊断标志。 其他

woshinibaba321的博客 2万+

s32k312之模拟iic功能实现

iic是比较常用的通讯方式,在嵌入式里面很是常见,一般硬件iic 不够用的时候选择模拟iic的时候也比较常见,有些人为了移植方便大都也喜欢用模拟iic,nxp的这款s23k312的模拟iic开发起来很是方便,因为312自带了flexio,有这个模块的加入,模拟iIC的开发以及调试都变得方便,节约了工程师的开发时间和调试时间,希望大家一起交流!

S32K144通过IIC操作EEPROM(24C02)读写

然而实际通过IIC操作EEPROM(24C02)的时候,调试中遇到了很多莫名其妙的问题,代码总是运行异常。那么异常的产生原因是什么,是本文描述的重点。最后,回归到我们的问题根源,通过IIC操作24C02写时会出现莫名奇妙的问题,问题在于24C02写入数据时会有一定的耗时,因此需要加入一定的延时。24C02的7位器件地址为0x50,这部分通过"slaveAddress" 全局搜索源码可以发现。1)容量是2Kbit即256字节,每页8字节,共32页。3)写操作分为字节写和页写两种方式。

lnniyunlong99的专栏 2313

S32K146EVB-Q144.pdf

S32K146EVB-Q144.pdf

STM32笔记(3)时钟系统简介(改)

在 STM32 中,有五个时钟源(即时钟的来源),为 HSI、 HSE、 LSI、 LSE、 PLL。 从时钟频率来分可以分为高速时钟源( HIS, HSE 以及 PLL)和低速时钟源( LSI 和 LSE ),来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源 ,HSI,LSI,PLL是内部时钟。 晶振:集成了晶体及振荡电路的有源器件 作用:晶振是给单片机提供工作信号脉冲的。这个脉冲就是单片机的工作速度。 STM32 的时钟系统图

weixin_47447179的博客 1794

i2cdemo:演示I2C接口的基本使用

I2Cdemo 该项目演示了I2C接口的基本使用 硬件准备 在运行该项目之前,我们要准备如下元器件: 树莓派开发板 1块 面包板 1块 bmp280传感器 1个 杜邦线(公对母)若干 广告时间咯:如果你还没有自己的开发板和元器件,到我们的“1024工场微店”来逛逛一逛吧(文章底部二维码),这里能一次性有买到你想要的! 电路图 构建运行 在Android Studio中,点击Run即可。 如果你通过gradle命令进行构建,则: gradle installDebug adb shell am start com.chengxiang.i2cdemo/.MainActivity 运行效果 按照上面的电路图,搭建电路如下: 运行程序,通过传感器检测的温度显示在屏幕上: 1.新技术,新未来!欢迎大家关注“1024工场”微信服务号,时刻关注我们的最新的技术讯息。 2.抛弃各种找元器件的烦恼,来“1

嵌入式linux 用户空间 测试 I2C总线 demo程序

用户空间APP测试i2c接口或总线,用于嵌入式设备驱动开发或者应用开发都可以。

S32K1xx使用i2c驱动oled

直奔主题,基于S32K118,根据SDK配置i2c驱动,从新建工程开始,指导大家实现驱动oled屏幕的功能,后续将驱动导入到原有工程中即可。

weixin_41584397的博客 1073

FLEXIOlpi2c.rar_FlexIO_S32K144 I2C_S32k142 i2c_believedyhr

S32K144 配置FLEXIO 模拟I2C通信代码

笔记四:linux下IO口模拟实现I2C协议

一、i2c总线、模拟

peng_fp的博客 2737

电容式麦克风:从原理到实际电路波形解析

本文深入解析电容式麦克风的工作原理,从核心的振膜与背板结构、电荷锁定机制到场效应管放大器的作用。通过实物拆解与等效电路分析,阐明声音振动如何转换为电压信号,并指导如何用示波器实测波形,直观展现声电转换过程,适合电子爱好者和音频技术学习者。

Black的专栏 1080

大语言模型无代码构建知识图谱概述

由示例可以看出,大语言模型的泛化能力能够非常精准的抽取文本中的实体、关系等知识信息。其能够大大提升知识提取的效率与准确性。HuggingFists低代码平台的出现进一步促进了知识图谱构建的效率。它大幅降低了知识图谱构建人员的技术要求,使得从事该工作的人员有了更大的选择范围。不断下降的构建成本,意味着可以有更多的客户享受到知识图谱带来的业务价值。

colorknight的专栏 1817

基于RT1052与外设AT24C02的I2C通信demo

注:配置IO时不能配置为开漏模式

weixin_43947512的博客 480

QT | QT打包生成单个EXE文件

1.以release方式运行程序 2.在release文件夹中找到.exe文件 如果没有找到exe,可能是因为在项目中勾选了shadow build,你可以在构建目录中找到exe 3.将exe放在一个新建的文件夹中,因为待会儿会生成很多dll文件 4.点击电脑左下角搜索QT,打开Qt 5.8 for Desktop (MinGQW 5.3.0 32bit) 5.进入刚刚新建的文件夹,输入wi...

⊳ideal world⊲~ヽ(゚︺゚)Hi 1238

第15章 Linux I2C核心、总线与设备驱动之I2C设备驱动实例

15.6 AT24xx EEPROM(电可擦除可编程只读存储器)的I2C设备(外设)驱动实例drivers/misc/eeprom/at24.c文件支持大多数I2C接口的EEPROM,正如之前所述,一个具体的I2C设备驱动由i2c_driver的形式来组织,用于将设备挂接在I2C总线,组织好以后,再完成设备本身所属类型的驱动。对于EEPROM,设备本身的驱动以bin_attribute二进制sys...

xiezhi123456的博客 539

如何通过CAD图中的坐标来确定是哪个坐标系

地理坐标系:为球面坐标。参考平面地是椭球面,坐标单位:经纬度。以地球参考为例,坐标系就相当于整个地球,而地理坐标系就是椭球状的完整的立体地球。所以我们可以看到生活中的数据与地图是一定含有地理坐标系的,因为他是客观上来说确确实实存在的。投影坐标系:为平面坐标。参考平面地是水平面,坐标单位:米、千米等。这就相当于把地球当成一个橘子,然后一刀切开,把橘子皮平面铺开,这个过程就是地理投影的过程。严谨一点来说就是建立一个参考系统,按照对应位置把椭球体投射到平面。那坐标系统主要有那些呢?北京54。

vjmap的博客 2万+

OpenHarmony v4.1 Release设置应用随系统自动启动

OpenHarmony 4.1 版本中的 Ability Manager Service (AMS) 提供了应用自启动管理功能,允许系统控制哪些应用可以在系统启动时自动运行。这需要以下两个主要步骤:启用系统的自启动管理支持开发一个系统应用来管理自启动配置。

afufufufu的博客 1899

s32k312之硬件iic功能实现

s32k312之硬件iic调试心得

weixin_40655068的博客 880

2025年普通人转向人工智能运维(AIOps)学习建议(附最新技术实践与资源)

AIOps不仅是技术的叠加,更是运维流程的重构。建议通过“学习-实践-反馈”循环,逐步从工具使用者成长为解决方案设计者。如需完整资源链接,可访问上述推荐的优快云博客及GitHub仓库。

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 3096
上一篇: 【使用C++开发MCU】02-IIC实例之读取温度
下一篇: 【使用C++开发MCU】00-专栏前言
mcucpp
博客等级 码龄12年 56粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值