linux 应用层spi怎么使用dma

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 应用层spi怎么使用dma相关的知识,希望对你有一定的参考价值。

参考技术A DMA不可以自动帮忙发送时钟信号,但是如果让spi发送数据并且使用DMA方式,spi可以帮忙自动发送时钟信号。基于这样的理论,试了一上午,成功了,很高兴。这是在网友的帮助下完成的,现在写下来分享给大家,将温暖传递下去。
硬件:stm32+cc1101无线模块(两者之前通过spi通信)
配置:stm32的spi工作在master模式,当cc1101有数据时,将会给stm32一个外部中断。
实现方法:配置DMA的两个通道,分别用于spi发送和spi接收,配置的时候先把其它参数都配置好不要使能DMA,也就是说先不要写这两句话:
DMA_Cmd(DMA1_Channel4,
ENABLE);
DMA_Cmd(DMA1_Channel5,
ENABLE);
在表示cc1101数据来临的外部中断的中断处理函数中将DMA打开,这个时候,spi就会向cc1101发送数据(也就是stm32的spi接收来自cc1101数据所需要的时钟),发送数据的同时,cc1101数据就会不断的从cc1101的寄存器里面跑到SPI_DR里面。由于已经配置好了接收SPI的DMA,所以数据到来了SPI_DR里面以后,DMA会自动将数据帮你拷贝到缓存数组里去,你只需要在用于接收的DMA中断处理函数里面将缓存数组里的数据拷出来即可。拷完以后最好把DMA关掉,否则spi会不断向外发送数据,可能会让你接回来一些没用的数据。

linux中的SPI和DMA有啥关系?

【中文标题】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的主要内容,如果未能解决你的问题,请参考以下文章

linux中的SPI和DMA有啥关系?

STM32F429开发板用户手册第32章 STM32F429的SPI总线应用之驱动W25QXX(支持查询,中断和DMA)

spidma发送更新中断

笔记之STM32F0芯片SPI_DMA的使用(HAL库)

笔记之STM32F0芯片SPI_DMA的使用(HAL库)

SPI-SPI单线半双工数据收发应用笔记