ArmSom---I2C开发指南

1. 简介

  • RK3588从入门到精通

  • 本⽂介绍在rockchip平台下如何配置i2c接口的方法并且添加调试验证i2c外设的例子

  • 开发板:ArmSoM-W3

  • Kernel:5.10.160

  • OS:Debian11

2. i2c接口概述

i2c 总线控制器通过串行数据(SDA)线和串行时钟 (SCL)线在连接到总线的器件间传递信息。

i2c总线一些特征:

  1. 只有两根线分别是串行数据线(SDA),串行时钟线(SCL)。

  2. 每个器件都有一个唯一的地址识别

  3. 使用串行8位双向数据传输方式。

  4. 可以使用普通GPIO口模拟I2C,但要需要将GPIO配置成OD模式(开漏模式)

3. 芯片i2c资源

RK3588旗舰芯片上可使用的I2C有9组,ArmSoM SOM-3588-LGA核心板采用LGA 506引脚封装方式将I2C资源全部引出,ArmSoM-W3板子上接有部分i2c外设以及40PIN资源如下:

在这里插入图片描述
在这里插入图片描述

4. i2c使用

RK3588使用I2C 的驱动是i2c-rk3x.c,参考文件 kernel/Documentation/devicetree/bindings/i2c/i2c-rk3x.txt。

4.1 DTS配置

i2c资源使用只需要在设备树下进行配置,例如上述RTC芯片的配置如下:

&i2c6 {
	status = "okay";
	//i2c-scl-rising-time-ns = <265>;
	//i2c-scl-falling-time-ns = <11>;
	//clock-frequency = <400000>;

	hym8563: hym8563@51 {
		compatible = "haoyu,hym8563";
		reg = <0x51>;
		#clock-cells = <0>;
		clock-frequency = <32768>;
		clock-output-names = "hym8563";
		pinctrl-names = "default";
		pinctrl-0 = <&rtc_int>;
		interrupt-parent = <&gpio0>;
		interrupts = <RK_PB0 IRQ_TYPE_LEVEL_LOW>;
	};
};

参数说明:

  • clock-frequency: 默认 frequency 为 100k 可不配置,其它 I2C 频率需要配置,最大可配置频率由i2c-scl-rising-time-ns 决定;例如配置 400k,clock-frequency=<400000>。
  • i2c-scl-rising-time-ns:SCL 上升沿时间由硬件决定,例如测得 SCL 上升沿 365ns,i2c-scl-rising-time-ns=<365>。(默认可以不配置)
  • i2c-scl-falling-time-ns: SCL 下降沿时间, 一般不变, 等同于 i2c-sda-falling-time-ns。(默认也可以不配置)

在使用i2c设备树配置的时候,有些方面需要注意:

1.上述rtc使用的引脚是I2C6_SDA_M0和I2C6_SCL_M0,硬件接口有些可以使用I2C6_SDA_M1,或者I2C6_SDA_M3,要修改默认配置

 i2c6: i2c@fec80000 {
  compatible = "rockchip,rk3588-i2c", "rockchip,rk3399-i2c";
  reg = <0x0 0xfec80000 0x0 0x1000>;
  clocks = <&cru 146>, <&cru 138>;
  clock-names = "i2c", "pclk";
  interrupts = <0 323 4>;
  pinctrl-names = "default";
  pinctrl-0 = <&i2c6m0_xfer>;//&i2c6m1_xfer、&i2c6m3_xfer
  #address-cells = <1>;
  #size-cells = <0>;
  status = "disabled";
 };
  1. i2c地址主要由7bit的二进制数值组成,最低位是读写标志位,0表示写,1表示读

    比如:读,0A3H 写,0A2H
    在linux驱动中要取这个ic设备的从设备地址,就是0xA3或者0xA2右移一位得到

4.2 GPIO 模拟 I2C

I2C 用 GPIO 模拟,内核已经有实现,请参考文档:Documentation/devicetree/bindings/i2c/i2c-gpio.txt
下面是使用的例子,dts 下配置 I2C 节点。

i2c@4 {
    compatible = "i2c-gpio";
    gpios = <&gpio5 9 GPIO_ACTIVE_HIGH>, /* sda */
    <&gpio5 8 GPIO_ACTIVE_HIGH>; /* scl */
    i2c-gpio,delay-us = <2>; /* ~100 kHz */
    #address-cells = <1>;
    #size-cells = <0>;
    pinctrl-names = "default";
    pinctrl-0 = <&i2c4_gpio>;
    status = "okay";
    
    gt9xx: gt9xx@14 {
        compatible = "goodix,gt9xx";
        reg = <0x14>;
        touch-gpio = <&gpio5 11 IRQ_TYPE_LEVEL_LOW>;
        reset-gpio = <&gpio5 10 GPIO_ACTIVE_HIGH>;
        max-x = <1200>;
        max-y = <1900>;
        tp-size = <911>;
        tp-supply = <&vcc_tp>;
        status = "okay";
      };
};

