| |
|
开发:
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驱动 |
目录 速率主要支持的速率如下: 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 NACKNACK 信号表现: 在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采用的驱动。
驱动入口? ?通过lspci查看驱动信息如下: ??
? ? ?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源代码版本要与目标系统中的内核版本比较一致,不然会有很多编译问题。
驱动参数调整? ? ?本文主要关注时序、速率相关参数的调整。 ? ? 1) 参数配置的字段代码位置 intel-lpss-pci.c??????? drivers\mfd??? 21184????? 2021/10/26???? 28
2) 对1)中参数进行解析 i2c-core-base.c?????? drivers\i2c?????? 72166????? 2021/10/26???? 1482 i2c_parse_timing的第二个参数 对应? 1)中PROPERTY_ENTRY_U32的第一个参数。 将解析的参数放入到结构体? i2c_timing中。
?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的区别是什么呢?!
通过lspci可以查看,两个I2C设备对应的设备ID不同
?此处a368是我们需要的,我们只需要从i2c-1 或者i2c-2中的信息中找到设备ID为a368的值就可以了。 参考资料 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/25 20:55:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |