软件 SPI 实现

Software SPI Implementation

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

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

编辑:

由于 STM32 中的 SPI 外设有很多错误,我决定编写自己的库。 Especially in 8 bit mode, but I've also had a lot of problems 使用 16 位模式。许多其他问题我什至懒得记录。

我现在已经编写了软件实现(这很容易)并且运行良好。

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

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

why aren't there any software SPI libraries?

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

The SPI bus is a de facto standard. However, the lack of a formal standard is reflected in a wide variety of protocol options. Different word sizes are common. Every device defines its own protocol, including whether or not it supports commands at all. Some devices are transmit-only; others are receive-only. Chip selects are sometimes active-high rather than active-low. Some protocols send the least significant bit first.

所以制作图书馆真的没有意义。您只需为每种特定情况和设备组合编写代码。

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

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

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

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