IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> I2C 时序、速率计算及intel I2C驱动 -> 正文阅读

[嵌入式]I2C 时序、速率计算及intel I2C驱动

目录

速率

信号

时序定义

START

ACK

NACK

STOP

时序实战

速率计算

?数据解读

异常时序

上拉电阻

I2C的设备驱动

驱动的确认

驱动入口

驱动参数调整

设备的区分


速率

主要支持的速率如下:

100Kbps

400Kbps

1Mbps

3.4Mbps

信号

SDA? 数据

SCL?? 时钟

时序定义

START

? ?SCL为高电平时,SDA由高电平到低电平,视为START。START也作为示波器采集时的触发信号。 基于此我们可以采集到多帧数据。

ACK

?

?? ? ?每一个字节,即每八位数据,8个时钟SCL后,需要一个ACK,使得receiver 可以通知transmitter 字节已经被receiver正确接收。

? ? ?Controller 负责产生所有的时钟脉冲,包括ACK时钟脉冲。

? ? ?ACK 在信号上表现为:SDA的低电平,由receiver负责在START之后的第9个时钟脉冲时,将此信号拉低,并且在SCL为高时保持稳定的低电平。

? ? ?在发送地址及写命令后,receiver需要回送ACK

NACK

NACK 信号表现: START之后的第9个时钟脉冲时,SDA为高。

以下几个条件可以导致NACK:

1. i2c 总线上没有对应的slave 地址设备

2. receiver 不能响应,由于receiver正在执行一些实时任务,导致还不能与controller通讯。

3. receiver 得到了它不能解析的数据或者命令

4. receiver 没有收到任何数据。

在读数据时,SDA的时序为NACK。??

STOP

? 即: SCL 在高电平时,SDA由低到高的transition,视为STOP.

时序实战

速率计算

如下图:

1)第一个红圈中时间为0us, 第二个红圈中为200us

2)在此两个红圈中,共有

? a.??开始时,START? 1bit

? ?b. 中间地址及数据 8+8 =16bit

? ?c.? ?ACK? ?2bit

? ?d.? STOP? 1bit

总共 20bit。即 200us传输了20bit, 换算为10us? 1bit,也就是10ms? 1kbit ,也就是100kbit/s

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图1? 某I2C设备时序图--SDA为红线,SCL为绿线

?数据解读

? ? 对图1数据进行解析。

? ? 在每个SCL高电平解读SDA的数据,以9bit为一个字节:

? ? 1) 地址 为第一个 9BIT: 11101000,即 E8,而实际地址采用7bit,最后一位为读写位,a ‘zero’ indicates a transmission (WRITE); a ‘one’ indicatesa request for data (READ)。

? ? ? ? ?因而地址 9bit对应的含义为,向地址0x74 (0xe8右移一位)进行一次写操作。并且得到了ACK响应

异常时序

?如下图,这时一个I2C读操作,但是发送完地址后,收到NACK消息。

同时,需要观察到此时的时钟信号异常。

? ?

上拉电阻

I2C的设备驱动

驱动的确认

? ? ? ?在用i2cdetect命令查看控制器信息时,我们可能看到信息如下,对于i2c-1 和i2c-2,我们就认为这两个控制器的驱动为 Synopsys DesignWare ,同时看到内核代码 i2c-designware-master.c?? ?drivers\i2c\busses? ? 有相应的驱动文件,这更使我们认为这就是i2c-1 和 i2c-2采用的驱动。
? ? ? 于是我们用lsmod查看对应的模块,并没有。于是我们查看这几个内核对应的编译配置文件,发现他们都是编译到内核中的。

sudo i2cdetect -l
i2c-3   i2c             i915 gmbus dpc                          I2C adapter
i2c-1   i2c             Synopsys DesignWare I2C adapter         I2C adapter
i2c-8   i2c             AUX C/DDI C/PHY C                       I2C adapter
i2c-6   i2c             AUX A/DDI A/PHY A                       I2C adapter
i2c-4   i2c             i915 gmbus dpb                          I2C adapter
i2c-2   i2c             Synopsys DesignWare I2C adapter         I2C adapter

驱动入口

? ?通过lspci查看驱动信息如下:

??

00:15.0 Serial bus controller [0c80]: Intel Corporation Cannon Lake PCH Serial IO I2C Controller #0 (rev 10)
        DeviceName: Onboard - Other
        Subsystem: Intel Corporation Cannon Lake PCH Serial IO I2C Controller
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 16
        Region 0: Memory at a4100000 (64-bit, non-prefetchable) [virtual] [size=4K]
        Capabilities: [80] Power Management version 3
                Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D3 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [90] Vendor Specific Information: Len=14 <?>
        Kernel driver in use: intel-lpss
        Kernel modules: intel_lpss_pci    (驱动)

