Linux下CH452数码管芯片驱动调试(GPIO模拟I2C)

2023-11-08

1. 设备连接
    主控板处理器为Cortex A5处理器,内核4.9.0。
    主控板和CH452引脚定义如下表1.1所示。

表1.1 主控板和CH452引脚定义

序号 CH452引脚定义 主控板引脚定义
1 SDA PB29
2 SCL PB30
3 RESET PB26

2.驱动调试

    CH452数码管芯片兼容I2C通信,但是其时序与标准的I2C时序不同,无法套用Linux通用的I2C框架编写驱动程序。所以考虑通过模拟时序的方式控制数码管显示。阅读CH452的芯片手册–5.6节 2线串行接口,可以获知单片机是如何与CH452通过2线接口进行通信的。通过2线接口点亮数码管,一定要保证模拟的时序正确。 下面分别从用户空间和内核空间模拟时序点亮数码管。

2.1 Linux用户空间调试

    在用户空间,使用GPIO口模拟I2C时序。GPIO的应用层接口是/sys/class/gpio。文件目录结构及文件操作方法如下:

    1)gpio应用层接口的文件目录结构

     /sys/class/gpio
    ┣ export # 申请引脚的接口
    ┣ unexport # 取消申请引脚的接口
    ┣ pioA15 # 单个引脚设备
    ┣ direction # 输出/输入控制
    ┣ value # 电平
    ┗ …

2)对文件操作的使用方法

  • 设置输入
    设置B22引脚为输入并读取数值,例:
        cd /sys/class/gpio
        echo 54 > export # gpioA口为0号bank,54 = B*32 + 22
        cd pioB22
        echo in > direction # 字符串 “in”
        cat value # 字符 ‘0’ 或 ‘1’
    如果是在应用程序中对GPIO文件进行读写操作,那么cat可以替换为read函数,echo可以替换成write函数。
  • 设置输出
    设置C1引脚为输出并设置电平:
        cd /sys/class/gpio
        echo 65 > export
        cd pioC1
        echo out > direction
        echo 1 > value
        echo 0 > value

  用户空间使用GPIO口模拟I2C时序,点亮数码管的调试思路,如下:
    1) 初始化GPIO口,配置引脚PB29(SDA)、PB30(SCL),方向和电平;
    2) 按照芯片手册中的时序要求,控制引脚电平,模拟时序;
    3) 按显示要求,向CH452发送相应的命令。
  下图为通过示波器抓到的2线接口的时序,发送的数据为01111110 00000001。
示波器抓到的时序

    用户空间的源码实现了数码管循环移位点亮、可显示任意字符(数字、字母、特殊字符)、实时显示主控板温度和告警码的功能。
在这里插入图片描述
2.2 Linux内核空间调试

     驱动:将CH452注册为misc 设备(与字符设备注册类似),调用内核中的GPIO操作函数,使用GPIO模拟I2C时序,实现主控板使用2线接口与CH452通信。在调试时,将驱动源码编译成ko文件,应用层通过insmod的方式添加到内核,方便调试。
    应用程序:编写应用层测试程序,待驱动添加成功后,运行测试程序,点亮数码管。

3.驱动代码
    如需源代码可留言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下CH452数码管芯片驱动调试(GPIO模拟I2C) 的相关文章

  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 为什么 XRecordDisableContext() 不起作用?

    void Callback XPointer XRecordInterceptData pRecord std cout lt lt my logs n int main if auto const pDisplay XOpenDispla
  • [A-Z] 表示 [A-Za-z] 是怎么回事?

    我已经注意到 至少在我使用的一些基于 Unix 的系统上 ls A Z 已经给了我预期的结果ls A Za z 让我无法轻松获得以大写字母开头的该死的文件列表 我刚刚遇到了同样的事情grep 我无法让它停止与小写字母匹配 A Z 直到我最终
  • 如何wget目录中最新的文件

    我想编写一个 bash 脚本来下载并安装最新的每日构建程序 RStudio 是否有可能使wget仅下载目录中最新的文件http www rstudio org download daily desktop http www rstudio
  • 来源和出口有什么区别?

    我正在编写一个 shell 脚本 以读取具有 key value 对的文件并将这些变量设置为环境变量 但我有疑问 如果我这样做source file txt是否会将该文件中定义的变量设置为环境变量 或者我应该逐行读取文件并使用导出命令设置它
  • Ubuntu 的打包 - Web 应用程序

    Web 应用程序没有与 C 或类似文件不同的 make 文件 但是 它需要放置在特定的目录中 例如 var www 我是 Linux 打包新手 所以我的问题是 如何将我的应用程序打包到 deb 中 以便在安装时将其放入 etc myprog