一般不推荐使用 GPIO,效率不高。

5. 检查i2c设备

5.1 IIC 第三方工具

I2C tool 是一个开源工具,需自行下载进行交叉编译,代码下载地址:
https://www.kernel.org/pub/software/utils/i2c-tools/或者<git clone git://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git>
编译后会生成 i2cdetect,i2cdump,i2cset,i2cget 等工具,可以直接在命令行上调试使用,I2C tool 是开源的,编译与使用参考里面的 README 与帮助说明。

ArmSoM-W3板子对应的出厂固件已经在系统下集成了这个工具,可以直接使用,比如扫描I2C总线上的RTC设备:

root@linaro-alip:~# i2cdetect -y 6
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
root@linaro-alip:~# 

扫描到对应的RTC芯片的I2C地址为0X51

常用的命令还有以下几个。

#检测当前系统有几组i2c总线
i2cdetect -l

#查看i2c-0接口上的设备
i2cdetect -a 6

#读取指定设备的全部寄存器的值。
i2cdump  -f -y 6 0x51

#读取指定IIC设备的某个寄存器的值,如下读取地址为0x51器件中的0x01寄存器值。
i2cget -f -y 6 0x51 0x01

#写入指定IIC设备的某个寄存器的值,如下设置地址为0x51器件中的0x01寄存器值为0x1a;
i2cset -f -y 3 0x51 0x01 0x1a

5.2 RTC使用

Linux系统下包含两个时间:系统时间和RTC时间。

linux命令中的date和time等命令都是用来设置系统时间的,而hwclock命令是用来设置和读写RTC时间的。

root@linaro-alip:~# hwclock -r
2018-05-24 16:38:13.115443+00:00 //查看硬件时间
root@linaro-alip:~# date
2018年 05月 24日 星期四 16:38:21 UTC //查看系统时间
root@linaro-alip:~# date -s "2023-10-24 11:45:00" 
2023年 10月 24日 星期二 11:45:00 UTC //重新设置系统时间
root@linaro-alip:~# hwclock -w //同步系统时间到rtc上,掉电不丢失时间
root@linaro-alip:~# hwclock -r
2023-10-24 11:45:17.694727+00:00

5.3 I2C 常见问题

如果调用 I2C 传输接口返回值为 -6(-ENXIO)时候,表示为 NACK 错误,即对方设备无应答响应

在这里插入图片描述

这种情况一般为外设的问题,常见的有以下几种情况:

  • I2C 地址错误;

  • I2C slave 设备处于不正常工作状态,比如没有上电,错误的上电时序以及设备异常等;

  • I2C 时序不符合 slave 设备所要求也会产生 NACK 信号,比如 slave 设备需要的是 stop 信号,而不是

    repeat start 信号的时候;

  • I2C 总线受外部干扰导致的,用示波器测量可以看到是一个 ACK 波形。

当出现 I2C 的 log 类似:"timeout, ipd: 0x80, state: 1"时,看到 ipd 为 0x80 打印,可以说明当前 SCL 被
slave 拉住,要判断被哪个 slave 拉住:
一是排除法,适用于外设不多的情况,而且复现概率高;
二是需要修改硬件,在 SCL 总线上串入电阻,通过电阻两端产生的压差来确定,电压更低的那端
外设为拉低的 slave,电阻的选取以不影响 I2C 传输且可以看出压差为标准,一般上拉电阻的 1/20
以上都可以,如果是 host 拉低也可以看出。
常见的情况是 sda 被拉低,证明是谁拉低的。

有时候i2c初始化有问题时速率可以降低看有没有改善。遇到的 I2C 问题最好的办法是抓取 I2C 出错时候的波形,通过波形来分析 I2C 问
题,I2C 的波形非常有用,大部分的问题都能分析出来。

6. 读取eeprom数据实验

本章介绍通过IIC接口读写eeprom(AT24C08)的数据。 本次实验会以i2c-7做为示例,接其他i2c引脚操作也是一样的 当然,并不是只能用这个eeprom这个模组,这只是做个简单的示例,如果您没有这个模块,可以通过学习操作eeprom的方式操作您想要操作的i2c设备。

