[其他MCU] lpc1343读写SD卡的FAT文件步骤

[复制链接]
 楼主| Roderman_z 发表于 2016-1-17 20:46 | 显示全部楼层 |阅读模式
pc1343读写SD卡的FAT文件步骤介绍为了让我的LPC1343同样丰富多彩,前段时间我调试了数字电源的OLED显示部分,目前已经可以显示字符、汉字、图形。只是代码写的比较乱,不好意思拿出来见人,等整理好后我会贴在“用LPC1343做一个可调数字电源和可调电子负载。由于MCU的存储资源不多,这让OLED开机显示一些复杂的动画显得十分困难:我的OLED是128*128点阵,一副真彩色画面字节数=128*128*3=48K。显示一副画面的都要48K,更不要说几副连贯的动画LPC1343只有32K的FLASH,就是不装程序也是一副真彩色画面都装不下。最后我只是装入一副64*64点阵真彩色画面看显示效果,虽然画面小了一点,但是显示效果确实不错。
为了让LPC1343也能用上SD卡,读写SD卡的FAT文件。我尝试了蛮多方法 介绍一下:
一:连接电路

SD卡兼容MMC卡,同样支持SPI方式读写。这是LPC1343是主机,SD是从机。
     连接:SSEL  -  P0.2       ---->    SD卡引脚1 CS
           SCK    -  P2.11     ---->    SD卡引脚5 CL
           MISO  -  P 0.8       ---->   SD卡引脚7  DO (DO是从SD卡的角度)
           MOSI  -  P0.9       ---->    SD卡引脚2  DI (DI是从SD卡的角度)
           +3.3V                   ---->    SD卡引脚4  VDD
           GND                    ---->    SD卡引脚2、6 VSS
在上一张我以前用的SD卡接线图,图例用的是SD方式,大家只需要参考图的接线编号。

电路部分结束,下面开始程序部分。
上面的电路很简单: 我们所要做的就是找一个SD卡座,按照我提供的SD卡接线图找到那6个脚,对应焊接到开发板即可。
二、代码移植
LPC1114和LPC1343在C代码里面管脚命名一样,SSP的寄存器的命名也一样。
1、直接把他提供的源程序里的相关文件直接复制到我们的项目里:SSP.C, SSP.H, SD.C, SD.H,  FF.C, FF.H, DISKIO.C DISKIO.H, APP.C, APP.H, INTEGER.H, FFCONF.H, CONFIG.H, GPIO.C, GPIO.H。
2、在CONFIG.H文件里找到#include "LPC11xx.h" 改为:#include "LPC13xx.h"。
3、在我们需要引用的项目文件里(例如我的项目主程序是usbhidrom_main.c)添加#include "app.h"。
4、试一试修改的程序编译是否通过,根据情况再做修改。我没有碰到什么困难,编译通过了。
5、以后在项目文件就可以通过调用app.h定义好的那些文件读、写、删除等函数,实现对SD卡的文件的操作。
6、我这里要实现:读SD卡的BMP文件,然后将图形数据写到OLED屏显示。不需要写到UART串口,所以没有拷贝UART.C, UART.H文件。
7、对APP.C的读文件函数做修改,读SD卡的BMP文件,然后将图形数据写到OLED屏显示。
图形都是128*128分辨率的,24位真彩,为*.bmp文件。
每个*.bmp文件都有BMP文件头,我们只是显示,不需要仔细分析BMP文件头,所以在AppFileRead()里直接略过54字节BMP文件头,逐点读取24位真彩数据写到OLED显示。
 楼主| Roderman_z 发表于 2016-1-17 20:46 | 显示全部楼层
  1. /**************************************************************************************
  2. * FunctionName   : AppFileRead()
  3. * Description    : 读取文件
  4. * EntryParameter : fileName - 需要读取的文件名或路径
  5. * ReturnValue    : 成功返回-0;失败返回-1
  6. **************************************************************************************/
  7. uint8_t AppFileRead(const TCHAR *fileName)
  8. {
  9. FATFS fs;               /*Work area (file system object) for logical drive*/
  10.     FIL file;               /*file objects*/
  11. UINT  br,ii=0;               /*File R/W count*/

  12. /*Register a work area for logical drive 0*/
  13.     f_mount(0, &fs);

  14.     /*Create file*/
  15.     if(f_open(&file, fileName, FA_READ))
  16.     {
  17.   return 0;
  18.     }
  19. else
  20. {
  21.   //OLED屏幕写屏方式
  22.   cmd(0x05);
  23.   data(0x02);

  24. cmd(0x0A);    //指定对OLED全屏幕写屏
  25.   data(0);
  26.   data(0x00); //
  27.   data(7);
  28.   data(0x0f); //15
  29.   data(2);
  30.   data(0x00); //64          //D-IC Change : 128128 IC -> 128160 IC
  31.   data(9);
  32.   data(0x0F); //127
  33.   cmd(0x0C);
  34.   do
  35.   {
  36.    AppClearBuffer(0x00);   // 缓冲清零
  37.    if(f_read(&file, Buffer, BUFFER_SIZE, &br))
  38.    {
  39.     return 0;
  40.    }
  41.    else
  42.    {
  43.     //UARTSendString((const CHAR *)Buffer);  // UART发送读取文件,我们不需要,注释掉
  44.     int i;
  45.     for(i=0;i<br;i=i+3)
  46.     {
  47.      if (ii>=54)    //丢掉我们不需要的BMP文件头,一共54个字节
  48.      {
  49.       data(Buffer[i+2]>>2);  //写到OLED,红色
  50.       data(Buffer[i+1]>>2);  //写到OLED,绿色
  51.       data(Buffer>>2);  //写到OLED,蓝色
  52.      }
  53.      ii+=3;
  54.     }
  55.    }
  56.   } while (br);  // 判断是否读完(br == 0,表示读取完成)
 楼主| Roderman_z 发表于 2016-1-17 20:47 | 显示全部楼层
  1. /*Close all files*/
  2.       f_close(&file);    // 关闭文件,必须和f_open函数成对出现
  3.       //write direction
  4.       cmd(0x05);
  5.         data(0x00);
  6. }

  7.     /*Unregister a work area before discard it*/
  8.     f_mount(0, 0);

  9.     return ii;
  10. }

完成以上修改后,编译、调式通过。OLED循环显示SD卡里面的BMP图片。刷新频率:2-3副/秒,不算快。
前面我做了测试:OLED刷屏速度可以轻松达到30副/秒。所以应该显示BMP图片速度慢应该和SPI接口的读取速度有关。看看能否进行修改。
orangebanana 发表于 2016-1-18 20:43 | 显示全部楼层
用的是sd模式还是SPI总线写的驱动啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

354

帖子

2

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

41

主题

354

帖子

2

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