随机推荐

  • 【嵌入式】——理论基础

    STM32初探 一 计算机组成 1 嵌入式系统 1 1 什么是嵌入式系统 1 2 嵌入式系统组成 2 计算机系统 2 1 冯 诺伊曼结构 普林斯顿结构 2 2 哈佛架构 Harvard Architecture 3 各组件是如何通信的 3
  • 丽升评卷系统显示服务器地址错误,A3_丽升评卷系统评卷员操作方法-副本(2页)-原创力文档...

    PAGE PAGE 2 丽升评卷系统评卷员操作方法 操作方法说明将文字和图片结合 优化了叙述的条理性 尽量做到简洁明了 通俗易懂 即便不经培训 也可以独立动手操作 一 双击桌面上的丽升图标 弹出 用户登录 窗口 输入阅卷服务器IP地址 服务
  • Android手机上剪藏笔记到Obsidian

    前两天 Obsidian 正式发布了 v1 0 0 这两年老苏一直只是把 Obsidian 当一个 Markdown 编辑器在使用 是时候花时间研究怎么用 Obsidian 真正成为一个知识管理工具了 关于 Obsidian 详细的版本更新
  • Gensim word2vec计算多个词之间的相似度

    使用most similar 函数即可 代码如下 from gensim models import Word2Vec word model Word2Vec load wiki word2vec model 导入模型 word model
  • 用awk编写Shell脚本

    一 概述 1 产品概述 awk是一种编程语言 用于在linux unix下对文本和数据进行扫描与处理 数据可以来自标准输入 文件 管道 awk分别代表其作者姓氏的第一个字母 因为它的作者是三个人 分别是Alfred Aho Peter We
  • 吴恩达《机器学习》——线性回归代码实现

    线性回归 1 单变量线性回归 单变量线性回归公式 损失函数 优化算法 批梯度下降 BGD 2 多变量线性回归 特征缩放 标准化 参数的逆缩放 3 线性回归算法代码实现 向量实现 Python代码 4 实验结果 单变量回归 多变量回归 实验总
  • Ubuntu 14.04 64位上配置JDK操作步骤

    1 从 http www oracle com technetwork java javase downloads jdk8 downloads 2133151 html 下载jdk 8u172 linux x64 tar gz 2 解压缩
  • 软件测试期末总复习(知识点+习题+答案)

    目录 1 软件测试基础 1 1软件概述 1 1 1软件的生命周期 1 1 2 软件开发模型 1 1 3 软件质量概述 1 2 软件缺陷管理 1 2 1 软件缺陷产生的原因 1 2 2 软件缺陷的分类 1 2 3 软件缺陷的处理流程 1 3
  • jvm之java类加载机制和类加载器(ClassLoader)的详解

    当程序主动使用某个类时 如果该类还未被加载到内存中 则JVM会通过加载 连接 初始化3个步骤来对该类进行初始化 如果没有意外 JVM将会连续完成3个步骤 所以有时也把这个3个步骤统称为类加载或类初始化 一 类加载过程 1 加载 加载指的是将
  • 无线连接服务器 很慢,无线网很慢是什么原因

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 无线网很慢的原因有 1 连接的网站所在的服务器带宽不足或负载过大 2 网线接触不良或者交换机的硬件原因导致 3 电脑本身存储文件过多等 所谓无线网络 是指无需布线就能实现各
  • 2022年天梯赛比赛真题,L1基础题,C语言,没有算法的那种

    目录 L1 1 今天我要赢 5 分 L1 2 种钻石 5 分 L1 3 谁能进图书馆 10 分 L1 4 拯救外星人 10 分 L1 5 试试手气 15 分 L1 6 斯德哥尔摩火车上的题 15 分 L1 7 机工士姆斯塔迪奥 20 分 L
  • spdk理解

    核跟线程的关系 在理解spdk 特别是spdk线程模型前 需要清楚cpu核跟线程的关系 首先 关于计算机系统的很多概念 都有 逻辑层 和 物理层 的区分 这个是前提 然后再看 核心 这个概念是 物理层 的概念 指的就是 CPU硬件的物理核心
  • OpenGL assimp库,编译 ‘File too big‘,‘too many sections’,IFCReaderGen.cpp 中报错

    QT环境下配置Assimp库 MinGW编译器 48条消息 QT环境下配置Assimp库 MinGW编译器 Elsa的迷弟的博客 CSDN博客 IFCReaderGen cpp 中报错 too many sections问题 如下图所示 此
  • SpringBoot整合kafka(实现consumer)

    如何在springboot中集成kafka收消息 1 pom xml引入依赖的jar包
  • 初始化和实例化的区别

    类的初始化 是完成程序执行前的准备工作 在这个阶段 静态的 变量 方法 代码块 会被执行 同时在会开辟一块存储空间用来存放静态的数据 初始化只在类加载的时候执行一次 类的实例化 是指创建一个对象的过程 这个过程中会在堆中开辟内存 将一些非静
  • php模式之装饰器模式2

    原文来自 大胖博客 在上一篇文章中 介绍了如何在代码架构之初 为了以后的扩展方便做的考虑 那么在现实中大部分的情况不是如此 那么我们需要重构这块么 不一定 今天我们使用另一种方式来实现装饰器 假设现在我们处在产品的第二个阶段 有下面第一阶段
  • 前端微信支付步骤(笔记)

    对接了两次微信支付 第一次对接的时候没有做记录下来 这一次把要记录下来 一 获取openId 1 在微信公众平台配置相关信息 具体按照微信官方文档步骤进行配置 mp weixin qq com wiki t reso 2 微信网页授权 文档
  • Js apply方法详解

    Js apply方法详解 主要解决一下几个问题 apply和call的区别在哪里 什么情况下用apply 什么情况下用call apply的其他巧妙用法 一般在什么情况下可以使用apply 首先从网上查到关于apply和call的定义 然后
  • 双重for循环删除数据

    1 倒过来遍历list for int i list size 1 i gt 0 i int item list get i if item 3 list remove item 2 每移除一个元素以后再把i移回来 for int i 0
  • Linux下CH452数码管芯片驱动调试(GPIO模拟I2C)

    1 设备连接 主控板处理器为Cortex A5处理器 内核4 9 0 主控板和CH452引脚定义如下表1 1所示 表1 1 主控板和CH452引脚定义 序号 CH452引脚定义 主控板引脚定义 1 SDA PB29 2 SCL PB30 3