6.1 硬件连接

将eeprom接入到ArmSoM-W3开发板的i2c-7的总线上,如下图所示

在这里插入图片描述

板子eeprom
3.3V(1)VCC
GND(39)GND
SCL(5)SCL
SDA(3)SCA

6.2 软件配置

在文件kernel\arch\arm64\boot\dts\rockchip\rk3588-armsom-w3.dts文件下添加下面代码:

&i2c7 {
	pinctrl-names = "default";
	pinctrl-0 = <&i2c7m3_xfer>;
	clock-frequency = <100000>;
	status = "okay";
	eeprom@50 {
                status = "okay";
				compatible = "at,24c08";
                reg = <0x50>;
        };
};

eeprom驱动在drivers/misc/eeprom/下面,如果是其他i2c接口芯片在kernel目录下没有驱动,可以去对找对应芯片厂商提供驱动文件

在这里插入图片描述

将eeprom的驱动编译进内核测试

6.3 读写数据测试

找到模块位置:

root@linaro-alip:~# find / -name "at24"
/sys/bus/i2c/drivers/at24

读eeprom内容:

在这里插入图片描述

写eeprom内容:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【hcie-cloud】【1】华为云Stack解决方案介绍、华为文档获取方式 【上】

文章目录 华为文档获取方式前言云计算发展背景国家政策、社会发展驱动数字经济开启新时代深化数字化转型提升效率&#xff0c;国家数字主权云进入落地阶段从Cloud-Based到Cloud-Native&#xff0c;两种模式长期并存适合政企智能升级的云华为云Stack&#xff0c;政企智能升级首选…

ks ios快手极速版、概念版、创作版sig sig3

风控&#xff1a; 快手除了正版下&#xff0c;还有极速版&#xff0c;概念版&#xff0c;创作版。 然而看了下概念版还是风控比正版要低的多~ 抓包&#xff1a; 对于快手的ios版本抓包很简单&#xff0c;直接vpn转发抓包方式即可&#xff0c;不可用代理抓包&#xff1b;这个…

[SSD综述 1.4] SSD固态硬盘的架构和功能导论

依公知及经验整理,原创保护,禁止转载。 专栏 《SSD入门到精通系列》 <<<< 返回总目录 <<<< ​ 前言 机械硬盘的存储系统由于内部结构, 其IO访问性能无法进一步提高,CPU与存储器之间的性能差距逐渐扩大。以Nand Flash为存储介质的固态硬盘技术的发展,…

redis rdb aof

appendonly yes # appendfsync always appendfsync everysec # appendfsync no E:\Document_Redis_Windows\redis-2.4.5-win32-win64\64bit appendonly.aof

基于单片机的养殖场温度控制系统设计

博主主页&#xff1a;单片机辅导设计 博主简介&#xff1a;专注单片机技术领域和毕业设计项目。 主要内容&#xff1a;毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、控制系统设计二、系统方案设计2.1 系统运行方案设计2.1.1 羊舍环境温度的确定 三、 系统仿…

ElasticSearch高级功能详解与原理剖析

ES数据预处理 Ingest Node Elasticsearch 5.0后&#xff0c;引入的一种新的节点类型。默认配置下&#xff0c;每个节点都是Ingest Node&#xff1a; 具有预处理数据的能力&#xff0c;可拦截lndex或Bulk API的请求对数据进行转换&#xff0c;并重新返回给Index或Bulk APl 无…

项目实战:优化Servlet,把所有围绕Fruit操作的Servlet封装成一个Servlet

1、FruitServlet 这些Servlet都是围绕着Fruit进行的把所有对水果增删改查的Servlet放到一个Servlet里面&#xff0c;让tomcat实例化一个Servlet对象 package com.csdn.fruit.servlet; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import c…

(景行锐创) 高性能计算平台 Pytorch 深度学习环境超详细教程

文章目录 前言1. 账号申请2. 登录高算平台网站3. 安装 Xshell&#xff0c;Xftp 软件4. 连接高算平台5. 安装 Anaconda6. 安装 CUDA7. 配置 cuDNN8. 安装 torch 和 torchvision9. 提交作业测试10. 解压与压缩文件11. 其他结语 前言 目前一些学校为了便于师生进行大规模的计算任…

vue工程化开发和脚手架

