当前位置: 首页 > news >正文

【NXP-MCXA153】i2c驱动移植

介绍

‌I2C总线由飞利浦公司开发,是一种串行单工通信总线,它主要用于连接微控制器和其他外围设备并在总线上的器件之间传送信息(需要指定设备地址);常见的i2c设备有EEPROM、触摸屏、各种IoT传感器、时钟模块等,通常由两根线组成:SCL和SDA,使用时需要接上拉电阻,常见的通信速率为100k和400k

移植流程

以i2c0为例

① 在board里边添加相应的外设:配置i2c0外设为复位状态、设置GPIO引脚功能

② 添加相应的Kconfig开关,用以指示相应的外设开启与关闭(本质是通过宏定义或者条件编译的方式)

③ 根据SDK_2_14_2_FRDM-MCXA153提供的i2c示例工程编写i2c总线驱动,需要实现2个关键的函数

  • lpc_i2c_xfer
  • rt_hw_i2c_init

④ 添加相应的库文件依赖:fsl_lpi2c.c、fsl_lpi2c_edma.c

开发板引脚对应关系

序号GPIOfunction
1P3_27SCL
2P3_28SDA

驱动文件

pin_mux.c

BOARD_InitPins函数里加入以下代码

#ifdef BSP_USING_I2C0													const port_pin_config_t port3_27_pin34_config = {/* Internal pull-up resistor is enabled */kPORT_PullUp,/* Low internal pull resistor value is selected. */kPORT_LowPullResistor,/* Fast slew rate is configured */kPORT_FastSlewRate,/* Passive input filter is disabled */kPORT_PassiveFilterDisable,/* Open drain output is enabled */kPORT_OpenDrainEnable,/* Low drive strength is configured */kPORT_LowDriveStrength,/* Normal drive strength is configured */kPORT_NormalDriveStrength,/* Pin is configured as LPI2C0_SCL */kPORT_MuxAlt2,/* Digital input enabled */kPORT_InputBufferEnable,/* Digital input is not inverted */kPORT_InputNormal,/* Pin Control Register fields [15:0] are not locked */kPORT_UnlockRegister};/* PORT3_27 (pin 34) is configured as LPI2C0_SCL */PORT_SetPinConfig(PORT3, 27U, &port3_27_pin34_config);const port_pin_config_t port3_28_pin33_config = {/* Internal pull-up resistor is enabled */kPORT_PullUp,/* Low internal pull resistor value is selected. */kPORT_LowPullResistor,/* Fast slew rate is configured */kPORT_FastSlewRate,/* Passive input filter is disabled */kPORT_PassiveFilterDisable,/* Open drain output is enabled */kPORT_OpenDrainEnable,/* Low drive strength is configured */kPORT_LowDriveStrength,/* Normal drive strength is configured */kPORT_NormalDriveStrength,/* Pin is configured as LPI2C0_SDA */kPORT_MuxAlt2,/* Digital input enabled */kPORT_InputBufferEnable,/* Digital input is not inverted */kPORT_InputNormal,/* Pin Control Register fields [15:0] are not locked */kPORT_UnlockRegister};/* PORT3_28 (pin 33) is configured as LPI2C0_SDA */PORT_SetPinConfig(PORT3, 28U, &port3_28_pin33_config);
#endif

board/Kconfig

加入i2c0相关配置

menuconfig BSP_USING_I2Cconfig BSP_USING_I2Cbool "Enable I2C"select RT_USING_I2Cdefault yif BSP_USING_I2Cconfig BSP_USING_I2C0bool "Enable I2C0"default yendif

drv_i2c.c

i2c驱动层修改如下

