DAM学习笔记

DMA简介

  • 参考这篇正点原子的blog

大致用法就是把一堆数据搬移到主存中或者从主存中搬移一堆数据出来,因此需要一个中间的媒介,可以是FIFO,也可以是BRAM。外部数据写入中间媒介,然后DMA从中间媒介把数据写入主存,或是DMA把主存数据写入中间媒介,然后再输出到外部。

接收数据流

大致流程是蓝牙把收到的数据发给pl端,然后pl端有一个差错重传的机制会进行校验,如果正确会把比特流转换成8比特数依次写入FIFO中,同时告诉蓝牙发下一包;如果校验错误就会跟蓝牙通信重传这一包。写入到FIFO中的数是解构之后的数,去掉了校验位。DMA从FIFO中取数,写入主存地址,给ps中断,ps从相应地址取数,然后进行后续处理。

1

PL处理完蓝牙数据以后会往地址中写入这一包的长度,然后给一个中断通知PS,PS拿到这个长度len.同时DMA从蓝牙获取数据,DMA取完以后会给PS一个中断,PS收到中断以后给出一个DAM接收完成的信号量。DMA接收任务会等待长度len和DMA接收完成的信号量,然后从DMA地址取len长度的数据出来,完成整个数据的接收。详细过程为先收到数据长度,然后从接收缓冲区把数据写给DMA设备,等待DMA接收完成信号量,擦除缓冲区,从缓冲区copy数据包,将数据包写入发送队列。

MAC层下行链路阻塞,等待发送队列有数据包写入,然后获取到数据包开始进行PS端的处理。

发送数据流

物理层生成需要传输给蓝牙的数,然后把数据的首地址和数据长度写入一个数据包中,把数据包发送给DMA结构体的发送队列,DMA结构体的发送任务函数根据数据的地址和数据的长度把数据写入发送缓冲区,然后通知DMA将数据写入FIFO中,PL端的蓝牙传输层从FIFO中取出数据与蓝牙通信。

数据再被发送到DMA结构体的发送队列之前,PS会通过读一个寄存器的值来检查蓝牙传输层是否已经准备好接收数据,在准备好之前会一直循环访问该寄存器,知道蓝牙传输层准备好。