i.MX6U SPI浅析

2023-05-16

1.SPI简介

SPI 全称是 SerialPerripheral Interface,也就是串行外围设备接口。SPI 是 Motorola 公司推出的一种同步串行接口
技术,是一种高速、全双工的同步通信总线,SPI 时钟频率相比 I2C 要高很多,最高可以工作在上百 MHz。SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要4 根线,但是也可以使用三根线(单向传输),本章我们讲解标准的 4 线 SPI,这四根线如下:

  • CS/SS,Slave Select/Chip Select,这个是片选信号线,用于选择需要进行通信的从设备。I2C 主机是通过发送从机设备地址来选择需要进行通信的从机设备的,SPI 主机不需要发送从机设备,直接将相应的从机设备片选信号拉低即可。
  • SCK,Serial Clock,串行时钟,和 I2C 的 SCL 一样,为 SPI 通信提供时钟。
  • MOSI/SDO,Master Out Slave In/Serial Data Output,简称主出从入信号线,这根数据线只能用于主机向从机发送数据,也就是主机输出,从机输入。
  • MISO/SDI,Master In Slave Out/Serial Data Input,简称主入从出信号线,这根数据线只能用户从机向主机发送数据,也就是主机输入,从机输出。

SPI 通信都是由主机发起的,主机需要提供通信的时钟信号。主机通过 SPI 线连接多个从设备的结构如下图 所示

四种工作模式:改变串行时钟极性(CPOL)和相位(CPHA)能得到四种工作模式

  • CPOL=0,串行时钟空闲状态为低电平。
  • CPOL=1,串行时钟空闲状态为高电平。
  • CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
  • CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。

 以 CPOL=0,CPHA=0 这个工作模式为例,SPI 进行全双工通信的时序如图

主机输出11010010   主机读取数据位01100110

 

 I.MX6U ECSPI 简介

•全双工同步串行接口
•主/从配置
•四个片选(SS)信号支持多个外设
•传输继续功能允许无限长度的数据传输
•32*64的FIFO,用于发送和接收数据
•片选(SS)和SPI时钟(SCLK)的极性和相位是可配置的
•直接内存访问(DMA)支持
•最大工作频率直至参考时钟频率。

 重要寄存器:

1.接收数据寄存器(ECSPIx_RXDATA)

接收数据寄存器(ECSPI_RXDATA)是只读寄存器,它构成前几位64 x 32的字接收FIFO。 该寄存器保存从外部接收的数据
数据传输期间的SPI设备。 仅允许字大小的读取操作。

2.发送数据寄存器(ECSPIx_TXDATA)

发送数据(ECSPI_TXDATA)寄存器是一个只写数据寄存器,保存将要发送的数据

3.控制寄存器(ECSPIx_CONREG)

BURST_LENGTH(bit31:20) :突发长度,设置 SPI 的突发传输数据长度,在一次 SPI 发送中最大可以发送 2^12bit 数据。可以设置 0X000~0XFFF,分别对应 1~2^12bit。我们一般设置突发长度为一个字节,也就是 8bit,BURST_LENGTH=7。

CHANNEL_SELECT(bit19:18):SPI 通道选择,一个 ECSPI 有四个硬件片选信号,每个片选信号是一个硬件通道,虽然我们本章实验使用的软件片选,但是 SPI 通道还是要选择的。可设置为 0~3,分别对应通道 0~3。

DRCTL(bit17:16) :SPI 的 SPI_RDY 信号控制位,用于设置 SPI_RDY 信号,为 0 的话不关心 SPI_RDY 信号;为 1 的话 SPI_RDY 信号为边沿触发;为 2 的话 SPI_DRY 是电平触发。


PRE_DIVIDER(bit15:12): SPI 预分频,ECSPI 时钟频率使用两步来完成分频,此位设置的是第一步,可设置 0~15,分别对应 1~16 分频。


POST_DIVIDER(bit11:8) :SPI 分频值,ECSPI 时钟频率的第二步分频设置,分频值为2^POST_DIVIDER。


CHANNEL_MODE(bit7:4): SPI 通道主/从模式设置,CHANNEL_MODE[3:0]分别对应 SPI通道 3~0,为 0 的话就是设置为从模式,如果为 1 的话就是主模式。比如设置为 0X01 的话就是设置通道 0 为主模式。