/** Copyright (c) 2006-2024, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2023-08-17     hywing       The first version*/#include <rtdevice.h>
#include "fsl_lpi2c.h"
#include "fsl_lpi2c_edma.h"
#include "fsl_edma.h"#ifdef RT_USING_I2Cenum
{
#ifdef BSP_USING_I2C0I2C0_INDEX,
#endif
};#define i2c_dbg                 rt_kprintfstruct lpc_i2c_bus
{struct rt_i2c_bus_device    parent;LPI2C_Type                  *I2C;clock_attach_id_t           clock_attach_id;clock_div_name_t            clock_div_name;clock_name_t                clock_src;uint32_t                    baud;char                        *name;
};struct lpc_i2c_bus lpc_obj[] =
{
#ifdef BSP_USING_I2C0{.I2C = LPI2C0,.baud = 100000U,.clock_attach_id = kFRO12M_to_LPI2C0,.clock_div_name = kCLOCK_DivLPI2C0,.clock_src = kCLOCK_Fro12M,.name = "i2c0",},
#endif
#ifdef BSP_USING_I2C1{.I2C = LPI2C1,.baud = 100000U,.clock_attach_id = kFRO12M_to_FLEXCOMM1,.clock_div_name = kCLOCK_DivFlexcom1Clk,.clock_src = kCLOCK_Fro12M,.name = "i2c1",},
#endif
#ifdef BSP_USING_I2C2{.I2C = LPI2C2,.baud = 100000U,.clock_attach_id = kFRO12M_to_FLEXCOMM2,.clock_div_name = kCLOCK_DivFlexcom2Clk,.clock_src = kCLOCK_Fro12M,.name = "i2c2",},
#endif
};static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num)
{struct rt_i2c_msg *msg;lpi2c_master_transfer_t xfer = {0};rt_uint32_t i;rt_ssize_t ret = 0;struct lpc_i2c_bus *lpc_i2c = (struct lpc_i2c_bus *)bus;for (i = 0; i < num; i++){msg = &msgs[i];if (msg->flags & RT_I2C_RD){xfer.slaveAddress = msg->addr;xfer.direction = kLPI2C_Read;xfer.subaddress = 0;xfer.subaddressSize = 0;xfer.data = msg->buf;xfer.dataSize = msg->len;if(i != 0)xfer.flags = kLPI2C_TransferRepeatedStartFlag;elsexfer.flags = kLPI2C_TransferDefaultFlag;if (LPI2C_MasterTransferBlocking(lpc_i2c->I2C, &xfer) != kStatus_Success){i2c_dbg("i2c bus read failed!\n");return i;}}else{xfer.slaveAddress = msg->addr;xfer.direction = kLPI2C_Write;xfer.subaddress = 0;xfer.subaddressSize = 0;xfer.data = msg->buf;xfer.dataSize = msg->len;if(i == 0)xfer.flags = kLPI2C_TransferNoStopFlag;elsexfer.flags = kLPI2C_TransferDefaultFlag;if (LPI2C_MasterTransferBlocking(lpc_i2c->I2C, &xfer) != kStatus_Success){i2c_dbg("i2c bus write failed!\n");return i;}}}ret = i;return ret;
}static const struct rt_i2c_bus_device_ops i2c_ops =
{lpc_i2c_xfer,RT_NULL,RT_NULL
};int rt_hw_i2c_init(void)
{int i;lpi2c_master_config_t masterConfig;for(i=0; i<ARRAY_SIZE(lpc_obj); i++){CLOCK_SetClockDiv(lpc_obj[i].clock_div_name, 1u);CLOCK_AttachClk(lpc_obj[i].clock_attach_id);LPI2C_MasterGetDefaultConfig(&masterConfig);masterConfig.baudRate_Hz = lpc_obj[i].baud;LPI2C_MasterInit(lpc_obj[i].I2C, &masterConfig, /*CLOCK_GetFreq(lpc_obj[i].clock_src)*/CLOCK_GetLpi2cClkFreq());lpc_obj[i].parent.ops = &i2c_ops;rt_i2c_bus_device_register(&lpc_obj[i].parent, lpc_obj[i].name);}return RT_EOK;
}
INIT_DEVICE_EXPORT(rt_hw_i2c_init);#endif /* RT_USING_I2C */