工程化开发和脚手架 1.开发Vue的两种方式 核心包传统开发模式&#xff1a;基于html / css / js 文件&#xff0c;直接引入核心包&#xff0c;开发 Vue。工程化开发模式&#xff1a;基于构建工具&#xff08;例如&#xff1a;webpack&#xff09;的环境中开发Vue。 工程化开…

使用免费 FlaskAPI 部署 YOLOv8

目标检测和实例分割是计算机视觉中关键的任务&#xff0c;使计算机能够在图像和视频中识别和定位物体。YOLOv8是一种先进的、实时的目标检测系统&#xff0c;因其速度和准确性而备受欢迎。 Flask是一个轻量级的Python Web框架&#xff0c;简化了Web应用程序的开发。通过结合Fla…

如何使用Selenium处理Cookie,今天彻底学会了

01 cookie介绍 HTTP协议是无状态的协议。一旦数据交换完毕&#xff0c;客户端与服务器端的连接就会关闭&#xff0c;再次交换数据需要建立新的连接&#xff0c;这就意味着服务器无法从连接上跟踪会话。也就是说即使第一次和服务器连接后并且登录成功后&#xff0c;第二次请求…

【vue2高德地图api】04-poi搜索

系列文章目录 文章目录 系列文章目录前言一、高德地图文档入口二、使用步骤1.创建文件以及路由2.编写页面代码3.样式4变量以及方法5.编写查询方法 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 本篇要实现的功能&#xff0c;看下图 提示&#x…

PivotNet:Vectorized Pivot Learning for End-to-end HD Map Construction

参考代码&#xff1a;BeMapNet。PS&#xff1a;代码暂未放出&#xff0c;关注该仓库动态 动机和主要贡献 在MapTR系列的算法中将单个车道线建模为固定数量的有序点集&#xff08;对应下图Evenly-based&#xff09;&#xff0c;这样的方式对于普通道路场景具备一定适应性。但是…

谁说 Linux 不能玩游戏?

在上个世纪最早推出视频游戏的例子是托马斯戈德史密斯&#xff08;Thomas T. Goldsmith Jr.&#xff09;于1947年开发的“「Cathode Ray Tube Amusement Device」”&#xff0c;它已经显着发展&#xff0c;并且已成为人类生活中必不可少的一部分。 通过美国游戏行业的统计数据&…

yum

什么是yum? Linux中我们也要进行工具/指令/程序&#xff0c;安装&#xff0c;检查卸载等&#xff0c;需要yum的软件 安装软件的方式&#xff1a; 1.源代码安装--交叉编译工作 2.rpm包直接安装 3.yum / apt-get yum:yum是我们linux预装的一个指令&#xff0c;搜索&#x…

【小白专用】PHP基本语法 23.11.04

PHP基本语法 PHP是超文本预处理器 由服务器解析执行 可以与 html 进行混编(嵌入) ,PHP是一种弱类型语言 1.1 PHP标记 PHP和其他Web语言一样&#xff0c;都是用一对标记将PHP代码包含起来&#xff0c;以便和HTML代码区分开来。PHP支持4种风格的标记&#xff0c;如表所示。 标…

webgoat-(A1)injection

SQL Injection (intro) SQL 命令主要分为三类&#xff1a; 数据操作语言 &#xff08;DML&#xff09;DML 语句可用于请求记录 &#xff08;SELECT&#xff09;、添加记录 &#xff08;INSERT&#xff09;、删除记录 &#xff08;DELETE&#xff09; 和修改现有记录 &#xff…

Scala中类的继承、抽象类和特质

1. 类的继承 1.1 Scala中的继承结构 Scala 中继承关系如下图&#xff1a; Any 是整个继承关系的根节点&#xff1b; AnyRef 包含 Scala Classes 和 Java Classes&#xff0c;等价于 Java 中的 java.lang.Object&#xff1b; AnyVal 是所有值类型的一个标记&#xff1b; Nul…

算法专栏 ---- trie树,并查集

trie树 #include <iostream> using namespace std; const int N 1000010; int son[N][26],cnt[N],idx; //明确前面两个数组以及idx的含义 //我们把son这个二维数组看成一个字典树 //本题要求26个字母&#xff0c;所以我们每个节点里面最多有26个儿子节点 //而我们本题要…

支付宝AI布局: 新产品助力小程序智能化,未来持续投入加速创新

支付宝是全球领先的独立第三方支付平台&#xff0c;致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验&#xff0c;及转账收款/水电煤缴费/信用卡还款/AA收款等生活服务应用。 支付宝不仅是一个支付工具&#xff0c;也是一个数字生活平台&#xff0c;通过…