SMC(bit3):开始模式控制,此位只能在主模式下起作用,为 0 的话通过 XCH 位来开启 SPI突发访问,为 1 的话只要向 TXFIFO 写入数据就开启 SPI 突发访问。


XCH(bit2) :此位只在主模式下起作用,当 SMC 为 0 的话此位用来控制 SPI 突发访问的开启。


HT(bit1) :HT 模式是能位,I.MX6ULL 不支持。


EN(bit0) :SPI 使能位,为 0 的话关闭 SPI,为 1 的话使能 SPI。

4.配置寄存器(ECSPIx_CONFIGREG)

HT_LENGTH(bit28:24):HT 模式下的消息长度设置,I.MX6ULL 不支持。


SCLK_CTL(bit23:20):设置 SCLK 信号线空闲状态电平,SCLK_CTL[3:0]分别对应通道3~0,为 0 的话 SCLK 空闲状态为低电平,为 1 的话 SCLK 空闲状态为高电平。

DATA_CTL(bit19:16):设置 DATA 信号线空闲状态电平,DATA_CTL[3:0]分别对应通道3~0,为 0 的话 DATA 空闲状态为高电平,为 1 的话 DATA 空闲状态为低电平。

SS_POL(bit15:12) :设置 SPI 片选信号极性设置,SS_POL[3:0]分别对应通道 3~0,为 0 的话片选信号低电平有效,为 1 的话片选信号高电平有效。

SCLK_POL(bit7:4):SPI 时钟信号极性设置,也就是 CPOL,SCLK_POL[3:0]分别对应通道 3~0,为 0 的话 SCLK 高电平有效(空闲的时候为低电平),为 1 的话 SCLK 低电平有效(空闲的时候为高电平)。

SCLK_PHA(bit3:0): SPI时钟相位设置,也就是CPHA,SCLK_PHA[3:0]分别对应通道3~0,为 0 的话串行时钟的第一个跳变沿(上升沿或下降沿)采集数据,为 1 的话串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。

5.采样周期控制寄存器(ECSPIx_PERIODREG)

CSD_CTL(bit21:16) :片选信号延时控制位,用于设置片选信号和第一个 SPI 时钟信号之间的时间间隔,范围为 0~63。
CSRC(bit15):SPI 时钟源选择,为 0 的话选择 SPI CLK 为 SPI 的时钟源,为 1 的话选择32.768KHz 的晶振为 SPI 时钟源。我们一般选择 SPI CLK 作为 SPI 时钟源,

 

CCM_CSCDR2寄存器控制SPI时钟选择和分频 

 SAMPLE_PERIO(bit14:0): 控制采样周期,可设置为 0~0X7FFF 分别对应 0~32767 个周期。

6.状态寄存器(ECSPIx_STATREG)

TC(bit7):传输完成标志位,为 0 表示正在传输,为 1 表示传输完成。
RO(bit6):RXFIFO 溢出标志位,为 0 表示 RXFIFO 无溢出,为 1 表示 RXFIFO 溢出。
RF(bit5):RXFIFO 空标志位,为 0 表示 RXFIFO 不为空,为 1 表示 RXFIFO 为空。
RDR(bit4) :RXFIFO 数据请求标志位,此位为 0 表示 RXFIFO 里面的数据不大于RX_THRESHOLD,此位为 1 的话表示 RXFIFO 里面的数据大于 RX_THRESHOLD。
RR(bit3) :RXFIFO 就绪标志位,为 0 的话 RXFIFO 没有数据,为 1 的话表示 RXFIFO 中至少有一个字的数据。
TF(bit2) :TXFIFO 满标志位,为 0 的话表示 TXFIFO 不为满,为 1 的话表示 TXFIFO 为满。
TDR(bit1): TXFIFO 数据请求标志位,为 0 表示 TXFIFO 中的数据大于 TX_THRESHOLD,为 1 表示 TXFIFO 中的数据不大于 TX_THRESHOLD。

TE(bit0): TXFIFO 空标志位,为 0 表示 TXFIFO 中至少有一个字的数据,为 1 表示 TXFIFO为空。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

