PCA9698的IIC转接GPIO控制N路灯

news/2024/10/21 19:42:43/

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.ppmy.cn/news/1217803.html

相关文章

linux目录创建,打开,读,关闭操作{mkdir(),opendir()/closedir(),readdir()}

欢迎来到我的IO mkdir()大讲堂&#xff01;今天我们要学习如何使用文件系统函数来创建目录。在开始之前&#xff0c;我想先提醒大家&#xff0c;我的讲解风格可能有点幽默&#xff0c;因为编程有时候也需要一些乐趣&#xff0c;不是吗&#xff1f; 一.创建新的目录 首先&#…

leetcode:138. 随机链表的复制

一、题目&#xff1a; 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; struct Node* copyRandomList(struct Node* head) 二、思路 本题是给出一个单链表&#xff0c;单链表的每个结点还额外有一个随机指针&#xff0c;随机指向其他结点&am…

Docker安装Octoprint 3D打印控制软件

Octoprint简介 Octoprint是一个运行在Linux系统上的开源套件&#xff0c;可以为普通的3D打印机添加强大的外围管理功能。 web管理界面远程操控摄像头实时监控视频录制、延时摄影在线切片图形化的温度曲线显示手机监控操作免SD卡和U盘通过插件和USB/GPIO接口实现更多功能 Oct…

Istio学习笔记-体验istio

参考Istio 入门(三)&#xff1a;体验 Istio、微服务部署、可观测性 - 痴者工良 - 博客园 (cnblogs.com) 在本章中&#xff0c;我们将会学习到如何部署一套微服务、如何使用 Istio 暴露服务到集群外&#xff0c;并且如何使用可观测性组件监测流量和系统指标。 本章教程示例使用…

假如我是Langchain专家,你会问什么来测试我的水平

推荐Langchain YouTube 视频排行榜 1. 假如我是Langchain专家&#xff0c;你会问什么来测试我的水平&#xff1b; 作为Langchain专家&#xff0c;您可能需要回答一系列深入和具体的问题&#xff0c;这些问题旨在测试您对Langchain的理解和实际应用能力。以下是一些可能的问题…

人工智能与新能源电动车的融合——技术创新引领未来交通革命

人工智能与新能源电动车的融合——技术创新引领未来交通革命 摘要&#xff1a;本文探讨了人工智能与新能源电动车领域的技术融合&#xff0c;分析了其在智能驾驶、电池技术、充电设施等方面的应用与创新。文章指出&#xff0c;这两大技术的结合将重塑交通产业&#xff0c;为我…

tensorflow 1.15 gpu docker环境搭建;Nvidia Docker容器基于TensorFlow1.15测试GPU;——全流程应用指南

前言: TensorFlow简介 TensorFlow 在新款 NVIDIA Pascal GPU 上的运行速度可提升高达 50%&#xff0c;并且能够顺利跨 GPU 进行扩展。 如今&#xff0c;训练模型的时间可以从几天缩短到几小时 TensorFlow 使用优化的 C 和 NVIDIA CUDA 工具包编写&#xff0c;使模型能够在训练…

云流量回溯的重要性和应用

云流量回溯是指利用云计算和相关技术来分析网络流量、数据传输或应用程序操作的过程。这个过程包括了对数据包、通信模式和应用程序性能的审查和跟踪。本文将介绍云流量回溯重要性和应用! 1、网络安全: 云流量回溯是网络安全的重要组成部分。通过监测和回溯网络流量&#xff0c…