MSM8953配置I2C及SPI
此次完成的任务是要使能高通8953平台的i2c和spi,主要做的工作就是在设备树文件中添加节点信息。主要的工作在于对设备树文件的修改,主要修改了msm8953-pinctrl.dtsi和msm8953.dtsi两个文件。
msm8953-pinctrl.dtsi是配置MSM8953芯片中的GPIO。在此文件中定义i2c使用哪个gpio。
因为引脚复用功能的存在,所以要先配置i2c的引脚复用功能,在msm8953-pinctrl.dtsi中进行如下配置:
i2c_4 {
i2c_4_active: i2c_4_active { /*i2c处于active状态*/
/* active state */
mux {
pins = "gpio14", "gpio15"; /*i2c有两根线,分别是SDA和SCL*/
/* SDA用到了gpio14,SCL用到了gpio15*/
function = "blsp_i2c4"; /*这个gpio组支持功能复用,在i2c_4_active中,gpio说明采用"blsp_i2c4"功能*/
};
config {
pins = "gpio14", "gpio15";
drive-strength = <2>; /*设置gpio14,gpio15这个pin脚组的驱动能力为2MA*/
bias-disable; /*选项有bias-pull-up、bias-pull-down和bias-disable。这里使用bias-disable,代表no-pull*/
};
};
i2c_4_sleep: i2c_4_sleep { /*i2c处于sleep状态*/
/* suspended state */
mux {
pins = "gpio14", "gpio15";
function = "gpio"; /*这时pins的功能设置为普通的gpio功能。这里体现出了pin脚的功能复用。*/
};
config {
pins = "gpio14", "gpio15";
drive-strength = <2>; /*驱动能力设置为2MA*/
bias-disable;
};
};
};
接下来,需要在文件msm8953.dtsi中添加一个新的i2c设备树节点:
根据spec获取物理地址,中断号等。
i2c_4: i2c@78b8000 { /* BLSP1 QUP4 */ /*i2c_4使用的是BLSP1 QUP4,对应的物理地址为0x78b8000*/
compatible = "qcom,i2c-msm-v2";
#address-cells = <1>;
#size-cells = <0>;
reg-names = "qup_phys_addr";
reg = <0x78b8000 0x600>; /*i2c_4对应的物理地址*/
interrupt-names = "qup_irq";
interrupts = <0 98 0>; /*根据spec可以得到BLSP1 QUP4对应的中断号为98,第三个0的含义为:*/
/*1: low-to-high edge triggered;2: high-to-low edge triggered;3: active high-level-sensitive;4: active low-level-sensitive*/
qcom,clk-freq-out = <400000>; /*希望得到的i2c总线时钟频率,HZ*/
qcom,clk-freq-in = <19200000>; /*提供的核心时钟频率,HZ*/
clock-names = "iface_clk", "core_clk";
clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>,
<&clock_gcc clk_gcc_blsp1_qup4_i2c_apps_clk>;
pinctrl-names = "i2c_active", "i2c_sleep"; /*用到的pinctrl。*/
pinctrl-0 = <&i2c_4_active>;
pinctrl-1 = <&i2c_4_sleep>;
qcom,noise-rjct-scl = <0>;
qcom,noise-rjct-sda = <0>;
qcom,master-id = <86>;
dmas = <&dma_blsp1 10 64 0x20000020 0x20>,
<&dma_blsp1 11 32 0x20000020 0x20>;
dma-names = "tx", "rx";
status = "okay";
};
确认i2c是否配置成功的方法:
adb shell
cd /dev/
ls i2c*
会看到所添加的i2c设备。
使用示波器可以观察到正确的波形,证明配置正确了。
对spi的配置和i2c类似,主要在msm8953-pinctrl.dtsi和msm8953.dtsi中进行修改:
在msm8953-pinctrl.dtsi中添加如下代码:
spi3 {
spi3_default: spi3_default {
/* active state */
mux {
/* MOSI, MISO, CLK */
pins = "gpio8", "gpio9", "gpio11"; /* 在这里,spi使用四根线,MOSI、MISO、CLK和CS。*/
/* MOSI对应gpio8,MISO对应gpio9,CLK对应gpio11,CS对应gpio10*/
/* spi普遍使用三根或四根线,在需要片选时需要加CS线*/
function = "blsp_spi3"; /* 功能复用,设置功能为"blsp_spi3" */
};
config {
pins = "gpio8", "gpio9", "gpio11";
drive-strength = <12>; /* 12 MA */ /*驱动能力为12MA*/
bias-disable = <0>; /* No PULL */ /*有三个选项:bias-disable、bias-pull-down、bias-pull-up*/
};
};
spi3_sleep: spi3_sleep {
/* suspended state */
mux {
/* MOSI, MISO, CLK */
pins = "gpio8", "gpio9", "gpio11";
function = "gpio"; /* 功能复用,在sleep状态时作为gpio。*/
};
config {
pins = "gpio8", "gpio9", "gpio11";
drive-strength = <2>; /* 2 MA */ /* 睡眠状态时的驱动能力设为2MA */
bias-pull-down; /* PULL Down */
};
};
spi3_cs0_active: cs0_active { /*设置CS片选线的gpio*/
/* CS */
mux {
pins = "gpio10";
function = "blsp_spi3"; /*功能复用*/
};
config {
pins = "gpio10";
drive-strength = <2>;
bias-disable = <0>;
};
};
spi3_cs0_sleep: cs0_sleep {
/* CS */
mux {
pins = "gpio10";
function = "gpio";
};
config {
pins = "gpio10";
drive-strength = <2>;
bias-disable = <0>;
};
};
};
在msm8953.dtsi中添加节点:
spi_3: spi@78b7000 { /* BLSP1 QUP3 */ /*使用BLSP1 QUP3*/
compatible = "qcom,spi-qup-v2";
#address-cells = <1>;
#size-cells = <0>;
reg-names = "spi_physical", "spi_bam_physical";
reg = <0x78b7000 0x600>,
<0x7884000 0x1f000>;
interrupt-names = "spi_irq", "spi_bam_irq";
interrupts = <0 97 0>, <0 238 0>; /*根据表2确定中断号*/
spi-max-frequency = <19200000>; /*最大的SPI设备的频率*/
pinctrl-names = "spi_default", "spi_sleep"; /*所用到的pin脚和功能*/
pinctrl-0 = <&spi3_default &spi3_cs0_active>;
pinctrl-1 = <&spi3_sleep &spi3_cs0_sleep>;
clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>,
<&clock_gcc clk_gcc_blsp1_qup3_spi_apps_clk>;
clock-names = "iface_clk", "core_clk";
qcom,infinite-mode = <0>;
qcom,use-bam; /*使用BAM模式*/
qcom,use-pinctrl;
qcom,ver-reg-exists;
qcom,bam-consumer-pipe-index = <8>;
qcom,bam-producer-pipe-index = <9>;
qcom,master-id = <86>;
};
如果配置正确,可以在/sys/class/spi_master/spi下看到spi总线:
adb shell
cd /sys/class/spi_master/
ls
spi和i2c知识总结:
SPI总线由三条信号线组成。SPI总线可以实现 多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备 间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。
如果用通用IO口模拟SPI总线,必须要有一个输出口,一个输入口,另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。
I2C总线是双向、两线、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。
如果用通用IO口模拟I2C总线,并实现双向传输,则需一个输入输出口,另外还需一个输出口。
iic的两根线:SDA、SCL,结构如下图所示。分别表示:
SDA:串行数据线。
SCl:串行时钟线。
图 IIC结构示意图
图 IIC总线数据传输协议示意图
spi的四根线:MOSI、MISO、CS、CLK,spi总线的结构和数据的传送格式如下图所示。分别代表:
MOSI:主输出,从输入。
MISO:主输入,从输出。
CS:片选。
CLK:同步时钟。
图 spi结构和数据传送格式示意图
MSM8953配置I2C及SPI相关推荐
- I2C和SPI注定要打一架
最近微信群里好几天聊到I2C,既然说到了I2C,那就有必要说SPI,那就一起说了算了,大家有更好见解的,留言回复下,让更多的人知道你的观点. 整理与网络,侵删 I2C和SPI应该要打一架? 现今,在低 ...
- Zephry I2C和SPI驱动器介绍和操作FM24V10闪存
目录 前言 一.I2C Drive 1. 开启方法 2. 使用方法 3. 主要API介绍 3.1 i2c_configure 3.2 i2c_transfer 3.3 i2c_recover_bus ...
- STM32常见通信方式(TTL、RS232、RS485、I2C,SPI,CAN)总结
STM32常见通信方式(TTL.RS232.RS485.I2C,SPI,CAN)总结 一.TTL电平:全双工(逻辑1: 2.4V–5V 逻辑0: 0V–0.5V) 1.硬件框图如下,TTL用于两个 ...
- 详细介绍GPIO、I2C、SPI通讯原理以及物理层原理
目录 一. GPIO 1. 什么是GPIO? 2. GPIO组成原理 3. GPIO工作原理 二. I2C 1. 什么是I2C? 2. I2C组成原理 3. I2C的特性 4. I2C的通讯模式 5. ...
- 串行通信协议(I2C、SPI、UART、SCCB、CAN)
推荐一部书,在这本书里面介绍了I2C.SPI.UART和CAN等通信协议,写的蛮不错的. 串行通信:设备与设备之间,传输数据按顺序依次1bit位接1bit位进行传输. 并行通信:设备与设备之间,通过多 ...
- SaleaeLogic 16 逻辑分析仪的安装及使用【对 I2C、SPI、串口的信号进行测量】
文章内容: 安装 SaleaeLogic 16 逻辑分析仪 用示波器和逻辑分析仪对 I2C.SPI.串口的信号进行测量,深入了解这些协议原理:并对照前两篇文章:[STM32 基于 I2C 通信协议的温 ...
- [转]关于I2C和SPI总线协议的优缺点
关于I2C和SPI总线协议 IICvs SPI 现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral ...
- I2C和SPI异同及使用注意
1 iic总线不是全双工,2根线SCL SDA.spi总线实现全双工,4根线SCK CS MOSI MISO 2 iic总线是多主机总线,通过SDA上的地址信息来锁定从设备.spi总线只有一个主设备, ...
- I2C与SPI通信总线协议
仅以寄存器地址为8Bit的器件为例:(例如MPU6500.LSM6DS3) I2C通信协议 I2C 的要点是了解I2C通信帧的组成部分:START起始位.STOP停止位.ACK/NACK信号.从机器件 ...
最新文章
- python 获取窗口句柄_Python文件读写最详细的讲解
- Linux下使用OTL操作mysql数据库
- 安卓首页图片轮播效果(淘宝、京东首页广告效果)
- django 与 百度 ueditor 富文本编辑器集成
- 【集训心得】在真哥强迫下不得不写的总结
- java实现一个单例设计模式_Java正确实现一个单例设计模式的示例
- ITK:将自定义操作应用于图像中的每个像素
- 测试过程中的防忽悠沟通法
- Linux AV1硬件视频解码将支持Intel Tiger Lake
- 原生JS动态计算输入框文本内容的宽度,当内容宽度超过输入框的宽度时可控
- 计算机知识探索怎么写,计算机基础知识及探索.doc
- react学习预备知识_在10分钟内学习React基础知识
- 根据Request获取客户端IP
- java输入某年某个季度_Java获取某年某季度的第一天出错
- 中国替扎尼定行业市场供需与战略研究报告
- 如何升级mysql-libs_MySQL升级教程(CentOS)
- MATLAB等值线绘制
- es python search 返回_Elasticsearch - python操作es,以及curl命令查询es的总结
- java正则表达式 后顾_正则表达式 - CrazyManDF的个人空间 - OSCHINA - 中文开源技术交流社区...
- zbrush 制作护腕1 -- 基础模型
热门文章
- 前端JavaScript(1) --Javascript简介,第一个JavaScript代码,数据类型,运算符,数据类型转换,流程控制,百度换肤,显示隐藏...
- 操作系统:文件系统——空闲块成组链接法的模拟
- Vue 源码之 mixin 原理
- Android 性能优化 (一)APK高效瘦身
- 基于SSM第一医院病案管理系统
- 动作捕捉技术对演员的演技诉求
- vue3项目中如何使用iconfont图标?体积太大?看这篇文章就够了!
- 人机交互新突破:百度发布主动多模态交互技术
- Windows程序设计(中文第五版·珍藏版).mobi 电子书
- 如何做好实施前准备?