SConscript

Libraries/MCXA153/SConscript文件里边加上以下代码

if GetDepend('BSP_USING_I2C'):src += ['MCXA153/drivers/fsl_lpi2c.c']src += ['MCXA153/drivers/fsl_lpi2c_edma.c']

测试用例

打开使能i2c0驱动

在这里插入图片描述

使能ssd1306模块并连接SCL(P3_27)、SDA(P3_28)引脚

在这里插入图片描述
拉取更新软件包,并导出MDK5工程

pkgs --update
scons --target=mdk5

在msh终端输入ssd1306_TestAll,屏幕输出效果如下,说明i2c BSP驱动已经正确移植

在这里插入图片描述

相关文章:

【NXP-MCXA153】i2c驱动移植

介绍 ‌I2C总线由飞利浦公司开发&#xff0c;是一种串行单工通信总线&#xff0c;它主要用于连接微控制器和其他外围设备并在总线上的器件之间传送信息&#xff08;需要指定设备地址&#xff09;&#xff1b;常见的i2c设备有EEPROM、触摸屏、各种IoT传感器、时钟模块等&#x…...

C++(11)类语法分析(2)

C(10)之类语法分析(2) Author: Once Day Date: 2024年8月17日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …...

数字验证每日十问--(3)

深拷贝和浅拷贝的区别&#xff1f; 当只拷贝对象中的成员变量和声明的句柄时&#xff0c;称为浅拷贝。浅拷贝只把对象中的句柄复制了&#xff0c;却没有复制句柄b所指向的对象。这会导致复制后&#xff0c;a2中的句柄b 和 a1 中的句柄b指向同一个对象&#xff0c;如果a2中的句…...

22.给定 n 对括号,实现一个算法生成所有可能的正确匹配的括号组合

22. Generate Parentheses 题目 给定 n 对括号,编写一个函数生成所有可能的正确匹配的括号组合。 例如,当 n = 3 时,可能的组合集合为: ["((()))","(()())","(())()","()(())","()()()" ]题目大意 给出 n 代表生成…...

检测到目标URL存在http host头攻击漏洞

漏洞描述 修复措施 方法一&#xff1a; nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求&#xff0c;如果没有显式定义&#xff0c;则会选取第一个定义的 server 作为 default_server。 server { …...

C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧

文章目录 &#x1f4dd;基本框架&#x1f320; 构造和销毁&#x1f309;vector()&#x1f309;vector(const vector& v)&#x1f309;vector(size_t n, const T& value T())&#x1f309;赋值拷贝构造&#xff1a;vector<T>& operator(vector<T> v)&a…...

018、钩子函数 mounted和beforeDestroy、父组件向子组件传递参数 props 的使用

文章目录 1、mounted 和 beforeDestroy1.1、mounted1.2、beforeDestroy 2、父组件向子组件传递参数 props2.1、子组件定义2.2、父组件调用子组件并传参 3、完整例子3.1、父组件 Tags.vue3.2、子组件 TagsMenu.vue3.3、效果图 1、mounted 和 beforeDestroy 1.1、mounted mount…...

xlnt在Windows中的dll,lib生成

前言 花了半天时间想要把xlnt 集成到VS2022 Cmake项目中,以我目前掌握的能力,Cmake语法对于我来说难懂,对于只是使用过Cmake编译MySQL,或是其他lib,dll库的小白来说,不应该为了显示自己能力多么出众,强行去配置一些程序内容。 生活中没有绝对的事情,有舍有得. https://github…...

【网络】私有IP和公网IP的转换——NAT技术

目录 引言 NAT工作机制​编辑 NAT技术的优缺点 优点 缺点 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 公网被子网掩码划分为层状结构&#xff0c;一个公网IP的机器又可以用很多私有IP搭建内网。在日常生活场景中用的都是私有IP&#xff0c;例如手机&#xff0c;…...

java 面试 PDF 资料整理

“尊贵的求知者&#xff0c;作者特此献上精心编纂的Java面试宝典PDF&#xff0c;这份资料凝聚了无数面试精华与实战经验&#xff0c;是通往Java技术殿堂的钥匙。若您渴望在Java编程的求职之路上稳健前行&#xff0c;只需轻轻一点&#xff0c;完成这象征支持与认可的一键三联&am…...

初步认识Linux系统

前言 Linux系统具有许多优点&#xff0c;不仅系统性能稳定&#xff0c;而且是开源软件。其核心防火墙组件性能高效、配置简单&#xff0c;保证了系统的安全。在很多企业网络中&#xff0c;为了追求速度和安全&#xff0c;Linux不仅仅是被网络运维人员当作服务器使用&#xff0c…...

JavaScript AI 编程助手

JavaScript AI 编程助手 引言 随着人工智能技术的飞速发展&#xff0c;编程领域也迎来了前所未有的变革。JavaScript&#xff0c;作为全球最流行的编程语言之一&#xff0c;其与AI的结合为开发者带来了巨大的便利和无限的可能性。本文将探讨JavaScript AI编程助手的定义、功能…...

达梦数据库的系统视图v$datafile

达梦数据库的系统视图v$datafile 达梦数据库的V$DATAFILE 是一个重要的系统视图&#xff0c;提供了有关数据库数据文件的信息。 V$DATAFILE 系统视图 V$DATAFILE 视图用于显示数据库中每一个数据文件的详细信息。通过查询这个视图&#xff0c;数据库管理员可以了解数据文件的…...

Triton/window安装: triton-2.0.0-cp310-cp310-win_amd64.whl文件

下面这个github仓&#xff1a; https://github.com/PrashantSaikia/Triton-for-Windows/tree/main 安装命令也很简单&#xff0c;下载到本地后运行: pip install triton-2.0.0-cp310-cp310-win_amd64.whl...

应急响应-DDOS-典型案例

某单位遭受DDoS攻击事件如下 事件背景 2019年2月17日&#xff0c;某机构门户网站无法访问&#xff0c;网络运维人员称疑似遭受DDoS攻击&#xff0c;请求应急响应工程师协助。 事件处置 应急响应工程师在达到现场后&#xff0c;通过查看流量设备&#xff0c;发现攻击者使用僵…...

JAVA学习之知识补充(下)

六&#xff1a;File类与IO流&#xff1a; 这里给出三种常见的初始化方法&#xff1a; 通过文件路径初始化: File file new File("C:/example/test.txt");这种方法用于创建一个文件对象&#xff0c;该文件对象表示指定路径的文件或目录。例如&#xff1a;File fil…...

qt生成一幅纯马赛克图像

由于项目需要&#xff0c;需生成一幅纯马赛克的图像作为背景&#xff0c;经过多次测试成功&#xff0c;记录下来。 方法一&#xff1a;未优化方法 1、代码&#xff1a; #include <QImage> #include <QDebug> #include <QElapsedTimer>QImage generateMosa…...

python循环——九九乘法表(更加轻松的理解循环结构)

感受 首先&#xff0c;得明确意识到这个问题&#xff0c;就是我的循环结构学的一塌糊涂&#xff0c;完全不能很好的使用这个循环来实现各种九九乘法表达输出&#xff0c;这样的循环结构太差了&#xff0c;还需要我自己找时间来补充一下循环的使用&#xff0c;来拓宽自己的思考方…...

UDS诊断系列之十八故障码的状态掩码

在谈19服务的子功能之前&#xff0c;先说一下故障码&#xff08;DTC&#xff09;的状态掩码是什么。 一、状态掩码 状态掩码由八个状态位构成&#xff0c;客户端利用它向服务器请求与其状态相匹配的DTC信息。当服务器接收到来自客户端的请求时&#xff0c;它会通过过滤匹配的…...

【jvm】直接引用