00:15.1 Serial bus controller [0c80]: Intel Corporation Cannon Lake PCH Serial IO I2C Controller #1 (rev 10)
        DeviceName: Onboard - Other
        Subsystem: Intel Corporation Cannon Lake PCH Serial IO I2C Controller
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin B routed to IRQ 17
        Region 0: Memory at a4101000 (64-bit, non-prefetchable) [virtual] [size=4K]
        Capabilities: [80] Power Management version 3
                Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D3 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [90] Vendor Specific Information: Len=14 <?>
        Kernel driver in use: intel-lpss
        Kernel modules: intel_lpss_pci

? ? ?intel? I2C 控制器驱动的真实入口代码位于

? ??intel-lpss-pci.c?? ?drivers\mfd?? ?21184?? ?2021/10/26?? ?28

? ? intel-lpss.c?? ?drivers\mfd?? ?13603?? ?2021/10/26?? ?265
? ??

? 采用下面makefile编译intel-lpss-pci.ko,并卸载原先的ko的,采用编译出的。注意:编译用的intel-lpss-pci源代码版本要与目标系统中的内核版本比较一致,不然会有很多编译问题

MODULE_NAME :=intel-lpss-pci
obj-m :=$(MODULE_NAME).o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

export KBUILD_CFLAGS

all:
	$(MAKE) -C $(KERNELDIR) M=$(PWD)
		
clean:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) clean

驱动参数调整

? ? ?本文主要关注时序、速率相关参数的调整。

? ? 1) 参数配置的字段代码位置

intel-lpss-pci.c??????? drivers\mfd??? 21184????? 2021/10/26???? 28

static const struct property_entry spt_i2c_properties[] = {

???????? PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 230),

???????? { },

};

2) 对1)中参数进行解析

i2c-core-base.c?????? drivers\i2c?????? 72166????? 2021/10/26???? 1482

i2c_parse_timing的第二个参数 对应? 1)中PROPERTY_ENTRY_U32的第一个参数。

将解析的参数放入到结构体? i2c_timing中。

/**
 * struct i2c_timings - I2C timing information
 * @bus_freq_hz: the bus frequency in Hz
 * @scl_rise_ns: time SCL signal takes to rise in ns; t(r) in the I2C specification
 * @scl_fall_ns: time SCL signal takes to fall in ns; t(f) in the I2C specification
 * @scl_int_delay_ns: time IP core additionally needs to setup SCL in ns
 * @sda_fall_ns: time SDA signal takes to fall in ns; t(f) in the I2C specification
 * @sda_hold_ns: time IP core additionally needs to hold SDA in ns
 * @digital_filter_width_ns: width in ns of spikes on i2c lines that the IP core
 *	digital filter can filter out
 * @analog_filter_cutoff_freq_hz: threshold frequency for the low pass IP core
 *	analog filter
 */
struct i2c_timings {
	u32 bus_freq_hz;
	u32 scl_rise_ns;
	u32 scl_fall_ns;
	u32 scl_int_delay_ns;
	u32 sda_fall_ns;
	u32 sda_hold_ns;
	u32 digital_filter_width_ns;
	u32 analog_filter_cutoff_freq_hz;
};

?3) 将速率配置转到设备的自有结构体中

i2c-designware-master.c?? ?drivers\i2c\busses?? ?24699?? ?2021/10/26?? ?602
?

调用流程:dw_i2c_plat_probe(i2c-designware-platdrv.c?? ?drivers\i2c\busses?? ?10413?? ?2021/10/26?? ?201) 或者? i2c_dw_pci_probe ----->?i2c_dw_configure

?4) 时序参数写入寄存器中

i2c-designware-master.c?????? drivers\i2c\busses 24699????? 2021/10/26??? 602

速率的参数设置最终在哪里写入到寄存器的??
?

设备的区分

i2c-1 和i2c-2的区别是什么呢?!

sudo i2cdetect -l
i2c-3   i2c             i915 gmbus dpc                          I2C adapter
i2c-1   i2c             Synopsys DesignWare I2C adapter         I2C adapter
i2c-8   i2c             AUX C/DDI C/PHY C                       I2C adapter
i2c-6   i2c             AUX A/DDI A/PHY A                       I2C adapter
i2c-4   i2c             i915 gmbus dpb                          I2C adapter
i2c-2   i2c             Synopsys DesignWare I2C adapter         I2C adapter

通过lspci可以查看,两个I2C设备对应的设备ID不同

 lspci -n
00:00.0 0600: 8086:3ec4 (rev 07)
00:02.0 0300: 8086:3e9b
00:08.0 0880: 8086:1911
00:12.0 1180: 8086:a379 (rev 10)
00:14.0 0c03: 8086:a36d (rev 10)
00:14.2 0500: 8086:a36f (rev 10)
00:15.0 0c80: 8086:a368 (rev 10)   (两个i2c设备)
00:15.1 0c80: 8086:a369 (rev 10)

?此处a368是我们需要的,我们只需要从i2c-1 或者i2c-2中的信息中找到设备ID为a368的值就可以了。

参考资料

Linux I2C Sysfs — The Linux Kernel documentation

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:58:04  更:2022-10-08 20:58:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 1:58:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计