本帖最后由 NXP+LPC+FSL 于 2017-7-18 23:57 编辑
由于音频库的播放的音频文件来自sd卡,那么就需要用到了文件系统,本帖就赖你说下文件系统的使用测试吧
主要内容:
读写sd卡,,并播放sd卡中的pcm数据。。。
配置spi2 为sd卡接口,注册加载文件系统,打开创建一个文档“readme.txt”,写入sine wave 的pcm数据,然后关闭文件系统。然后在去打开读取文件“readme.txt”,把读出来的数据打印出来,并经过iis 送给 wm8904播放。
测试效果,打印信息
写入sd卡中的sine 数据
文件系统fatfs 的相关api
1.f_mount
- if (f_mount(&g_fileSystem, driverNumberBuffer, 1))
- {
- PRINTF("Mount volume failed.\r\n");
- }
- else
- {
- PRINTF("Mount volume success.\r\n");
- }
复制代码 注册文件系统,成功返回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
- if(f_open(&fd, "4:/readme.txt", FA_CREATE_ALWAYS|FA_WRITE) != FR_OK)
- {
- PRINTF("f_open failed.\r\n");
- PRINTF("FatFs file open for write fail!\r\n\r\n");
- led_off(6);
- }
- else
- {
- led_on(6);
- PRINTF("FatFs file open for write successs!\r\n\r\n");
- }
复制代码 打开并创建文件系统,成功返回 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- if(f_write(&fd, \
- sd_fatfs, \
- sizeof(sd_fatfs), \
- (UINT*)&write_byte) != FR_OK)
- {
- PRINTF("FatFs file write to text fail!\r\n\r\n");
- }
- else
- {
- PRINTF("FatFs file write to text success!\r\n\r\n");
- }
复制代码
吧数组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.打开读取文件
- if(f_open( &fd, \
- "4:/readme.txt", \
- FA_READ) != FR_OK)
复制代码
6. 读取文件,并把读出来的数据通过串口打印出来
- if(f_read( &fd, \
- read_text, \
- sizeof(sd_fatfs), \
- (UINT*)&read_byte) != FR_OK)
- {
- /* ¶Áȡʧ°Ü */
- printf("FatFs file read from text fail!\r\n\r\n");
- }
- else
- {
- printf("FatFs file read from text success!\r\n\r\n");
- // printf("%s\r\n\r\n", read_text);
-
- for(uint16_t i=0 ;i<sizeof(sd_fatfs); i++)
- {
-
- printf("%s", ((i & 0x0f) ==0 ) ? "\r\n" : "\t");
- printf("%#02xU, ", read_text[i]);
- }
- }
复制代码写入数据到一个文件 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卡里面的东西吧。
这里显示的是乱码,不要紧,因为写入sd卡的数据是以二进制写入的,文本文件不识别,所以乱码了,不过没关系,用二进制文件打开就可以看到了
到此测试完成,有了这个基础,后面就可以读取音频文件,用过音频库解码后送给wm8904播放了
|