SPI1&SPI2_DMA通信实验(STM32)

SPI1&SPI2_DMA通信实验(STM32)

ID:41153071

大小:575.64 KB

页数:4页

时间:2019-08-17

SPI1&SPI2_DMA通信实验(STM32)_第1页
SPI1&SPI2_DMA通信实验(STM32)_第2页
SPI1&SPI2_DMA通信实验(STM32)_第3页
SPI1&SPI2_DMA通信实验(STM32)_第4页
资源描述:

《SPI1&SPI2_DMA通信实验(STM32)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、STM32学习笔记(二)——之SPI_DMA寄存器级操作一、实验目标学会配置STM32的SPI寄存器和DMA寄存器,实现STM32的SPI1与SPI2通信功能,每次发送一字节数据,并可多次发送,如果接收的数据正确,则点亮LED灯。二、实验目的加入DMA的SPI通信相对于普通SPI通信有什么好处?ST给SPI加了DMA功能出于什么目的?我觉得这是很重要的一个问题,一直边学习边想。以下是我的看法:减少CPU负荷?我想这应该是DMA最主要的功能,可是对于SPI通信来说,其实大部分时候我们需要根据发送的指令->目标器件的应答来决定下一个指令,所以此时CPU还是需要一直等待每次通信的结

2、束。而且像SD卡的操作,是一个顺序流的指令操作过程,用中断也不容易控制。那到底加入了DMA有什么好处?仔细查看了STM32F10xxx的用户手册,发现这么一行字“连续和非连续传输:当在主模式下发送数据时,如果软件足够快,能够在检测到每次TXE的上升沿(或TXE中断),并立即在正在进行的传输结束之前写入SPI_DR寄存器,则能够实现连续的通信;此时,在每个数据项的传输之间的SPI时钟保持连续,同时BSY位不会被清除。如果软件不够快,则会导致不连续的通信;这时,在每个数据传输之间会被清除”以及也就是说如果连续传输而不使用DMA的话,需要CPU不停检测TXE并很快地置入SPI->D

3、R的值,对于复杂程序的话这是很难达到的,而如果使用DMA,就可以轻易实现连续传输,CPU只需等待其完成就好。我想到的一个应用就是在写SD卡的时候,每次写一个块512字节,就可以用到,能提高SD卡的写入数据速率。其次还可以降低功耗,记得数字集成电路老师说过一句话“软件上降低数字电路功耗的一个方法就是减少电平转换。”那么连续通信的时候,像SPI的BSY电平转换会大大减少!最后一点,虽然效果不大,就是如果不是用DMA,那么CPU的工作就是搬运工,把SPI->DR的内容搬到内存存储起来,而如果使用DMA,就省略了这个环节!我想,为什么实现同一个功能,有的执行起来很流畅,有的却很卡,应

4、该和这些小细节的减载有关吧。这次先把SPI基本通信写出来,然后再写SPI的连续通信,并看能不能用到SD卡读写上。林阿呆

5、STM32学习笔记(二)1三、SPI&DMA分析1、这里先说明一下SPI的全双工通信(高手略过哈)SPI全双工通信的特点:一边发送一边接收,硬件上只有一个SPI->DR寄存器和两个缓冲器(发送缓冲器和接收缓冲器),主模式(从模式类似):SPI->DR会先读发送缓冲器,并通过MOSI管脚(MasteroutputSlaveInput)一位一位地发送出去,在发送的过程中,SPI->DR的数据会左移(如果是高位先发送),并且会从MISO(MasterinputSl

6、aveoutput)读入数据填补SPI->DR左移后的空缺。传完8比特后,SPI->DR再把数据并行写入接收缓冲寄存器。所以,SPI1与SPI2的通信过程如下:SPI1主机SPI2从机SPI1_TX_BuffSPI2_TX_Buff①②MOSISPI->DRSPI->DRMISO③④SPI1_RX_BuffSPI2_RX_Buff配置SPI寄存器的时候,需要注意以下几点:(1)nss的配置:如果是单主单从,使用nss软件管理,除了用MSTR配置主从设备,还要设置SSM和SSI,只有在SSM位为1时,SSI位才有意义。(2)主从设备的数据帧格式,时钟沿读写模式要一致;(3)SP

7、I的寄存器也需要开启DMA使能;(4)SPI虽然可以发送16bit数据,可是只支持8bitDMA!2、再说一下DMADMA——DirectMemoryAccess,直接内存存取,作用是独立于CPU,直接建立内存与外设的通信通道。SPI的DMA操作,就是在SPI->TXE为1时,会向对应的DMA通道发出请求,DMA通道会发出应答信号,SPI收到应答信号后撤销请求信号,DMA撤销应答信号,并把内存值置入发送缓冲,SPI传送开始。接收过程与上面类似。DMA配置的部分说明:(1)需要使能RCC寄存器的SPI和DMA时钟,至于辅助时钟,查过网上的讨论,有人说一些外设如果没有开启辅助时钟

8、会不能用,但SPI不需要;(2)DMA的存储器地址(memorybaseaddr):即变量地址。我们在程序中定义的每个变林阿呆

9、——之SPI_DMA寄存器级操作2量,都有对应的内存地址,你想把SPI的接收发送数据存在哪个变量,就将对应变量的地址赋给DMA存储器地址寄存器。如u8SPI1_TX_Buff的地址是(u32)&SPI1_TX_Buff;u8SPI1_TX_Buff[512]的地址是(u32)SPI1_TX_Buff。(3)DMA循环模式:有些资料会译为DMA的循环缓存模式,我觉得不太准确,这里

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。