PCA9698的IIC转接GPIO控制N路灯

news2024/7/4 5:53:45

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 1

int 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.coloradmin.cn/o/1209466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark SQL编程

1. Spark SQL概述 1.1 什么是Spark SQL Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同&#xff0c;Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部&#xff0c;Spark SQL使用这些额外的信息来执行额外的优化。与Spa…

Mac M2/M3 芯片环境配置以及常用软件安装-前端

最近换了台新 Mac&#xff0c;所有的配置和软件就重新安装下&#xff0c;顺便写个文章。 一、环境配置 1. 安装 Homebrew 安装 Homebrew【Mac 安装 Homebrew】 通过国内镜像安装会比较快 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Ho…

IDEA接口调试插件不好找?这款免费用!

IDEA插件市场中的API调试插件不是收费&#xff08;Fast Request &#xff09;就是不好用&#xff08;apidoc、apidocx等等&#xff09;今天给大家介绍一款国产的API调试插件&#xff1a;Apipost-Helper&#xff0c;完全免费且好看好用&#xff01; 这款插件由Apipost团队开发的…

【Qt之QWizard】使用2,示例分析

效果图 根据首页的选择不同&#xff0c;进入不同的选项。 以下是代码。 示例 .h #ifndef LICENSEWIZARD_H #define LICENSEWIZARD_H#include <QWizard>QT_BEGIN_NAMESPACE class QCheckBox; class QLabel; class QLineEdit; class QRadioButton; QT_END_NAMESPACEcla…

C/C++轻量级并发TCP服务器框架Zinx-框架开发001: 读取标准输入,回显到标准输出

文章目录 完整代码实现参考-非项目使用项目使用的代码 - 乱-但是思路与上面的相同创建Kernel类添加删除修改epoll&#xff0c;才能写run方法创建stdin_Channel类在Kernel类中实现run方法 完整代码实现参考-非项目使用 #include <errno.h> #include <signal.h> #in…

科学上网导致Adobe软件运行弹出This non-genuine Adobe app will be disabled soon,尝试解决办法

之前介绍用防火墙拦截Adobe软件的出站规则可以解决软件的非正版弹窗&#xff0c;但是有的用户却不行是为什么&#xff0c;原因是使用了代理网络。因为Adobe此时跑的不是本地的流量而是代理的流量。所以防火墙拦截就不起作用了。 首先是之前介绍过的拦截方法&#xff0c;如果你没…

网络安全-学习手册

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

Spring-Spring之AOP底层原理解析---实践(动态代理)

动态代理 代理模式的解释&#xff1a;为其他对象提供一种代理以控制对这个对象的访问&#xff0c;增强一个类中的某个方法&#xff0c;对程序进行扩展。 cglib动态代理 方式一&#xff1a; public class UserService {public void test() {System.out.println("test..…

k8s自定义Endpoint实现内部pod访问外部应用

自定义endpoint实现内部pod访问外部应用 endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云&#xff0c; 一部分云原生的&#xff0c;一部分是实体的 业务上云期间逐步实现上云&#xff0c;保证各个模块之间的解耦性 比如使…

IEEE--DSConv: Efficient Convolution Operator 论文翻译

论文地址:https://arxiv.org/pdf/1901.01928v1.pdf 目录 摘要 1 介绍 2 相关工作 3 DSConv层 4 量化过程 5 分布偏移 6 优化推断 7 训练 8 结果 8.1 ImageNet 8.2 内存和计算负载 8.3 转移性 9 结论 摘要 我们引入了一种卷积层的变体&#xff0c;称为DSConv&…

网络编程 —— TCP 和 UDP 编程详解

目录 网络编程主要函数介绍 1. socket 函数 2. bind 函数 3. listen 函数 4. accept 函数 5. connect 函数 6. send 函数 7. recv 函数 8. recvfrom 函数 9. sendto 函数 TCP 和 UDP 原理上的区别 TCP 编程 服务端代码&#xff1a; 客户端代码&#xff1a; UDP 编…

如何进行iOS技术博客的备案?

​ 如何进行iOS技术博客的备案&#xff1f; 标题&#xff1a;iOS技术博客备案流程及要求解析 摘要&#xff1a; 在本篇问答中&#xff0c;我们将为iOS技术博主介绍如何进行备案。如果你的iOS应用只包含简单的页面&#xff0c;并通过蓝牙进行数据采集和传输&#xff0c;那么你…

0基础学习VR全景平台篇第121篇:认识视频剪辑软件Premiere

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 大家好&#xff0c;这节课是带领大家认识认识我们的剪辑软件Premiere&#xff0c;一般简称是PR。 &#xff08;PR界面&#xff09; 我们首先打开PR&#xff0c;第一步就是要创建…

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]…

python数据处理作业4:使用numpy数组对象,随机创建4*4的矩阵,并提取其对角元素

每日小语 真理诚然是一个崇高的字眼&#xff0c;然而更是一桩崇高的业绩。如果人的心灵与情感依然健康&#xff0c;则其心潮必将为之激荡不已。——黑格尔 难点&#xff1a;如何创建&#xff1f;取对角元素的函数是什么&#xff1f; gpt代码学习 import numpy as np# 随机创…

基于springboot实现体育场馆运营平台项目【项目源码】计算机毕业设计

基于springboot实现体育场馆运营平台演示 系统开发平台 在该数码论坛系统中&#xff0c;Eclipse能给用户提供更多的方便&#xff0c;其特点一是方便学习&#xff0c;方便快捷&#xff1b;二是有非常大的信息储存量&#xff0c;主要功能是用在对数据库中查询和编程。其功能有比…

Databend 与海外某电信签约:共创海外电信数据仓库新纪元

为什么选择 Databend 海外某电信面临的主要挑战是随着业务量的增加&#xff0c;传统的 Clickhouse Hive 方案在数据存储和处理上开始显露不足。 原来的大数据分析采用的 Clickhouse Hive 方案进行离线的实时报表。但随着业务量的上升后&#xff0c;Hive的数据存储压力变大&…

微服务基础,分布式核心,常见微服务矿建,SpringCloud概述,搭建SpringCloud微服务项目详细步骤,含源代码

微服务基础 系统架构的演变 随着会联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的应用架构已经无法应对&#xff0c;分布式服务架构以及微服务架构势在必行&#xff0c;必须一个治理系统确保架构有条不紊的演进 单体应用框架 Web应用程序发展的早期&…

Jenkins中强制停止停不下来的job

# Script console 执行脚本 Jenkins 的提供了 script console 的功能&#xff0c;允许你写一些脚本&#xff0c;来调度 Jenkins 执行一些任务。 我们就可以利用 script console 来强制停止 job 执行。 首先进入 Jenkins 的 script console 页面&#xff1a; script console 路…

8.指令格式,指令的寻址方式

目录 一. 指令格式 二. 扩展操作码 三. 指令寻址 &#xff08;1&#xff09;指令寻址 &#xff08;2&#xff09;数据寻址 1.直接寻址 2.间接寻址 3.寄存器寻址 4.寄存器间接寻址 5.隐含寻址 6.立即寻址 7.基址寻址 8.变址寻址 9.相对寻址 10.堆栈寻址 一. 指令…