求5509开发板的SD卡文件系统和DMA乒乓缓冲例程

[复制链接]
 楼主| Katze 发表于 2016-6-6 22:07 | 显示全部楼层 |阅读模式
本人小白一个,并不是DSP的大神。正在学习和使用DSP5509,希望哪位资料较多的人分享一下DSP5509读写SD卡文件系统的例程和那个C5509用DMA乒乓缓冲方式从MCBSP接收和发送数据的例程。因为只是使用者一枚,并不是开发者。所以,自己进行编程来说太难,例程修改就可以满足需求,所以想资料较多的大神分享一下,谢谢~~~已经找了很久没有找到资料。
309030106 发表于 2016-6-15 21:43 | 显示全部楼层

一.乒乓缓冲原理
       一般情况下,串口数据 DMA 传输到 BUF1(内存上的一片连续的缓冲区)的过程中,是不
建议对 BUF1 进行操作的。但由于串口数据是一个连续传输的过程,比如接收 GPS 数据,不
能等待 BUF1 满了才处理数据,你 CPU 在处理数据的同时,串口源源不断接收数据,此时会
造成串口数据丢失,而乒乓缓冲就完美地解决了这个问题。
       具体过程是:当串口 BUF1 满了时,DMA 的目标地址迅速切换到 BUF2,此时可以处理
BUF1 的数据;当串口 BUF2 满了时,DMA 的目标地址迅速切换到 BUF1,此时可以处理 BUF2
的数据。如此一直循环下去,就像打乒乓球一样,你推我挡,故称作乒乓缓冲。
二 . DMA就不在这里班门弄斧的讲解了,分享一下程序吧。
DMA配置代码:
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设作源头
DMA_InitStructure.DMA_BufferSize = dma_len;                               //BUF 大小
DMA_InitStructure.DMA_PeripheralInc  =  DMA_PeripheralInc_Disable;  //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    //内存地址寄存器递增
这两项的配置还是很好理解的,比如在这里我们是要将内存里边的东西发到 USART1 中去,每次发送 8 位,
那么外设地址当然不能改变,而每一次发送内容都是不一样的,而且数组在内存中的存放就是递增的,所以内存地址寄存器要递增。
下边是设置数据宽度:
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为 8 位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //正常缓存模式(非连续传输)
一些基本定义:
#define dma_len 100    //定义串口 DMA 传输数据长度(如果串口一次接收数据没有达到 dma_len 个 byte,则不会发生 DMA 中断)  
extern u8 USART1_DMA_Buf1[dma_len]; //BUF1
extern u8 USART1_DMA_Buf2[dma_len];     //BUF2
typedef enum {BUF_NO1=0,BUF_NO2=1}BUF_NO;
extern BUF_NO Free_Buf_Now;
extern bool Buf_Ok;

乒乓思想在这里体现:
void DMA1_Channel5_IRQHandler(void)
{
       if(DMA_GetITStatus(DMA1_IT_TC5))
       {
               //DataCounter = DMA_GetCurrDataCounter(DMA1_Channel5);
//获取剩余长度,一般都为 0,调试用
               DMA_ClearITPendingBit(DMA1_IT_GL5);     //清除全部中断标志                  
                                                     
              //转换可操作 BUF
              if(Free_Buf_Now==BUF_NO1) //如果 BUF1 空闲,将 DMA 接收数据赋值给 BUF1
              {      
                     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_DMA_Buf1;
                     DMA_Init(DMA1_Channel5, &DMA_InitStructure);
                     Free_Buf_Now=BUF_NO2;
              }
              else    //如果 BUF2 空闲,将 DMA 接收数据赋值给 BUF2
              {
                     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_DMA_Buf2;
                     DMA_Init(DMA1_Channel5, &DMA_InitStructure);
                     Free_Buf_Now=BUF_NO1;
              }
              Buf_Ok=TRUE;  
       }
}

当发现有一个缓冲接收满的时候,可以上传数据。将另外一个缓冲作为接收数据的目的地,周而复始。
 楼主| Katze 发表于 2016-6-6 22:15 | 显示全部楼层
如果有大神,还希望大神可以解答一个小小问题。就是人声同过MIC口录音录入,经AIC23音频解码芯片进行AD转换成16位,并发送给5509,那这个时候已经进入5509的这个数据格式是什么?或者说AIC23传送给5509的这个数据是什么格式的?

评论

16位的有符号数  发表于 2018-7-25 11:07
 楼主| Katze 发表于 2016-6-6 22:17 | 显示全部楼层
上一个问题,可能比较小白,还请各位大神见谅。
zhangmangui 发表于 2016-6-6 22:17 | 显示全部楼层
 楼主| Katze 发表于 2016-6-7 08:56 | 显示全部楼层
zhangmangui 发表于 2016-6-6 22:17
https://bbs.21ic.com/icview-689482-1-1.html

版主,这里的程序,我几乎都下载看了一遍,里面的SD程序是读写SD卡,不是读写SD卡文件,我也是在网上搜索的时候看到别人买的5509板子有的有读写SD卡文件例程,但是自己的没有。
suzhanhua 发表于 2016-6-7 22:11 | 显示全部楼层
你可以spi读取sd卡吧
suzhanhua 发表于 2016-6-7 22:13 | 显示全部楼层
这个可以参考一下stm32上有个移植的读取方法。
 楼主| Katze 发表于 2016-6-12 08:09 | 显示全部楼层
suzhanhua 发表于 2016-6-7 22:11
你可以spi读取sd卡吧

不可以SPI模式读取SD卡。
 楼主| Katze 发表于 2016-6-12 08:14 | 显示全部楼层
suzhanhua 发表于 2016-6-7 22:13
这个可以参考一下stm32上有个移植的读取方法。

额。。。具体是什么样的呢?
 楼主| Katze 发表于 2016-6-13 10:18 | 显示全部楼层
没有大神来回答一下么?????
Thorald 发表于 2016-6-13 21:11 | 显示全部楼层
https://bbs.21ic.com/icview-689482-1-1.html

这一贴给力啊
 楼主| Katze 发表于 2016-6-15 20:21 | 显示全部楼层
???????
 楼主| Katze 发表于 2016-6-15 20:24 | 显示全部楼层
大神在哪里????
firstblood 发表于 2016-6-19 11:49 | 显示全部楼层
这个例程的网上不太好找的,楼上分享的还是蛮好的。
Sode 发表于 2016-6-19 13:05 | 显示全部楼层
这个案例确实不太好找,版主分享的资料还是很有帮助的
 楼主| Katze 发表于 2016-6-22 09:33 | 显示全部楼层
309030106 发表于 2016-6-15 21:43
一.乒乓缓冲原理
       一般情况下,串口数据 DMA 传输到 BUF1(内存上的一片连续的缓冲区)的过程中,是 ...

谢谢谢谢~~~~非常有帮助。
 楼主| Katze 发表于 2016-6-22 20:31 | 显示全部楼层
关于SD卡文件的例程木有好心人有的吗???
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

39

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部