PCA9698的IIC转接GPIO控制N路灯

PCA9698验证灯的办法和PCA9535验证6路数字继电器,编译成ko直接Insmod,然后查看/dev/节点有了吗?然后用iictool命令往对应iic地址上面写数据,看看灯亮灭或者听继电器开关声响,至于写多少,研究芯片手册上面参数。正式代码就用system("./sh“)或者直接写入数据iictool命令到引号那种来控制。

PCA9698硬件描述

通过通过A0   A1   A2三个位控制地址,通过不同地址写入到各个灯


思路:IIC代码,不加驱动,但是写的话写入了底层那种IIC应用层找到能用

pca9698: gpio@2f{
compatible = "nxp,pca9505";
pinctrl-names = "default";
pinctrl-0 = <&pca9698_int_pins>;
reg = <0x2f>;
reset-gpios = <&gpio3 14 GPIO_ACTIVE_LOW>;
gpio-controller;
#gpio-cells = <2>;
interrupt-parent = <&gpio3>;
interrupts = <15 IRQ_TYPE_LEVEL_LOW>;
interrupt-names = "pca_input";
};

系统启动后,i2c设备可以成功驱动挂载,在/sys/class/gpio/下新增了gpiochip462#,可以export 相应的管脚,管脚配置使用正常配置的中断引脚可以看到

应用程序编写:

#include <linux/i2c-dev.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>#define PCA9698BS_1_I2C_ADDR 0x20
#define PCA9698BS_2_I2C_ADDR 0x21
#define NUM_LEDS 24
#define LED_OFF 0
#define LED_ON 1int main()
{int i2c_fd;unsigned char buf[2];int led_states[NUM_LEDS] = {LED_OFF};  // 初始化所有LED为关闭状态i2c_fd = open("/dev/i2c-0", O_RDWR);if (i2c_fd < 0){perror("无法打开I2C设备文件");return 1;}// 设置第一个PCA9698BS的I2C地址if (ioctl(i2c_fd, I2C_SLAVE, PCA9698BS_1_I2C_ADDR) < 0){perror("无法设置第一个PCA9698BS的I2C地址");close(i2c_fd);  // 关闭I2C设备文件return 1;}// 配置输出模式buf[0] = 0x03;buf[1] = 0x00;if (write(i2c_fd, buf, 2) != 2){perror("无法配置引脚模式");close(i2c_fd);return 1;}// 设置第二个PCA9698BS的I2C地址if (ioctl(i2c_fd, I2C_SLAVE, PCA9698BS_2_I2C_ADDR) < 0){perror("无法设置第二个PCA9698BS的I2C地址");close(i2c_fd);return 1;}// 配置输出模式buf[0] = 0x03;buf[1] = 0x00;if (write(i2c_fd, buf, 2) != 2){perror("无法配置引脚模式");close(i2c_fd);return 1;}// 控制LED灯的开关状态buf[0] = 0x01;// 根据特定条件设置灯的状态for (int i = 0; i < NUM_LEDS; i++){// 假设这里有特定的条件来设置LED状态led_states[i] = LED_ON;  //  led_states[i] = LED_OFF;}// 根据灯的状态控制引脚输出状态for (int i = 0; i < NUM_LEDS; i++){int reg_offset = i / 8; // 寄存器偏移量,每个寄存器包含8个LED状态int bit_offset = i % 8; // 位偏移量// 读取当前寄存器的值buf[0] = 0x02 + reg_offset; // 控制寄存器地址if (write(i2c_fd, buf, 1) != 1){perror("无法设置控制寄存器地址");close(i2c_fd);return 1;}if (read(i2c_fd, &buf[1], 1) != 1){perror("无法读取寄存器值");close(i2c_fd);return 1;}// 根据LED状态设置对应的位if (led_states[i] == LED_ON){buf[1] |= (1 << bit_offset); // 将对应位设置为1(打开LED)}else{buf[1] &= ~(1 << bit_offset); // 将对应位设置为0(关闭LED)}// 写入更新后的值到寄存器buf[0] = 0x02 + reg_offset; // 控制寄存器地址if (write(i2c_fd, buf, 2) != 2){perror("无法设置控制寄存器地址");close(i2c_fd);return 1;}}// 控制引脚输出状态buf[0] = 0x01; // 输出寄存器地址buf[1] = 0x00; // 输出数据,假设全部输出低电平if (write(i2c_fd, buf, 2) != 2){perror("无法控制引脚输出状态");close(i2c_fd);return 1;}sleep(2);// 关闭所有输出buf[1] = 0x00; // 输出数据,全部输出低电平if (write(i2c_fd, buf, 2) != 2){perror("无法控制引脚输出状态");close(i2c_fd);return 1;}// 关闭I2C设备文件close(i2c_fd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/175035.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第四天课程 分布式搜索引擎1

分布式搜索引擎01 – elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; …

electronjs入门-编辑器应用程序

我们将在Electron中创建一个新项目&#xff0c;如我们在第1章中所示&#xff0c;名为“编辑器”&#xff0c;我们将在下一章中使用它来创建编辑器&#xff1b;在index.js中&#xff0c;这是我们的主要过程&#xff1b;请记住为Electron软件包放置必要的依赖项&#xff1a; npm…

LeetCode【238】除自身意外的数组的乘积

题目&#xff1a; 思路&#xff1a; https://zhuanlan.zhihu.com/p/109306706?utm_id0 代码&#xff1a; int n nums.length;int[] l new int[nums.length];int[] r new int[nums.length];l[0] 1;r[n-1] 1;for (int i1;i<nums.length;i) {l[i] l[i-1] * nums[i-1]…

No209.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

selenium报错:没有打开网页或selenium.common.exceptions.NoSuchDriverException

文章目录 问题解决方法 问题 当selenium的环境配置没有问题&#xff0c;但在使用selenium访问浏览器时并没有打开网页&#xff0c;或者出现selenium.common.exceptions.NoSuchDriverException报错信息&#xff08;如下图所示&#xff09;。 以上问题可能的原因是没有配置chrom…

【每日一题】K 个元素的最大和

文章目录 Tag题目来源解题思路方法一&#xff1a;贪心 其他语言Cpython3 写在最后 Tag 【贪心】【脑筋急转弯】【数组】【2023-11-15】 题目来源 2656. K 个元素的最大和 解题思路 方法一&#xff1a;贪心 从第一次操作开始每次选择数组中的最大值&#xff0c;由于最大值在…

算法萌新闯力扣:同构字符串

力扣题&#xff1a;同构字符串 开篇 对于字符串相关的题目&#xff0c;哈希表经常会使用到&#xff0c;这道题更是如此&#xff0c;还用到了两个哈希表。拿下它&#xff0c;你对字符串题目的理解就会更上一层楼。 题目链接:205.同构字符串 题目描述 代码思路 看完题目后&a…

爬虫----robots.txt 协议简介

文章目录 robots.txt 是一个用于指示网络爬虫(web spider或web robot)如何与网站上的内容进行交互的协议。这个文件被网站管理员放置在网站的根目录下,用于告知爬虫哪些部分的网站是可以被抓取的,哪些是不被允许的。以下是 robots.txt 协议的一些关键要点: 控制爬虫访问:…

〖大前端 - 基础入门三大核心之JS篇㉟〗- JavaScript 的DOM简介

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

1688往微信小程序自营商城铺货商品采集API接口

一、背景介绍 随着移动互联网的快速发展&#xff0c;微信小程序作为一种新型的电商形态&#xff0c;正逐渐成为广大商家拓展销售渠道、提升品牌影响力的重要平台。然而&#xff0c;对于许多传统企业而言&#xff0c;如何将商品信息快速、准确地铺货到微信小程序自营商城是一个…

【运维 监控】Grafana + Prometheus,监控Linux

安装和配置Grafana与Prometheus需要一些步骤&#xff0c;下面是一个简单的指南&#xff1a; 安装 Prometheus&#xff1a; 使用包管理器安装 Prometheus。在 Debian/Ubuntu 上&#xff0c;可以使用以下命令&#xff1a; sudo apt-get update sudo apt-get install prometheus在…

C/C++计算乘积 2021年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C计算乘积 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C计算乘积 2021年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定两个数a,b&#xff0c;计算它们的乘积 2、输入输出…