linux中的SPI和DMA有啥关系?

Posted

技术标签:

【中文标题】linux中的SPI和DMA有啥关系?【英文标题】:What is the relationship between SPI and DMA in linux?linux中的SPI和DMA有什么关系? 【发布时间】:2021-10-27 01:38:18 【问题描述】:

在我看来,SPI 和 DMA 都是控制器。

SPI是一种通信工具,DMA可以在没有CPU的情况下传输数据。

spi_sync()spi_async()等系统API由CPU控制。

那么SPI with DMA是什么意思,是不是说DMA可以在没有CPU的情况下控制SPI API呢?还是SPI控制使用CPU,但数据直接传输到DMA?

【问题讨论】:

【参考方案1】:

SPI 不是工具,它是一种通信协议。典型的微控制器在硬件中实现了该协议,可以通过读/写给定控制器地址空间中的专用寄存器来访问。

微控制器上的 DMA 通常用于将寄存器的内容移动到内存中,反之亦然。 DMA 有时可以配置为写入特殊数量的读/写或增加或减少内存的源地址和目标地址等。

如果你有一个支持 DMA 的 SPI 的微控制器,这通常意味着你可以在内存中有一些数据,这些数据将被传输到 SPI 单元以发送多个数据字节,而无需 CPU 内核本身的干预。或者自动从 SPI 读取一定数量的数据字节到内存,而不浪费 cpu 内核。

如何配置此类 DMA SPI 传输已写入控制器的数据表中。类型的范围非常广泛,因此在不知道微类型的情况下无法在此处给出具体信息。

处理 SPI 的 linux API 是通过使用驱动程序中的微控制器特定实现来抽象 DMA 和 SPI 的访问。

目前还不清楚您是想使用 API 来访问您的 SPI,还是想实现设备驱动程序以使 linux API 在您的特定控制器上工作。

这里不可能给你一个一般性的介绍来写一个内核驱动程序或者从你的数据表中逐个寄存器澄清。如果您需要更多信息,您必须使您的问题更加具体!

【讨论】:

您好克劳斯,非常感谢。我正在用 spi 编写设备驱动程序。我问这个问题是因为当我使用内核 spi API spi_sync 时,我发现它的时间成本非常不稳定,从 100us 到 2000us。在我的项目中,我应该在两个中断之间完成一个spi传输,你可以说我之前问的问题(***.com/questions/68743287/…),有人建议使用DMA,但我使用的主机官方说SPI相关API开放DMA,但是API没有关于DMA的相关配置,所以我问这个问题。

以上是关于linux中的SPI和DMA有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

spidma发送更新中断

Linux SPI总线和设备驱动架构之三:SPI控制器驱动

Linux SPI总线 - SPI控制器驱动层

linux设备驱动 spi详解3-控制器驱动

linux设备驱动 spi详解3-控制器驱动

stm32f412 SPI dma接收和UART dma发送问题解决