0x00 前言

最近用到了SPI,笔者再网上搜索一番后发现似乎很少有比较完成较高时间可靠性的SPI,于是笔者自己制作了一个时间可靠性较高的SPI通信软件驱动模型,顺便学习了一下SPI的通信方式,再这里聊以记录

阅读本文,您可能需要掌握的知识:

技能熟练度
C语言熟悉

0x10 关于SPI的定义

这里的SPI可以是广义的Serial Peripheral Interface,也可以是由MotorLora定义的SPI通信协议。这里指的是后者,也就是一种四线制双工的通信方式,它遵循摩托罗拉当年的文档。

0x20 通信协议

下面我会用从线制、通信方式下分析当前的通信协议

0x21 线制

现有标准的SPI线制为四线制:时钟线、数据输入、数据输出、选中器件。这个就构建了一个基本的传输通道。而因为串联的方案,现在进阶的四线制、双线制甚至8线制也都是主要扩展数据输入输出线,将串口改成并联的串口。

0x22 通信方式

通信的主要依靠两个参数控制:时钟极性、时钟相位,这里的所有叙述的波形都是以时钟线为中心定义的。

时钟极性(CPOL)

这里的极性主要是规定当前的波形默认值。0时为默认低电平,1时默认为高电平,用处有两点:

  1. 当前的设备判断模式
  2. 当前设备识别极性

时钟相位(CPHA)

时钟相位控制当前时钟对于数据的捕获时机,0时为第一个跳变沿捕获数据,1时第二个跳变沿捕获数据。

对此可以将方波时钟视为一个波形,相位参数为0时,选择是初始时0~90为捕获时机;1时选择相位90~0时为捕获时机。

由这两个参数控制下,现在的通信主要分为以下四种。

模式极性相位捕获形式
000默认低电平-默认第一个跳变沿捕获数据
101默认低电平-默认第二个跳变沿捕获数据
210默认高电平-默认第一个跳变沿捕获数据
311默认高电平-默认第二个跳变沿捕获数据

这样就可以看到,这两个参数只需要合理的配置,就可以实现任意波形跳变下的数据捕获。

其实很多时候,模式并不能依靠主机进行选择,而是从机进行选择的。因此一般从机会选择使用时钟线的默认参数CPOL进行选择,高电平为1、低电平为0,随后一般内部规定当前的选择时上升沿还是下降沿,如果是上升沿截取数据,则一般为0或3模式。而下降沿截取数据,则一般是1、2模式。这样就可以使当前从机主机无需关注当前的时钟初始时间。其实也正是如此,基本上决定性参数为CPHA。也就是捕获的边沿。

当前的参数由主机兼容从机。从上述的介绍可以看出,其实如果由两个完全相反的模式下的从机其实可以同时驱动,主机只需要在保证当前设备的捕获时钟相位不一致,就可以在时钟捕获跳变前·进行数据切换保证现在的数据通信兼容

但是这种特殊操作需要严格建立在当前从机使用边沿触发数据捕获而不是使用电平触发,毕竟在从机视角下,边沿触发和电平触发也可以兼容

0x30 SPI建模

到这里,笔者可以确认,除了基本的一些时钟之类的参数,当前SPI器件还需要一个对于当前引脚的映射,并且需要对SPI的两个参数需要做映射。

这里就可以得到当前的SPI器件的模型参数:

typedef union
{
    struct
    {
	unsigned int CPOL:1;		//时钟极性
    	unsigned int CPHA:1;		//时钟相位
    	unsigned int ENABLE:1;		//设备开关
        unsigned int BUSY:1;		//总线状态(关闭时也是忙碌)

    	unsigned int CLOCK_DIV:28; 	//输出时钟,这里按照当前的基本工作时钟进行时钟分频选择现在的工作时钟
    }bits;
	unsigned int d32;//快速设置
}U_SPI_DEVICE;

typedef struct
{
    unsigned int SCK:1;
    unsigned int MOSI:1;	//这里可以使用位域进行QSPI这类的扩展
    unsigned int MISO:1;
    unsigned int CS:1;
    unsigned int NU:4;		//填充
}S_SPI_SOFT_PIN;

这里需要注意的是位域的开销带来的可能的不稳定,可以将当前的引脚映射单独做出来,其他不长修改的参数放在一起,这样可以保证当前的使用因为打断的影响放到最小,也可以把其放在一起,影响其实也不很大,本质上其实是编写方式与执行安全性和效率的抉择。

0x40 后记&预告

笔者的逻辑分析仪正在路上,做好的协议波形还没办法直接导出。待下一篇文章,我会整理代码与相关的示例波形。与进行部分简单测试的代码


标题:关于软件模拟的精度较高的SPI通信模型——前言
作者:GreenDream
地址:HTTPS://greendreamer.work/articles/2021/10/31/1635666111884.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!