c语言sscanf函数的用法是什么
575
2022-10-30
嵌入式硬件通信接口协议-SPI(二)分层架构设计模拟接口
真正意义的分层,是从代码的编码规范、程序的执行逻辑来体现的。
SPI在分层架构中的设计思路
刚刚提到分层设计的思路,那么SPI作为一个通信接口,如果按照分层设计的思路,如何把接口设计得更合理,更方便?
此处需要设计的SPI是介于“应用”和“驱动”之间的,“应用”就是项目业务需求的功能模块将数据、数据包等传给SPI接口,而“驱动”是SPI接口拿到数据包后,把数据转变为SPI的时序发送出去。
想象一下我们的项目工程,如果需要操作芯片硬件接口的时候,直接调用官方提供的接口函数,虽然能实现功能,但是在需要更换芯片平台的时候,就需要在繁杂的、与业务需求相关的应用层里找和去修改为目标驱动接口。
这里就牵扯到了分层设计的优势所在:由于平台的更换,驱动接口已经变了样,那么对代码的移植就会变得非常费力,不仅是脑力活,更是体力活(即使可以批量替换,你也需要仔细核对接口,更要解决接口的差异性)。
而此时如果是分层设计的,在应用和驱动中间有个BSP层,应用层调用的只是BSP层,完全不涉及驱动、寄存器,不涉及与芯片平台相关的接口,那么即使平台怎么更换、驱动怎么改变,你只需要改变BSP层的具体实现,相对就轻松很多了。
SPI接口本身就是可以实现1对N的串行总线,为什么在使用过程中有时要分别使用不同的SPI端口来接不同的外围器件呢?
主要原因是SPI的可配置项的不一致,有些外围器件对SPI时钟信号SCLK的极性要求为高、低不一样,时钟相位不一样,并且通信数据bit位大小端选择的不一样,这些接口配置项的差异,导致了有些场景下操作不同器件时需要使用不同的SPI端口。
从零开始设计自有的一套SPI板级支持包(BSP)接口,那就从初始化开始。这里设计的是模拟SPI,所以会调用GPIO设置的接口。
初始化函数接口里暂时做了SPI端口号、数据宽度、接口时钟模式、数据位优先模式这四个参数,基本上这四个参数已经可以完成对大部分应用需求。在编码初期先不急于填入过多的配置项,首先按照最简单的默认方式编码,保证程序逻辑可以跑通。
其中用到的管脚定义,是在完成原理图或者完成原型机验证时,基本就确定了管脚的使用,因此管脚的定义一般的都是放在BSP层的头文件中。这样更便于移植和开发。
数据发送时,先写发送一个字节的数据,数据是“踩”着SPI接口时钟信号SCLK的“节拍”逐个bit位发送出去,因此在发送数据的时候也是需要主机操作时钟信号SCLK和数据信号MOSI:
而发送多数据的接口就可以采用dcbsp_spi_sendbyte函数来逐字节发送完成。
另外接收数据的接口,同样参考着字节发送接口的思路,数据的接收过程也是“踩”着SPI接口时钟信号SCLK的“节拍”逐个bit位传输,这个过程主机继续提供SCLK,然后读取MISO信号的电平,再将读到的电平逐bit缓存在一个变量里:
就这样,利用GPIO进行电平的输出的读取,实现了SPI接口的部分时序。这些接口的内部实现过程,因人而异、因平台变化而微调,但是对外接口不动,对上层应用来说,这就是同一个接口同一个东西,上层的应用层程序改动就很小了。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~