查看: 3551|回复: 1

[原创] 【LPC54114双核任务四】音频库之文件系统播放sine wave

[复制链接]
  • TA的每日心情
    奋斗
    2018-7-12 20:45
  • 签到天数: 75 天

    连续签到: 1 天

    [LV.6]常住居民II

    7

    主题

    213

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    441
    最后登录
    2018-10-25
    发表于 2017-7-18 23:44:46 | 显示全部楼层 |阅读模式
    本帖最后由 NXP+LPC+FSL 于 2017-7-18 23:57 编辑

    由于音频库的播放的音频文件来自sd卡,那么就需要用到了文件系统,本帖就赖你说下文件系统的使用测试吧


    主要内容:


    读写sd卡,,并播放sd卡中的pcm数据。。。


    配置spi2 为sd卡接口,注册加载文件系统,打开创建一个文档“readme.txt”,写入sine wave 的pcm数据,然后关闭文件系统。然后在去打开读取文件“readme.txt”,把读出来的数据打印出来,并经过iis 送给 wm8904播放。


    测试效果,打印信息


    1.png


    写入sd卡中的sine 数据

    2.png


    文件系统fatfs 的相关api

    1.f_mount
    1. if (f_mount(&g_fileSystem, driverNumberBuffer, 1))
    2.         {
    3.                         PRINTF("Mount volume failed.\r\n");
    4.         }
    5.         else
    6.         {
    7.         PRINTF("Mount volume success.\r\n");
    8.         }
    复制代码
    注册文件系统,成功返回Mount volume success.
                           失败返回Mount volume failed.


    其中:
    f_mount

    在FatFs模块上注册/注销一个工作区(文件系统对象)

    FRESULT f_mount ( BYTE Drive, FATFS* FileSystemObject );

    参数

    Drive

    注册/注销工作区的逻辑驱动器号(0-9)。

    FileSystemObject

    工作区(文件系统对象)指针。返回值

    FR_OK (0)

    函数成功。

    FR_INVALID_DRIVE

    驱动器号无效描述

    f_mount函数在FatFs模块上注册/注销一个工作区。在使用任何其他文件函数之前,必须使用该函数为每个卷注册一个工作区。要注销一个工作区,只要指定FileSystemObject为NULL即可,然后该工作区可以被丢弃。

    该函数只初始化给定的工作区,以及将该工作区的地址注册到内部表中,不访问磁盘I/O层。卷装入过程是在f_mount函数后或存储介质改变后的第一次文件访问时完成的。






    2. f_open


    1. if(f_open(&fd, "4:/readme.txt", FA_CREATE_ALWAYS|FA_WRITE) != FR_OK)
    2.         {
    3.                 PRINTF("f_open failed.\r\n");
    4.                 PRINTF("FatFs file open for write fail!\r\n\r\n");
    5.                 led_off(6);
    6.         }
    7.         else
    8.         {
    9.                 led_on(6);
    10.                 PRINTF("FatFs file open for write successs!\r\n\r\n");
    11.         }
    复制代码
    打开并创建文件系统,成功返回 FatFs file open for write successs! ,led点亮
                                   失败返回 FatFs file open for write fail!,led熄灭


    其中:
    f_open

    创建/打开一个用于访问文件的文件对象

    FRESULT f_open ( FIL* FileObject, 是不是把一个文件的的信息读取过来存放呢? const XCHAR*FileName, BYTE ModeFlags );

    参数

    FileObject

    将被创建的文件对象结构的指针。

    FileName

    NULL结尾的字符串指针,该字符串指定了将被创建或打开的文件名。

    ModeFlags

    指定文件的访问类型和打开方法。它是由下列标志的一个组合指定的。
    模式描述
    FA_READ指定读访问对象。可以从文件中读取数据。
    与FA_WRITE结合可以进行读写访问。
    FA_WRITE指定写访问对象。可以向文件中写入数据。
    与FA_READ结合可以进行读写访问。
    FA_OPEN_EXISTING打开文件。如果文件不存在,则打开失败。(默认)
    FA_OPEN_ALWAYS如果文件存在,则打开;否则,创建一个新文件。
    FA_CREATE_NEW创建一个新文件。如果文件已存在,则创建失败。
    FA_CREATE_ALWAYS创建一个新文件。如果文件已存在,则它将被截断并覆盖。


    3.f_write
    1.         if(f_write(&fd, \
    2.                                 sd_fatfs, \
    3.                                 sizeof(sd_fatfs), \
    4.                                 (UINT*)&write_byte) != FR_OK)
    5.         {
    6.                 PRINTF("FatFs file write to text fail!\r\n\r\n");
    7.         }
    8.         else
    9.         {
    10.                 PRINTF("FatFs file write to text success!\r\n\r\n");
    11.         }
    复制代码

    吧数组sd_fatfs【】内容写入 sd卡中,成功返回FatFs file write to text success!


    4. 操作完成后关闭文件系统 f_close(&fd)

    关闭一个打开的文件

    FRESULT f_close ( FIL* FileObject );

    参数

    FileObject

    指向将被关闭的已打开的文件对象结构的指针。返回值

    FR_OK (0) 文件对象已被成功关闭。 >FR_DISK_ERR 由于底层磁盘I/O函数中的错误,而导致该函数失败。 FR_INT_ERR

    由于一个错误的FAT结构或一个内部错误,而导致该函数失败。

    FR_NOT_READY

    由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。

    FR_INVALID_OBJECT

    文件对象无效。
    5.打开读取文件
    1. if(f_open(        &fd, \
    2.                                  "4:/readme.txt", \
    3.                                 FA_READ) != FR_OK)
    复制代码


    6. 读取文件,并把读出来的数据通过串口打印出来
    1. if(f_read(        &fd, \
    2.                                 read_text, \
    3.                                 sizeof(sd_fatfs), \
    4.                                 (UINT*)&read_byte) != FR_OK)
    5.         {
    6.                 /* ¶Áȡʧ°Ü */
    7.                 printf("FatFs file read from text fail!\r\n\r\n");
    8.         }
    9.         else
    10.         {
    11.                 printf("FatFs file read from text success!\r\n\r\n");
    12. //                printf("%s\r\n\r\n", read_text);
    13.                
    14.                 for(uint16_t i=0 ;i<sizeof(sd_fatfs); i++)
    15.                 {
    16.                
    17.                         printf("%s", ((i & 0x0f) ==0 ) ? "\r\n" : "\t");
    18.                         printf("%#02xU, ", read_text[i]);
    19.                 }
    20.         }
    复制代码

    写入数据到一个文件

    FRESULT f_write ( FIL* FileObject, const void* Buffer, UINT ByteToWrite, UINT* ByteWritten );

    参数

    FileObject

    指向将被写入的已打开的文件对象结构的指针。

    Buffer

    指向存储写入数据的缓冲区的指针。

    ByteToRead

    要写入的字节数,UINT范围内。

    ByteRead

    指向返回已写入字节数的UINT变量的指针。在调用该函数后,无论结果如何,数值都是有效的。返回值

    FR_OK (0)

    函数成功。

    FR_DENIED

    由于文件是以非写模式打开的,而导致该函数被拒绝。

    FR_DISK_ERR

    由于底层磁盘I/O函数中的错误,而导致该函数失败。

    FR_INT_ERR

    由于一个错误的FAT结构或一个内部错误,而导致该函数失败。

    FR_NOT_READY

    由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。

    FR_INVALID_OBJECT 文件对象无效。


    7. 然后关闭文件系统,吧读出来的数据read_text[]通过 函数StartSoundPlayback_fatfs(read_text,sizeof(sd_fatfs));播放

    测试完成。

    再来看下sd卡里面的东西吧。

    555.png

    6.png


    这里显示的是乱码,不要紧,因为写入sd卡的数据是以二进制写入的,文本文件不识别,所以乱码了,不过没关系,用二进制文件打开就可以看到了


    777.png


    到此测试完成,有了这个基础,后面就可以读取音频文件,用过音频库解码后送给wm8904播放了



    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2018-2-7 18:18
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    13

    主题

    126

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1628
    最后登录
    2021-7-13
    发表于 2017-8-15 15:57:20 | 显示全部楼层
    支持支持!
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-25 20:45 , Processed in 0.092399 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表