嵌入式第四课(继续SPI之路)

看起来SPI好像挺简单,连上四根线,设置好极性相位,速率等等就可以通信了,但实际上这不仅仅是SPI的通信,还有更多嵌入式所带来的问题,同样值得思考。

1.硬件连接的问题

1.1 逻辑分析仪

最开始收到12个FF的时候,没有多想,拿了一块F1的板子简单改了改代码又跑了一次,结果是一样的,然后问了导师,导师说他也不会SPI,我直接栓Q,后来有人建议用逻辑分析仪试一下,看看发送的指令是不是发出来了,然后就用来逻辑分析仪,得到的结果是这样的:
在这里插入图片描述

左边上面前七位是我发的指令,收到的是FF,这很正常,因为就是要把指令发完才会有应答,之前的数据无所谓,后面发送12个0用来接收应答,可以看出还是那熟悉的12个FF。

给人的感觉是这块芯片压根就没有工作嘛,在这期间真的是看了很几天的代码,觉得是代码出了问题,但这恰恰就是我第一次做项目的问题所在,在分析软件方面是否出现问题之前,一定要先检查硬件连接是否出了问题!
在分析软件方面是否出现问题之前,一定要先检查硬件连接是否出了问题!
在分析软件方面是否出现问题之前,一定要先检查硬件连接是否出了问题!

1.2 原理图

1.2.1 上拉电阻

硬件连接包括引脚之间的线是否连对了,线是否有损坏,还有就是电源供电是否正常,有没有共地,还有还有就是原理图是不是对的,在检查了前几个都没有问题后,我开始检查原理图是否正确:

Alt

从原理图中可以看出,SDA,SCL接了上拉电阻,于是我开始百度看看是否合理,因为之前画原理图的时候以为是用IIC通信,所以上拉了SDA和SCL,但这两根线也是SPI的MOSI和MISO,而实际上正常来讲,SPI的输入输出是不需要上拉电阻的,但是呢,接了上拉电阻只会增强信号,并没有什么问题,有益无害, 那么这个问题被排除了。

1.2.2 电容

在这里我看到电源和GND之间接了一个电容,思考再三想明白了,应该是用来滤波的,又查了一下,专业一点叫做“退藕”,作用是为高频信号提供通路,减小电源内阻,去除电源和地线在敷铜板上“走长线”的影响,防止公用电源的各部分电路之间的“有害交连”等等。

1.2.3 复位

复位这里就出现了问题,看了芯片的手册发现,芯片是低复位,而原理图中将复位引脚直接拉低,当成高复位了,这一发现让我重新燃起了希望,我将电阻取下来,在C38电容两端飞了一根线,结果还是12个FF,蚌埠住了。。。

但是至少硬件方面的没有问题了。

2.HAL库的使用

秉着先硬件后软件的思想,我又把矛头对准软件上的问题,我问了一个搞过SPI的师兄,他用的是HAL库驱动,在发数据和接收数据的时候是分开的,于是我又了CuBeMX生成了一个STM32F4的HAL库,在stm32f4xx_hal_spi.c中找到了分别发送和接收的SPI接口:

HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

但是HAL也有同时发送和接收数据的接口:

 HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)

然后我又都试过一遍,结果依然是12个FF,那为什么师兄会用HAL库分别发送和接收,我开始仔细研究这些接口有什么不同。

3.深入底层驱动

底层驱动说起来可能要说很多,但是抛开其他的不谈,只看接收和发送的过程可以看出:收发同步就是设置一个标志位,先将数据放进SPI_DR数据寄存器中发送,改变标志位,暂停发送,然后接收DR寄存器返回的值。
在这里插入图片描述

而单独发送(接收)则是设置要收到(发送)的字节大小和字节数为0,相当于发送之后就不管接收到的是什么,和之前标准库发送数据没有设置返回值是一样的。