i.MX6U SPI浅析 的相关文章

  • STM32F407-SPI通信接口

    1 SPI概念 SPI xff0c 是一种高速的 xff0c 全双工 xff0c 同步的通信总线 xff0c 并且在芯片的管脚上只占用四根线 xff0c 节约了芯片的管脚 xff0c 同时为PCB的布局上节省空间 xff0c 提供方便 xf
  • STM32F407用wk2124芯片编写SPI转四路串口驱动

    目录 引言 一 SPI通信配置 1 GPIO初始化设置 2 SPI参数配置 3 读写函数 4 速度设置 二 WK2124逻辑代码编写 1 片选初始化 2 写寄存器函数 3 读寄存器函数 4 写FIFO函数 5 读FIFO函数 6 WK212
  • I.MX6ULL的SPI通信

    简述 SPI是串行外设接口 xff08 Serial Peripheral Interface xff09 的缩写 xff0c 相比于I2C最高400bps的传输速度 xff0c SPI每秒可以传输的数据可以高达几十M甚至上百Mbit 1
  • SPI 通讯协议

    Cuitbasics 汽车ECU设计 2 2 当您将微控制器连接到传感器 xff0c 显示器或其他模块时 xff0c 您是否考虑过这两种设备是如何相互通信的 xff1f 他们到底在说什么 xff1f 事实上电子设备之间的通信就像人类之间的交
  • pixhawk px4 spi设备驱动

    此篇blog是以nuttx官网介绍为出发点 xff0c 先分析如何初始化的 xff0c 再分析如何读取传感器数据的 xff0c 最后对比了字符型设备操作和spi驱动的实现方式的差别 如有错误还请指正 6 字符型设备 所有的结构体和API都在
  • UART、RS232、RS485、I2C和SPI的介绍

    基本知识 串行通信 xff1a 多个数据通过一条数据线 xff0c 依次传输并行通信 xff1a 多个数据通过多条数据线 xff0c 一次性传输单工通信 xff1a 只能接收数据或者发送数据 xff08 遥控器 收音机 xff09 半双工通
  • 什么是SPI通信

    ARM体系 SPI通信 一 什么是SPI通信 1 SPI是串行外设接口 Serial Peripheral Interface xff0c 可以理解为一种通信协议 xff0c 也就是用来传输数据的 2 SPI 是由摩托罗拉 Motorola
  • UART、IIC、SPI、CAN通信的区别与应用

    文章目录 1 通信的基本知识1 1 数据通信的种类1 1 1 串行通信1 1 2 并行通信1 1 3 总结 1 2 数据通信的传输方向1 2 1 单工1 2 2 半双工1 2 3 全双工1 2 4 总结 1 3 数据通信的方式1 3 1 同
  • STM32 SPI详解

    目录 1 SPI简介 2 SPI特点 2 1 SPI控制方式 2 2 SPI传输方式 2 3 SPI数据交换 2 4 SPI传输模式 3 工作机制 3 1 相关缩写 3 2 CPOL极性 3 3 CPHA相位 3 4 极性和相位图示 3 5
  • 蓝牙BLE---DA14683的SPI主机通信讲解

    DA14683的SPI主机通信例程 Date 2018 12 19 Create Jim 导入例程 首先导入ble peripheral例程或者pxp reporter例程 再到以下位置打开硬件SPI的宏定义 xff1a 获取SPI例程源码
  • spi通信

    特点 常规四线通信方式 一根片选线 xff0c 一根时钟线 xff0c 两根数据线 xff1a 一根是主进从出线 xff0c 一根主出从入线 同步 xff0c 全双工 xff0c 通信方式 和谁通信就将谁的片选线拉低 xff0c 每增加一个
  • 【STM32】HAL库-SPI

    3线全双工同步传输 带或不带第三根双向数据线的双线单工同步传输 8或16位传输帧格式选择 主或从操作 支持多主模式 8个主模式波特率预分频系数 最大为fPCLK 2 从模式频率 最大为fPCLK 2 主模式和从模式的快速通信 主模式和从模式
  • Raspberry Pi 与Arduino SPI通信

    本教程介绍了使用SPI 串行外围设备接口总线 进行Raspberry Pi与Arduino通讯和控制的基本框架 SPI代表了一种非常完善的芯片间通信方法 该方法在两种设备的硬件中均实现 在这里 我们将详细探讨SPI 讨论硬件和软件注意事项
  • SpringBoot系列--自定义Starter

    提到Spring Boot时 很多人想到的是它的自动化装配特性 当我们项目需要Redis MongoDB时 只需要引入相应的 spring boot starter data redis spring boot starter data m
  • Linux SPI 总线 和设备驱动架构之三:SPI控制器驱动

    通过第一篇文章 我们已经知道 整个SPI驱动架构可以分为协议驱动 通用接口层和控制器驱动三大部分 其中 控制器驱动负责最底层的数据收发工作 为了完成数据收发工作 控制器驱动需要完成以下这些功能 1 申请必要的硬件资源 例如中断 DMA通道
  • Java SPI机制

    一 SPI机制简介 SPI的全名为Service Provider Interface java spi机制的思想 系统里抽象的各个模块 往往有很多不同的实现方案 在面向的对象的设计里 一般推荐模块之间基于接口编程 模块之间不对实现类进行硬
  • micropython-SPI通讯

    micropython SPI通讯 1 什么是SPI 2 SPI通讯原理 3 Micropython中的SPI 4 ZTMR测试SPI 1 ZTMR中SPI引脚 2 ZTMRSPI自测 2 SPI 2板之间通讯测试 1 什么是SPI SPI
  • Linux内核自带SPI设备驱动测试程序分析:spidev_test.c

    在Linux系统中 SPI 的用户模式设备接口的驱动源码位于 drivers spi spidev c 在应用层生成 dev spidev 的节点 可以通过 read write 达到与硬件设备的 SPI 通信 下面介绍spidev驱动移植
  • 谁在驱动程序代码中调用“probe”函数?

    我试图理解thisomap2 panda 板的 mcspi 驱动程序代码 我不明白谁打电话probe函数以及调用链是什么this驱动代码 设备连接时如何通知驱动程序 探针函数由spi omap2 mcspi c保存在static struc
  • Spidev 不使用 ioctl 同时写入/读取

    我希望找到一些帮助 即使这个问题可能更多地与硬件相关而不是与软件相关 我们将会看到 我正在开发基于 Freescales P1021 处理器 ppc e500v2 内核 的定制板 将连接外部 PCB 并可通过 SPI 进行配置 该外部 PC

