【问题标题】:Software SPI Implementation软件 SPI 实现
【发布时间】:2015-02-24 06:48:39
【问题描述】:

我正在考虑创建自己的纯 C 软件 SPI 库,因为没有可用的(据我所知)。

这也让我担心 - 为什么没有有任何软件 SPI 库?是否有一些我没有考虑的硬件限制?

编辑:

由于 STM32 中的 SPI 外设存在问题,我决定编写自己的库。 Especially8 bit mode,但我也有一个 16 位模式的 lot of problems。许多其他问题我什至都懒得记录。

我现在已经编写了软件实现(非常简单)并且运行良好。

【问题讨论】:

  • 可能有个软件SPI库。
  • 我想很少有人会需要一个,因为所有 STM32 设备都有丰富的 硬件 SPI 外设选择,每个外设都可重新映射引脚,支持 DMA 和中断并且可以以 HCLK/2 的吞吐量运行。
  • @AndyBrown 添加了我编写自己的软件实现的理由。
  • 考虑到 SPI 是如此常见的外设,你会认为 STM 会正确处理它,它确实存在问题 - 特别是硬件/软件从属选择及其周围的模棱两可的文档

标签: c stm32 spi


【解决方案1】:

为什么没有软件 SPI 库?

因为 WriteByte 和 ReadByte 函数各有大约 10 行代码,其中大部分是位撞击处理器特定的寄存器。更高级别的协议取决于连接到 SPI 的设备。这是what wikipedia has to say 的主题

SPI 总线是事实上的标准。但是,缺乏正式的 标准体现在多种协议选项中。不同的 字长很常见。每个设备都定义了自己的协议, 包括它是否完全支持命令。有些设备是 仅传输;其他人只接收。芯片选择有时是 高电平有效而不是低电平有效。一些协议发送最少 重要位优先。

所以创建一个库真的没有意义。您只需针对每种特定情况和设备组合编写代码即可。

【讨论】:

    【解决方案2】:

    虽然其他人已经回答了its just bitbanging;我认为编写 small 层是有好处的:

    • 如果您不使用 HAL 或标准库(如我自己),您可以编写一个层来处理初始化,该层可以按照芯片的初始化顺序执行操作。
    • 您可以利用回调机制为这一层中的特定外设映射所有中断向量
    • 在应用程序域和系统域之间创建分离,这是模块化设计的核心原则
    • 利用函数指针和通用接口等技术提高代码的可重用性
    • 在设置/参数上添加输入验证,否则如果没有使用层,则会导致代码重复。例如,在初始化时确保 stm32f429 上的 HCLK 不超过 180MHz。

    虽然发送数据确实需要做的只是设置一个寄存器,但更多时候初始化序列并不复杂。

    随着微控制器功率和容量的增加以及项目规模的增加,实现可提高可扩展性和可维护性的平衡设计选择非常重要——尤其是在商业项目中。

    【讨论】:

      【解决方案3】:

      如果您需要微控制器,那么您可以拥有自己的 SPI 库。 为此,您需要使用 bit-banging 技术。 有可用的软件 SPI 库。 由于每个微控制器都有不同的 PORT 架构和寄存器,它们不是通用的,它们仅适用于该控制器。

      例如对于 8051 架构,您可以找到 this

      【讨论】:

        猜你喜欢
        • 2020-02-20
        • 2019-12-19
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多