spi + dma
数据的收发是由硬件来完成的,也就是说只要在外部条件满足的情况下,我只需要把数据写入到对应的tx_DR寄存器中就会发送数据或者接受到rx_DR寄存器中,那么这里这里的外部条件是是什么呢?
其实就是spi的sck时钟信号
比如,主机给从机发数据时,数据就会写到对应从机的rx_DR寄存器中,这是硬件完成的,软件的作用就是要把发送的数据读出来,怎么读出来的方法可以看看库函数的实现,那么从机的发送数据也是一样的,只要有sck信号从机就会把tx_DR寄存器中值发出去,不管是stm32的标准库和库函数,如果直接用他们直接提供的函数,那么对于从机而言可能就要一直在循环里发数据,或收数据了,因为函数内部都是循环判断有没有数据和一些标志位,只要不符合就会跳出函数,所以对从机来说这个功能简直是一坨,我的从机想要的是,主机需要数据的时候(比如将主机配置为 receive only master),我就能发出去,主机发来数据时,我就能接收,单纯的用这些函数是不能很好完不成这些功能的。
那么这个时候就需要dma了,dma大家都知道是用于转运数据的,但是为了大家对后面的文字串起来时能更好的理解,我先讲讲dma。dma是一下就传输很多数据吗,还是说一个一个传输的,这个问题大家应该没怎么想过,因为一般情况下,我们只管用dma。在用的时候,大家基本上都会知道一个叫传输计数器的东西,这个东西决定了dma每次转运的总数据的多少。这里说的:dma每次转运可能会造成歧义,我解释一下,每次转运是指dma这次转运数据的整个事件,而实际上,dma转运数据是一个数据一个数据来转运运的,直到转运了合适的数目量的数据。好,我都解释到这里为止,接下来继续说说从机spi配合dma。
dma的触发条件可以为数据寄存器有无数据,比如在从机发数据过程,当从机的tx_DR没有数据时,dma会转运一个数据过去,当这次数据发出去后,dma继续转运下一个数据,但是对于从机spi来说,有sck信号的情况下,spi_tx_DR的数据才会被发出去,这样就刚好和dma配合起来了,当有sck信号时,数据刚被发出去一位,dma马上又把数据转运过去,就形成了一个自动化的过程,只要告诉dma我的源数据地址,目标地址和要发送数据的数目,当有sck信号时,位于tx_DR寄存器的值被发出去,dma又把数据移过来就能构成一次理论理想的通讯,收数据也是一样的,rx_DR有新数据时,dma就会将数据移走,然后重复该过程就形成了通讯。
这里还有一个点没有点明,那就是,我怎么知道数据发没法出去,有没有收到新数据,这个就是与一些标志位有关了,比如 NE RNE XNE之类的,很熟悉吧,这些标志位就能发挥大作用,告诉dma是否该出手,万一你还想问,dma的的转运速率不够快怎么办,设计者们早想到了,dma的速度肯定要比比spi等数据发送接收快的多了,还有疑问?关于后续的搭配使用,可以将dma设为normal,在dma传输完成中断中再次打开也就是再次设置传输计数器,并使能dma,这就是基本用法了。