<target>

  # 整透stm32之spi双机通信(包括双机同为stm32,stm32& others)

<概念>

  # 双机通信(全双工)

  在主机的MOSI管脚输出1bit,从机MOSI管脚接收1bit,同时从机MISO管脚输出1bit,主机MISO管脚接收1bit。即主机发送1bit的同时接收1bit。

  # 通信时钟

  通信时钟永远由主机产生,且是在发送数据过程中产生,数据发送完毕后时钟消失。

<筹备>

  # 在主机发送指令,从机接收后作出响应的机制中,具体过程分析如下

  为保证主机能准确完整的收到从机的数据,须在主机下发指令后,继续发送一定长度(长度取决于从机的响应长度)的数据(无效数据),目的是为产生通信时钟,从而接收从机发送的响应,这就要求在主机发送无效数据时,从机的响应数据已存入至从机的SPI->DR,这样主机就可以在通信时准确完整的拿走数据,完整的数据包数据遵从这样的单字节数据发送接收机制。

  要记住,主机是主动者、是领导,领导不等人(无论从机是否将数据准备好,他只会带走发送数据这一时刻的从机数据),主机决定何时发送数据,因为它握着命脉--时钟,而在发送过程中会带走一包数据。

  要记住,在全双工通信过程中,主机与从机时协作关系,而非独立的,要保证数据完整可靠的传输,就必须主机从机密切配合。

  # 实现方式如下

  > 普通方式

  实现机制是,从机响应的传输使用的是查询方式,从接收到命令后作出的第一个字节响应数据开始,即在主机发送无效数据前,从机必须把响应数据的第一个字节存入至SPI->DR中,这样在主机发送无效数据时,一位一位的把从机响应数据接收走。当从机响应数据的第一个字节发送完毕后,通过查询spi发送数据寄存器为空,执行操作将响应数据存入至SPI->DR中,为下一字节传输做好准备。

  因为使用的是查询方式,实时性就会差一些,这就要求主机与从机要匹配好,否则会出现主机发送无效数据时,从机数据还未准备好,这将导致主机读走无效数据。

  查询方式在此处只是作为实现方式的一种,作出实现机制说明,在实际项目中不会使用此方式。

  > 中断方式

  实现机制是,从机响应的传输使用的是发送中断,从接收到命令后作出的第一个字节响应数据开始,即在主机发送无效数据前,从机必须把响应数据的第一个字节存入至SPI->DR中,这样在主机发送无效数据时,一位一位的把从机响应数据接收走。当从机响应数据的第一个字节发送完毕后,产生spi发送空中断,这就要求在发送空中断服务函数内执行操作,将响应数据存入至SPI->DR中,为下一字节传输做好准备。

  > DMA方式

<key>

  # 在spi外设开着的情况下,如果发送数据寄存器未发生刷新变化,则将继续发送上次最终发送末字节数据

  此种情况发生在主从机模式下,从机的发送数据寄存器不再刷新变化,当主机时钟到来的情况下,从机将上次最终发送的末字节数据发送出去,这是因为数据寄存器没有复位操作导致,spi的发送流程是从机预先将数据寄存器中的数据copy至移位寄存器中,当主机时钟到来时依次移位出去,由实际调试结果得出,移位寄存器和数据寄存器都没有specific的复位功能,除非关闭外设(将复位整个外设)

<细节>

<注意>

<总结>

