SPI通信

SPI是由Motorola公司提出的一种同步串行外围接口;它在速度要求不高,低功耗,需要保存少量参数的智能化传感系统中得到了广泛应用;

  SPI是一个全双工的同步串行接口,在数据传输过程中,总线上只能是一个主机和一个从机进行通信;

  通信四种模式:

    1、MISO(Master In Slave Out)

       主机输入,从机输出;

    2、MOSI(Master  Out  Slave In)

        主机输出,从机输入;

    3、SCK(Serial  Clock)

        串行时钟信号

    4、SS(Slave  Select)

        从机选择信号,低电平有效;(即作从机时,该位置低)

SPI总线可在软件的控制下构成各种系统

        

                      SPI总线与多从机连接

SPI的基本结构相当于两个8位移位寄存器的首尾相接,构成16位的环形移位寄存器,从而实现了主机与从机的数据交换;

          

                      SPI接口的基本结构图

SPI主从模式

  设置MSTR(主设备选择)和SPE位(使能位)来选择是否工作在主模式还是从模式;

stm32强大之处:因为从机NSS位必须接0,而主机NSS位接1;stm32可以有软件来设置相应的主从位;

SPI下时钟信号的相位和极性(设置由与之通信的具体芯片来设定)

  SPI接口可由CPOL和CPHA设定4种不同传输格式的时序;

  CPOL决定时钟脉冲SCK的有效脉冲方式(正脉冲、负脉冲)。CPHA决定数据线MOSI什么时候输出数据或采集数据;

  根据CPOL和CPHA的组合数目,一共四种设置情况;

                       

数据图分析:

        

数据帧的格式

  根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB(高位先传)在先也可以是LSB(低位先传),根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或者16位,所选择的数据帧格式对发送/接收都有效;

SPI通信配置步骤:(在主模式下,串行时钟在SCK脚产生)

  1、通过SPI_CR1寄存器的BR[2:0]位定义串行时钟波特率;

  2、选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系;

  3、设置DFF位来定义8/16位数据帧格式;

  4、配置SPI_CR1寄存器的LSBFIRST位定义帧格式;

  5、如果NSS引脚需要工作在输入模式,硬件模式中在整个数据帧传输期间应把NSS脚连接到高电平;在软件模式中,需要设置SPI_CR1寄存器的SSM和SSI位,如果NSS引脚工作在输出模式,则只需设置SSOE位;

  6、必须设置MSTR和SPE位(只当NSS被连到高电平,这些位才能保存置位)。

    在这个配置中,MOSI脚是数据输出,而MISO脚是数据输入;

SPI通信过程:

  

  

 

时间: 2024-11-08 21:46:50

SPI通信的相关文章

关于SPI通信的一个小疑问

问题描述 关于SPI通信的一个小疑问 SPI是串行外设接口的简称,多用于系统内部通信,直接传送数据即可. 我想问的是,一般像Modbus,can总线等都有应用层的协议,规定了标识符,地址,功能码等等.那么spi呢,比如我有好几个变量,ucA,ucB,ucC,甚至还有类型不对齐的数据,我该怎么传输,又如何能分的清传输来的数据是哪个变量的.要自己弄个协议?一般是怎么实现的呢谢谢了.

arm与FPGA通信如何定义SPI通信的数据解析协议

问题描述 arm与FPGA通信如何定义SPI通信的数据解析协议 用arm自带的spi驱动与FPGA进行通信,arm端做主机每次发送一字节8位,需要往FPGA里发送一些参数和数据, ,其中发送的数据内容在0x00到0xFF都会出现,求解如何定义协议进行解析才能把参数跟数据分开来.求大神解答 解决方案 Raspberry pi通过SPI与FPGA通信串行通信_SPI通讯协议 解决方案二: 定义数据格式 比如开始两字节命令+数据长度+数据+crc 解决方案三: http://www.openedv.c

求spi通信verilog代码

问题描述 求spi通信verilog代码 小白急求FPGA与ARM板之间SPI通信模式0 的verilog代码,能收一字节回发一字节就行 解决方案 有ip核可以用吧,实在不行找本书自己写一个,书上都会有spi例程

fpga-stm32与FPGA spi通信

问题描述 stm32与FPGA spi通信 求 FPGA的vhdl 程序 和stm32液晶如何显示 fpga的vhdl代码 解决方案 STM32 spi总线通信 最近在研究SPI总线,至于协议和硬件描述就不多说了 四线包括时钟.片选.接收.发送 初始化SP ? SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; ?//全双工 ? SPI_InitStructure.SPI_Mode = S......答案就在这里:

【STM32 .Net MF开发板学习-10】SPI测试之触摸屏坐标获取

STM32F103xx Cortex-M3系列的芯片含三路SPI通道,红牛开发板用了两路,SPI1连接AT45DB161B型号的SPI Flash,SPI2连接ADS7843触摸屏信号处理芯片,SPI3最好不要用,因为和JTAG的管脚有冲突,调试时会有问题.EM-STM3210E开发板由于不含触摸屏,所以只用了一路来连接SPI Flash.本篇博文介绍触摸屏坐标获取,所以只有拥有红牛开发板的用户可以测试. 先简单介绍一下SPI相关的知识,SPI是英语Serial Peripheral inter

嵌入式i.mx28x的新增加的SPI设备驱动怎么修改移植?求大神指导

问题描述 嵌入式i.mx28x的新增加的SPI设备驱动怎么修改移植?求大神指导 请问i.MX287或者i.mx28x系列的核心板,新增加一个SPI设备(ZigBee设备,用SPI通信),这个设备的驱动该怎么修改啊?嵌入式新手求大神指导啊,飞思卡尔的资料好少,求啊! 解决方案 http://blog.csdn.net/wqc02/article/details/8879888

Android单片机与蓝牙模块通信实例代码_Android

啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通过参考网上资料,问题顺利搞定,下面小编把具体实现思路分享给大家,供大家参考. 1.Android蓝牙编程 蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码(Universally Unique Identifier),这是一个软件构建的标准,也是被开源基金会组织应用在分布式计算环境领域的一部分.在蓝牙3.0及下一版本中,UUID被用于唯一标识一个服务,比如文件传输服务,串口服务.打印机服务等,如下: #蓝牙串

Linux驱动修炼之道-SPI驱动框架源码分析(上)【转】

转自:http://blog.csdn.net/lanmanck/article/details/6895318 SPI驱动架构,以前用过,不过没这个详细,跟各位一起分享: 来自:http://blog.csdn.net/woshixingaaa/article/details/6574215     SPI协议是一种同步的串行数据连接标准,由摩托罗拉公司命名,可工作于全双工模式.相关通讯设备可工作于m/s模式.主设备发起数据帧,允许多个从设备的存在.每个从设备 有独立的片选信号,SPI一般来说

接口-我想制作一个电子阅读器用stm32f103rct6,求住制作流程,网上有一个,不是很懂求指教

问题描述 我想制作一个电子阅读器用stm32f103rct6,求住制作流程,网上有一个,不是很懂求指教 这是我从网上down的方法,有点不懂,关键就是编程还有MF RC522模块设计,求大虾指教,谢谢 1 硬件设计 1.1 硬件结构设计 RFID阅读器基于STM32单片机设计,芯片型号选择为STM32F103RBT6.该芯片为LQFP64封装, 内部有128 KB Flash和20 KB RAM,采用32位的ARM CortexTM-M3内核, 最高支持主频72 MHz,拥有2个SPI接口. 2