随机推荐

  • 通过git 上传本地代码至码云

    实验步骤 1 配置ssh xff08 1 xff09 在本地生成sshkey xff0c 打开git命令终端 git bash 窗口 ssh keygen t rsa C 34 xxxxx 64 xxxxx com 34 你的邮箱 xff0
  • git常见命令

    常见命令 1 初始化本地仓库 git init 2 需要与码云保持一致 git config global user name 34 用户姓名 34 git config global user email 34 用户邮箱 34 3 设置远
  • 【python】详解threading模块:lock、Rlock的使用(二)

    在之前的 python 详解threading模块 xff1a 基本概念 join阻塞和setDaemon守护主线程 xff08 一 xff09 一文中 xff0c 是有对多线程进行一个详细的梳理的 其中就提到了线程锁这一功能 主要基于Rl
  • 定位导航——旋转矩阵,IMU,左右乘

    我们先明确一下这里所说的一些概念 IMU IMU全称Inertial Measurement Unit xff0c 惯性测量单元 xff0c 主要用来检测和测量加速度与旋转运动的传感器 起初只是用来测量角度的 xff0c 后来随着其他传感器
  • scp命令详解

    相关知识 scp是secure copy的简写 xff0c 用于在Linux下进行远程拷贝文件的命令 xff0c 和它类似的命令有cp xff0c 不过cp只是在本机进行拷贝不能跨服务器 xff0c 而且scp传输是加密的 可能会稍微影响一
  • H3C命令详解(笔记)

    1 常用命令 lt gt xff1a 用户视图模式 xff0c 仅仅能配置基本参数 xff0c 调试命令 xff0c 权限较小 xff1a 系统视图模式 xff0c 可以做高级配置 system view 进入系统视图 quit 退出当前模
  • 解决Ubuntu18.04 安装ROS中 sudo rosdep init 和 rosdep update 失败问题

    解决Ubuntu18 04 安装ROS中 sudo rosdep init 和 rosdep update 失败问题 目录 解决Ubuntu18 04 安装ROS中 sudo rosdep init 和 rosdep update 失败问题
  • GD32F303 移植freertos 中断管理设定。。。。

    之前做项目时 xff0c 使用GD32F303并移植了freertos 移植过程网上有很多教程 xff0c 根据这些教程移植就可以 移植完后注意FreeRTOSConfig h中关于RTOS中断管理的设置 我移植时在官网下的是当时最新的RT
  • ros自建功能包操作

    功能包改名 假定功能包原名Apkg xff0c 要改成Bpkg 把Apkg功能包文件夹名改为Bpkg 把CMakeLists txt中project Apkg 改为project Bpkg 把Package xml文件中 lt name g
  • Jacobian矩阵和梯度矩阵

    记号标识 标量 xff1a 常规小写字母 xff1b 向量 xff1a 加粗的小写字母 x 61 x 1
  • 一份还热乎的蚂蚁金服面经(已拿Offer)!附答案!!

    本文转自 xff1a https mp weixin qq com s MzmdxqukOZ6rUta9nkGGw 本文来自我的知识星球的球友投稿 xff0c 他在最近的校招中拿到了蚂蚁金服的实习生Offer xff0c 整体思路和面试题目
  • arduino 自平衡小车3\对mpu6050获得的X轴角度和角速度进行卡尔曼滤波

    对mpu6050获得的X轴角度和角速度进行卡尔曼滤波 mpu6050得到的角度值有些值的偏差较大 xff0c 为了使平衡小车更加稳定 xff0c 需要对获得的角度进行优化 xff0c 使用 卡尔曼滤波 xff0c 代码如下 xff1a in
  • nginx CPU 100 跑满问题定位

    1 确定连接数是不是达到了上限 2 确定是不是开启了gzip压缩 xff0c 确定压缩等级 xff0c 小于1kb的不要压缩 xff1b 图片 xff0c 大文件 xff0c 大压缩文件等不要压缩 3 单个CPU占用100 原因的定位 xf
  • 虚拟串口及其在串口转以太网中的应用

    本文介绍虚拟串口的概念 xff0c 以及如何在串口转以太网中利用该技术 1 虚拟串口的概念 虚拟串口是用操作系统的虚拟驱动技术产生的串口 xff08 COM口 xff09 xff0c 相对于计算机本身的硬件串口 xff08 COM1等 xf
  • 机器学习——PCA降维

    参考文章 xff1a https zhuanlan zhihu com p 77151308 PCA xff08 Principal Component Analysis xff09 是一种常见的数据分析方式 xff0c 常用于高维数据的降
  • C++命名规则--简明即查即用版(Windows开发环境)

    目录 前言 1 类名 2 函数名 3 参数 4 变量 5 常量 6 静态变量 7 全局变量 8 类的成员变量 前言 Microsoft推出的命名规则匈牙利法是 在变量和函数名中加入前缀以增进人们对程序的理解 xff0c 但如此一来太为繁琐
  • STM32中的FreeRTOS-#1(入门)

    写在前面 xff1a 我一直觉得 xff0c 如果我能把一点知识说给别人听 xff0c 并且别人能听懂 xff0c 大概率我自己真的学会了 记录的过程也是自己梳理的过程 xff0c 本系列我把它称为 教程 xff0c 是想把它写得系统且有条
  • 信号量 与 互斥量的区别

    原文来源 https blog csdn net ZhipingXi article details 78031307 信号量 与 互斥量 xff08 锁 xff09 的区别 一 概念和定义 信号量 xff1a 多线程同步使用的 xff1b
  • opencv版本问题,引起的vins视觉结果漂移

    最近在根据vins代码进行改写 xff0c 实验发现 当opencv为3 4 12版本时 xff08 core imgproc imgcodecs这几个库 xff09 xff0c vins 优化结果会非常飘 如果vins结果比较离谱 xff
  • i.MX6U SPI浅析

    1 SPI简介 SPI 全称是 SerialPerripheral Interface xff0c 也就是串行外围设备接口 SPI 是 Motorola 公司推出的一种同步串行接口 技术 xff0c 是一种高速 全双工的同步通信总线 xff