学习7__STM32--SPI外设之双机通信---的更多相关文章

  1. STM32学习笔记——SPI串行通讯(向原子哥学习)

    一.SPI  简介 SPI是 Serial Peripheral interface 的缩写,就是串行外围设备接口.SPI 接口主要应用在  EEPROM, FLASH,实时时钟,AD 转换器,还有数 ...

  2. pixy&STM32使用记录(串口&SPI外设)

    先踏踏实实的把stm32的外设串口,SPI搞清楚,不要眼高手低,看不起小事.用SPI通信将pixy的数据读出来,将数据用串口发到串口助手上,然后处理数据,利用STM32的定时器调节pwm,控制电机,先 ...

  3. Linux can双机通信(2440+MCP2515 && 51+SJA1000)

    2012-01-12 22:43:24 上图: 自收发成功完成后,那么双机通信就比较容易了.关键就是CAN波特率.ID标识.滤波设置正确即可双机通信了.

  4. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  5. arduino双机通信 (解决引脚不够用)

    作用 实现将一个 arduino 中的多个 String 类型变量准确地传到另一个 arduino 中对应的多个 String 类型变量 中. 接线图 注意 TX 接另一个arduino的 RX !可 ...

  6. Proteus仿真—51单片机实现AC信号测频、显示、双机通信

    文章目录 一.原理图部分 二.源码部分 单片机1 单片机2 在Proteus仿真软件里面使用STC89C52实现指定频率的AC信号的测频.显示.双机通信. 一.原理图部分 整体的电路图如示: DC-A ...

  7. 利用C51单片机模拟SPI进行双机通信

    SPI协议简述 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.由Motorola首创.SPI接口主要应用在 EEPROM,FLASH,实时时 ...

  8. usb-host与外设之间的通信(一)

    迫于需要开始一个app实现安卓手机控制外设,要学习一下usb-host这方面的知识,所以记录一下自己的学习经历.关于usb-host这一块的资料国内还是比较少的,我只能学到哪里就记录到哪里了. 简单来 ...

  9. Linux学习 :SPI通讯协议

    SPI接口的全称是"Serial Peripheral Interface",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的.SPI接口主要应用在E ...

随机推荐

  1. springboot mybatis 后台框架平台 集成代码生成器 shiro 权限

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...

  2. storm报错:Exception in thread "main" java.lang.RuntimeException: InvalidTopologyException(msg:Component: [mybolt] subscribes from non-existent stream: [default] of component [kafka_spout])

    问题描述: storm版本:1.2.2,kafka版本:2.11.   在使用storm去消费kafka中的数据时,发生了如下错误. [root@node01 jars]# /opt/storm-1. ...

  3. BQMeetup

    BQMeetup 时间:2017.12.19 地点:北京东城区东直门国华投资大厦1105

  4. 基于RapidJSON的操作库

    需要安装配置RapidJSON库 /******************************************************************* * summery: 提供便 ...

  5. 部署AlwaysOn第二步:配置AlwaysOn,创建可用性组

    AlwaysOn是在SQL Server 2012中新引入的一种高可用技术,从名称中可以看出,AlwaysOn的设计目标是保持数据库系统永远可用.AlwaysOn利用了Windows服务器故障转移集群 ...

  6. Js_网站右下角悬浮视窗可关闭广告

    站右下角悬浮视窗可关闭广告代码,可收缩.展开,关闭,内容区可自定义html,兼容IE8+.FireFox.Chrome.Safari等主流浏览器.广告图片尺寸300x250. 使用方法:在head区域 ...

  7. 关于OBS获取显示器黑屏的解决办法

    近来看到许多人说OBS获取显示器源的时候黑屏,下面介绍下相关处理办法. 第一种,先尝试把OBS程序的兼容性设置成Win 7和管理员身份,具体操作: 设置成这样,如果能够获取到显示器,那么问题解决,否则 ...

  8. imagick用法!

    https://coderwall.com/p/9hj97w sudo apt-get install imagemagick sudo apt-get install php5-imagick su ...

  9. 使用jQuery的分页插件jquery.pagination.js进行分页

    1,需要用到jquery.pagination.js和pagination.css https://pan.baidu.com/s/1G3PLQSRGjvLxl2ryqpV76w https://pa ...

  10. 20135323符运锦----第三周:构建一个简单的Linux系统MenuOS

    相关知识点 1.arch目录 占据相当庞大的空间,X86目录下代码需要重点关注. 2.init目录 内核启动的相关代码基本都在此目录下,内含MAIN.C,文件中START_KERNEL是整个LINUX ...