看了很久之后发现,单独发送和接收之间的不同点就是,接收的时候需要发送Dummy数据在CLK上产生时钟,这让我对单独收发的时序产生了怀疑:

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
嵌入式系统设计实战:基于飞思卡尔S12X微控制器》以飞思卡尔半导体公司(原摩托罗拉半导体部)16位S12X系列微控制器中MC9S12XS128为蓝本阐述嵌入式系统的软件与硬件设计。全书共11章,其中第1章阐述嵌入式系统的知识体系、学习误区与学习建议。第2章给出XS128硬件最小系统,并简要介绍S12XCPU(CPU12X)。第3章给出第一个样例程序及CodeWai·“or工程组织,完成第一个S12X工程的入门。第4章给出基于硬件构件的嵌入式系统开发方法。第5章阐述串行通信接口SCI,并给出第一个带中断的实例。1~5章介绍了学习一个新MCU完整要素(知识点)的入门。6~12章分别介绍GPIO的应用(键盘、LED及LCD)、定时器(含PWM)、串行外设接口SPI、Flash存储器在线编程、CAN总线、A/D转换及S12XS128其他模块等。附录给出相关资料。《嵌入式系统设计实战:基于飞思卡尔S12X微控制器》涉及的实例源程序、辅助资料、相关芯片资料及常用软件工具,可在北航出版社下载中心或苏州大学飞思卡尔嵌入式系统研发中心网站下载。《嵌入式系统设计实战:基于飞思卡尔S12X微控制器》可供大学有关专业的高年级学生和研究生用作教材或参考读物,也可供嵌入式系统开发与研究人员用作参考和进修资料。 第1章 概述 1 1.1 嵌入式系统定义、由来及特点 1 1.1.1 嵌入式系统的定义 1 1.1.2 嵌入式系统的由来及其与微控制器的关系 2 1.1.3 嵌入式系统的特点 3 1.2 嵌入式系统的知识体系、学习误区及学习建议 4 1.2.1 嵌入式系统的知识体系 4 1.2.2 嵌入式系统的学习误区 5 1.2.3 基础阶段的学习建议 8 1.3 嵌入式系统常用术语 10 1.3.1 与硬件相关的术语 10 1.3.2 与通信相关的术语 11 1.3.3 与功能模块及软件相关的术语 12 1.4 嵌入式系统常用的C语言基本语法 13 第2章 S12X系列MCU硬件最小系统及CPU12X 26 2.1 S12X系列MCU概述及型号标识 26 2.1.1 S12X系列MCU概述 26 2.1.2 S12X系列MCU型号标识 28 2.2 S12X系列MCU的功能及存储器映像 29 2.2.1 S12X系列MCU的功能 30 2.2.2 S12X系列MCU的存储器映像及特点 31 2.3 XS128的引脚功能及硬件最小系统 36 2.3.1 XS128(80引脚QFP封装)的引脚功能 37 2.3.2 XS128的硬件最小系统 40 2.3.3 硬件最小系统的焊接与测试步骤 43 2.4 CPU12X的内部寄存器 44 2.5 CPU12X的寻址方式 47 2.6 CPU12X指令系统概要 51 2.6.1 数据传送类指令 53 2.6.2 算术运算类指令 56 2.6.3 逻辑运算类与位操作类指令 60 2.6.4 程序控制类指令 63 2.6.5 其他类指令 71 2.7 CPU12X汇编语言基础 72 2.7.1 S12X汇编源程序格式 72 2.7.2 S12X汇编语言伪指令 74 第3章 第一个样例程序及CodeWarrior工程组织 77 3.1 通用I/O接口基本概念及连接方法一 77 3.2 XS128的GPIO寄存器与GPIO构件封装 79 3.2.1 XS128的GPIO寄存器 79 3.2.2 GPIO的简单编程方法 83 3.3 CodeWarrior开发环境与S08/S12/ColdFire三合一写入器 84 3.3.1 CodeWarrior开发环境简介与基本使用方法 85 3.3.2 S08/S12/ColdFire三合一写入器 86 3.3.3 MC9S12XS128硬件评估板 87 3.4 CW环境C语言工程文件的组织 87 3.4.1 工程文件的逻辑组织结构 88 3.4.2 工程文件的物理组织结构 90 3.4.3 系统启动及初始化相关文件 91 3.4.4 芯片初始化、主程序、中断程序及其他文件 98 3.4.5 机器码文件(s19文件)的简明解释 101 3.4.6 lst文件与map文件 103 3.4.7 如何在CW环境下新建一个S12工程 105 3.5 第一个C语言工程:控制小灯闪烁 105 3.5.1 GPIO构件设计 106 3.5.2 Light构件设计 113 3.5.3 Light测试工程主程序 115 3.5.4 理解第一个C工程的执行过程 116 3.6 第一个汇编语言工程:控制小灯闪烁 117 3.6.1 汇编工程文件的组织 118 3.6.2 Light构件汇编程序 122 3.6.3 Light测试工程主程序 124 3.6.4 理解第一个汇编工程的执行过程 126 第4章 基于硬件构件的嵌入式系统开发方法 129 4.1 嵌入式系统开发所遇到的若干问题 129 4.2 嵌入式硬件构件的基本思想与应用方法 130 4.3 基于硬件构件的嵌入式系统硬件电路设计 131 4.3.1 设计时需要考虑的基本问题 131 4.3.2 硬件构件化电路原理图绘制的简明规则 133 4.3.3 实验PCB板设计的简明规则 135 4.4 基于硬件构件的嵌入式底层软件构件的编程方法 139 4.4.1 嵌入式硬件构件和软件构件的层次模型 139 4.4.2 底层构件的实现方法与编程思想 140 4.4.3 硬件构件及底层软件构件的重用与移植方法 141 第5章 串行通信接口SCI 144 5.1 异步串行通信的通用基础知识 144 5.1.1 串行通信的基本概念 145 5.1.2 RS-232总线标准 146 5.1.3 TTL电平到RS-232电平转换电路 148 5.1.4 串行通信编程模型 149 5.2 SCI模块的编程寄存器 150 5.3 SCI编程实例 155 5.3.1 SCI初始化与收发编程的基本方法 156 5.3.2 SCI构件设计与测试实例 157 5.4 XS128的中断源与第一个带有中断的编程实例 166 5.4.1 中断与异常的通用知识 166 5.4.2 XS128的中断机制 166 5.4.3 XS128的中断编程方法 171 5.4.4 XS128的中断优先级编程实例 173 第6章 GPIO的应用实例:键盘、LED与LCD 175 6.1 键盘技术概述 175 6.1.1 键盘模型及接口 175 6.1.2 键盘编程的基本问题 177 6.1.3 键盘构件设计与测试实例 178 6.2 LED技术概述 184 6.2.1 扫描法LED显示编程原理 184 6.2.2 LED构件设计与测试实例 186 6.3 LCD技术概述 191 6.3.1 LCD的特点和分类 191 6.3.2 点阵字符型液晶显示模块 193 6.3.3 HD44780 193 6.3.4 LCD构件设计与测试实例 199 第7章 定时器相关模块 207 7.1 计数/定时器的基本工作原理 207 7.2 定时器模块的基本编程方法与实例 208 7.2.1 定时器模块计时功能的基本寄存器 210 7.2.2 定时器构件设计与测试实例 212 7.3 定时器模块输入捕捉功能的编程方法与实例 216 7.3.1 输入捕捉的基本含义 216 7.3.2 输入捕捉的寄存器 217 7.3.3 输入捕捉构件设计与测试实例 218 7.4 定时器模块输出比较功能的编程方法与实例 221 7.4.1 输出比较的基本知识 222 7.4.2 用于输出比较功能的相关寄存器 222 7.4.3 输出比较构件设计与测试实例 224 7.5 定时器模块脉冲累加功能的编程方法与实例 226 7.5.1 脉冲累加的基本知识 226 7.5.2 脉冲累加功能的相关寄存器 227 7.5.3 脉冲累加器构件设计 228 7.6 脉宽调制模块 231 7.6.1 PWM工作原理 231 7.6.2 XS128的PWM的特点及模块框图 232 7.6.3 脉宽调制模块PWM相关寄存器 233 7.6.4 PWM构件设计及测试实例 236 7.7 周期中断定时器模块PIT 243 7.7.1 PIT模块功能描述 243 7.7.2 PIT模块的编程寄存器 245 7.7.3 PIT构件设计与测试实例 248 第8章 A/D与SPI 252 8.1 A/D通用知识 252 8.1.1 A/D的基本问题 252 8.1.2 A/D转换器 253 8.1.3 A/D转换常用传感器简介 254 8.1.4 电阻型传感器采样电路设计 255 8.2 A/D模块的编程寄存器 257 8.3 A/D模块编程方法与实例 264 8.3.1 A/D模块基本编程方法 264 8.3.2 A/D构件设计与测试实例 265 8.4 SPI的基本工作原理 270 8.4.1 SPI基本概念 270 8.4.2 SPI的数据传输 272 8.4.3 SPI模块的时序 272 8.4.4 模拟SPI 276 8.5 SPI模块的编程寄存器 276 8.6 SPI构件设计与测试实例 282 第9章 Flash存储器在线编程 289 9.1 S12X系列MCU的Flash存储器的特点及分页机制 289 9.1.1 S12X系列MCU的Flash存储器的特点 290 9.1.2 XS128的Flash存储器分页机制 290 9.2 Flash存储器编程方法 295 9.2.1 Flash存储器编程的基本概念 295 9.2.2 Flash存储器的编程寄存器 296 9.2.3 FCCOB-NVM命令模式 300 9.2.4 Flash存储器的编程步骤 301 9.3 D-Flash在线编程 303 9.4 P-Flash在线编程 308 9.5 Flash存储器的保护特性和安全性 313 9.5.1 Flash存储器的配置区域 313 9.5.2 Flash存储器的保护特性 314 9.5.3 Flash存储器的安全性 317 第10章 CAN总线 321 10.1 CAN总线通用知识 321 10.1.1 CAN总线协议的历史概况 321 10.1.2 CAN硬件系统的典型电路 321 10.1.3 CAN总线的有关基本概念 324 10.1.4 帧结构 327 10.1.5 位时间 331 10.2 MSCAN模块简介 332 10.2.1 MSCAN特性 333 10.2.2 报文存储结构、标识符验收过滤与时钟系统 334 10.2.3 CAN模块的主要运行模式、低功耗选项、中断与响应 341 10.3 MSCAN模块的内存映射及寄存器定义 345 10.3.1 MSCAN模块内存映射 345 10.3.2 MSCAN模块寄存器 346 10.4 MSCAN模块双机通信测试实例 360 10.4.1 测试模型 360 10.4.2 编程要点 360 10.4.3 CAN模块底层构件设计 361 10.4.4 测试操作要点 374 10.5 MSCAN模块的自环通信实例 374 10.5.1 测试模型 374 10.5.2 编程要点及设计代码 374 第11章 系统时钟与其他功能模块 378 11.1 时钟与复位产生模块概述 378 11.1.1 锁相环技术 378 11.1.2 CRG模块框图 380 11.1.3 CRG模块的工作模式 381 11.1.4 XS128内部锁相环结构 383 11.2 XS128的CRG模块的初始化 384 11.2.1 XS128的CRG模块寄存器 384 11.2.2 初始化编程方法与实例 389 11.3 CRG模块的其他功能 392 11.3.1 CRG产生复位信号 392 11.3.2 中断 397 11.4 XS128的IRQ、XIRQ引脚、RTIBRK及SWI中断 398 11.4.1 IRQ与XIRQ引脚中断 398 11.4.2 实时中断 398 11.4.3 调试模块DBG与软件中断SWI指令 399 附录A XS128的映像寄存器 400 附录B S08/S12/ColdFireBDM简明使用方法 410 附录C 常见实践问题集锦 414 附录D XS128的C语言函数库 417 附录E XS128的中断源与中断向量表 421 参考文献 424
### 回答1: SPI(Serial Peripheral Interface)是一种同步串行通信协议,常用于单片机与外围设备之间的通信。SPI采用主从架构,主设备通过四种工作方式来和从设备进行通信。 第一种工作方式是全双工方式。在全双工方式下,主设备和从设备可以同时发送和接收数据。主设备通过MOSI(Master Out Slave In)线发送数据,而从设备通过MISO(Master In Slave Out)线接收数据。 第二种工作方式是半双工方式。在半双工方式下,主设备和从设备分别轮流发送和接收数据。主设备发送数据时,将MOSI线拉低,从设备接收数据;从设备发送数据时,将MISO线拉低,主设备接收数据。 第三种工作方式是主机方式。在主机方式下,主设备控制通信的时序。主设备通过拉低片选线(SS,Slave Select),选择与其通信的从设备,并按照时钟信号(SCK,Serial Clock)的频率来发送和接收数据。 第四种工作方式是多主机方式。在多主机方式下,多个主设备可以同时与从设备通信。每个主设备通过独立的片选线来选择与其通信的从设备,并按照公共的时钟信号来发送和接收数据。 综上所述,SPI的四种工作方式分别是全双工方式、半双工方式、主机方式和多主机方式。不同的工作方式可以根据具体的通信需求选择合适的方式来进行通信。 ### 回答2: SPI(Serial Peripheral Interface)是一种串行外设接口标准,通常用于微控制器与外部设备之间进行通信。SPI具有四种工作方式,在下面的回答中进行详细介绍。 1. 主从模式(Master-Slave Mode):在主从模式下,一个设备(主机)控制通信过程,其他设备(从机)被主机驱动并响应主机的指令。主机将时钟信号(SCK)和控制信号(SS)发送给从机,而从机则将数据通过MISO线发送给主机。 2. 串行模式(Serial Mode):在串行模式下,数据的传输是依次进行的,即每个设备在上一个设备传输完数据后再传输下一个设备的数据。这种模式可以降低硬件成本,但也可能会导致延迟增加。 3. 串行-并行模式(Serial-Parallel Mode):在串行-并行模式下,数据从主机传输给从机时是串行传输的,但从机响应数据传输给主机时是并行传输的。这种模式可以实现高速数据传输,提高通信效率。 4. 链路模式(Daisy Chain Mode):在链路模式下,多个从机连接在同一条线上,数据从一个从机传输到下一个从机,而不需要直接与主机通信。这种模式适用于连接多个从机的系统,提高了系统的扩展性。 总结来说,SPI有四种工作方式:主从模式、串行模式、串行-并行模式和链路模式。每种工作方式都适用于不同的场景和系统构建需求,我们可以根据具体的应用要求选择合适的SPI工作方式。 ### 回答3: SPI是一种串行外设接口(Serial Peripheral Interface),常用于微控制器和外部器件之间进行通信传输数据。SPI有四种常见的工作方式,分别是全双工模式、半双工模式、主模式和从模式。 1. 全双工模式:在全双工模式下,SPI的主设备和从设备可以同时进行数据传输和接收。主设备先向从设备发送一个数据包,并同时从从设备接收另一个数据包。这种模式下数据的传输效率高,但需要更多的引脚资源。 2. 半双工模式:在半双工模式下,SPI的主设备和从设备分别轮流进行数据传输。主设备先发送一个数据包给从设备,然后从设备回复另一个数据包。这种模式下只需要少量的引脚资源,但数据传输效率相对较低。 3. 主模式:在主模式下,SPI总线的控制权由主设备控制。主设备负责产生时钟信号和控制信号,发起数据传输请求,并控制从设备的选择。主模式适用于对多个从设备进行控制和通信的情况。 4. 从模式:在从模式下,SPI总线的控制权由主设备控制。从设备只能响应主设备的数据传输请求,在接收到数据后将其发送给主设备。这种模式适用于需要从设备与主设备进行双向通信的情况。 通过这四种工作模式,SPI可以满足不同的通信需求。全双工和半双工模式可以实现双向传输,主模式和从模式则可以适应不同设备的控制和通信需求。因此,SPI被广泛应用于许多领域,如嵌入式系统、通信设备、传感器等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值