打印

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

[复制链接]
1514|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Katze|  楼主 | 2016-6-6 22:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人小白一个,并不是DSP的大神。正在学习和使用DSP5509,希望哪位资料较多的人分享一下DSP5509读写SD卡文件系统的例程和那个C5509用DMA乒乓缓冲方式从MCBSP接收和发送数据的例程。因为只是使用者一枚,并不是开发者。所以,自己进行编程来说太难,例程修改就可以满足需求,所以想资料较多的大神分享一下,谢谢~~~已经找了很久没有找到资料。

相关帖子

来自 2楼
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的这个数据是什么格式的?

使用特权

评论回复
评论
yaoxw6 2018-7-25 11:07 回复TA
16位的有符号数 
地板
Katze|  楼主 | 2016-6-6 22:17 | 只看该作者
上一个问题,可能比较小白,还请各位大神见谅。

使用特权

评论回复
5
zhangmangui| | 2016-6-6 22:17 | 只看该作者
6
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卡文件例程,但是自己的没有。

使用特权

评论回复
7
suzhanhua| | 2016-6-7 22:11 | 只看该作者
你可以spi读取sd卡吧

使用特权

评论回复
8
suzhanhua| | 2016-6-7 22:13 | 只看该作者
这个可以参考一下stm32上有个移植的读取方法。

使用特权

评论回复
9
Katze|  楼主 | 2016-6-12 08:09 | 只看该作者
suzhanhua 发表于 2016-6-7 22:11
你可以spi读取sd卡吧

不可以SPI模式读取SD卡。

使用特权

评论回复
10
Katze|  楼主 | 2016-6-12 08:14 | 只看该作者
suzhanhua 发表于 2016-6-7 22:13
这个可以参考一下stm32上有个移植的读取方法。

额。。。具体是什么样的呢?

使用特权

评论回复
11
Katze|  楼主 | 2016-6-13 10:18 | 只看该作者
没有大神来回答一下么?????

使用特权

评论回复
12
Thorald| | 2016-6-13 21:11 | 只看该作者
https://bbs.21ic.com/icview-689482-1-1.html

这一贴给力啊

使用特权

评论回复
13
Katze|  楼主 | 2016-6-15 20:21 | 只看该作者
???????

使用特权

评论回复
14
Katze|  楼主 | 2016-6-15 20:24 | 只看该作者
大神在哪里????

使用特权

评论回复
15
firstblood| | 2016-6-19 11:49 | 只看该作者
这个例程的网上不太好找的,楼上分享的还是蛮好的。

使用特权

评论回复
16
Sode| | 2016-6-19 13:05 | 只看该作者
这个案例确实不太好找,版主分享的资料还是很有帮助的

使用特权

评论回复
17
Katze|  楼主 | 2016-6-22 09:33 | 只看该作者
309030106 发表于 2016-6-15 21:43
一.乒乓缓冲原理
       一般情况下,串口数据 DMA 传输到 BUF1(内存上的一片连续的缓冲区)的过程中,是 ...

谢谢谢谢~~~~非常有帮助。

使用特权

评论回复
18
Katze|  楼主 | 2016-6-22 20:31 | 只看该作者
关于SD卡文件的例程木有好心人有的吗???

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

39

帖子

1

粉丝