目录 1. 说明2. 形式3. 特点4. 生成过程5. 作用 1. 说明 1.在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;直接引用&#xff08;Direct Reference&#xff09;是相对于符号引用&#xff08;Symbolic Reference&#xff09;而言的&#xff0c;它是指向内存中实际存在的…...

WELearn网课助手:5分钟告别熬夜刷课,实现高效学习自由的终极指南

WELearn网课助手&#xff1a;5分钟告别熬夜刷课&#xff0c;实现高效学习自由的终极指南 【免费下载链接】WELearnHelper 显示WE Learn随行课堂题目答案&#xff1b;支持班级测试&#xff1b;自动答题&#xff1b;刷时长&#xff1b;基于生成式AI(ChatGPT)的答案生成 项目地址…...

ANNA框架:构建AI原生应用的智能体开发指南

1. 项目概述&#xff1a;一个面向未来的AI原生应用框架最近在GitHub上闲逛&#xff0c;发现了一个让我眼前一亮的项目&#xff1a;ANNA。这个项目由开发者NikolaiGL发起&#xff0c;乍一看名字&#xff0c;你可能会联想到某个AI模型或者工具库&#xff0c;但深入研究后你会发现…...

如何在EVE Online中利用Pyfa实现舰船配装效率翻倍?

如何在EVE Online中利用Pyfa实现舰船配装效率翻倍&#xff1f; 【免费下载链接】Pyfa Python fitting assistant, cross-platform fitting tool for EVE Online 项目地址: https://gitcode.com/gh_mirrors/py/Pyfa 如果你是一位EVE Online玩家&#xff0c;是否曾经为游戏…...

多智能体 执行-辩论-校验 闭环架构

文章目录一、核心本质二、三大智能体权责划分1. 执行Agent&#xff08;A/B/C&#xff09;2. 辩论Agent3. 校验Agent&#xff08;终审裁判&#xff09;三、闭环流转逻辑四、关键设计规则五、TaskList 任务标准字段一、核心本质 整体架构本质&#xff1a;执行 → 辩论 → 校验 三…...

SOCD Cleaner终极指南:如何用开源工具解决游戏输入冲突问题

SOCD Cleaner终极指南&#xff1a;如何用开源工具解决游戏输入冲突问题 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的游戏对战中&#xff0c;因为同时按下相反方向键而输掉关键对决&#xff…...

高性能系统发育计算库:BEAGLE 库完整安装与优化指南

高性能系统发育计算库&#xff1a;BEAGLE 库完整安装与优化指南 【免费下载链接】beagle-lib general purpose library for evaluating the likelihood of sequence evolution on trees 项目地址: https://gitcode.com/gh_mirrors/be/beagle-lib BEAGLE&#xff08;Broa…...

内容做了一大堆,流量就是起不来?初创公司低成本获流的真实解法

内容做了一大堆&#xff0c;流量就是起不来&#xff1f;初创公司低成本获流的真实解法 我见过太多这样的团队&#xff1a;每周雷打不动三篇公众号&#xff0c;两条短视频&#xff0c;外加若干条推特&#xff0c;数据面板安安静静&#xff0c;后台没有咨询&#xff0c;评论区只…...

5步搭建Sunshine游戏串流服务器:打造你的私人云游戏平台

5步搭建Sunshine游戏串流服务器&#xff1a;打造你的私人云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款功能强大的自托管游戏串流服务器&#xff0c;专…...

如何快速掌握Winhance中文版:Windows优化终极指南

如何快速掌握Winhance中文版&#xff1a;Windows优化终极指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN …...

跨镜追踪技术・十大核心应用场景

镜像视界浙江科技有限公司以无感空间重构 全域跨镜追踪为核心&#xff0c;依托全栈自研引擎与权威资质背书&#xff0c;构建自成体系、无同类对标、无可替代的空间智能应用矩阵。技术原生适配复杂实景&#xff0c;在无 GPS、无标签、无穿戴、无基站条件下&#xff0c;实现厘米…...