找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3372|回复: 2
打印 上一主题 下一主题
收起左侧

求代码 单片机控制MMC存储卡读写测试源程序+Proteus仿真文件

[复制链接]
跳转到指定楼层
楼主
K1:从开始位置开始写入0x00-0xFF, 0x00-0xFF(512字节)
K2:从第512字节位置开始写入512个随机字节
K3:读取前512个字节并显示
K4:读取后512个字节并显示
操作过程中可尝试"热插拨"MMC卡,观察运行效果

MMC存储卡仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机控制MMC存储卡源程序如下:
  1. //-----------------------------------------------------------------
  2. // 名称: MMC卡块读写程序
  3. //-----------------------------------------------------------------
  4. #include <reg51.h>
  5. #include <intrins.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <math.h>
  9. #include <absacc.h>
  10. #define INT8U  unsigned char
  11. #define INT16U unsigned int
  12. #define INT32U unsigned long
  13. //SPI接口存储器引脚定义
  14. sbit CS  = P3^2;                                //片选
  15. sbit DI  = P3^3;                                //串行数据输入
  16. sbit DO  = P3^4;                                //串行数据输出
  17. sbit CLK = P3^5;                                //串行时钟控制脚
  18. //MMC卡使能与禁止操作
  19. #define MMC_CS_EN() CS = 0
  20. #define MMC_CS_DI() CS = 1
  21. //MMC卡操作命令帧(6字节,48位)
  22. INT8U cmd[6] = { 0x00,0x00,0x00,0x00,0x00,0x00 };
  23. extern void delay_ms(INT16U);
  24. //块字节读写缓冲
  25. #define Block_Date &XBYTE[0x0000]
  26. #define delay_10us() {_nop_();_nop_();_nop_();_nop_();_nop_();\
  27.                                                 _nop_();_nop_();_nop_();_nop_();_nop_();}
  28. //-----------------------------------------------------------------
  29. // 打开SPI
  30. //-----------------------------------------------------------------
  31. void OpenSPI() { CS = 1; CLK = 0; }
  32. //-----------------------------------------------------------------
  33. // 从当前地址读取一字节数据
  34. //-----------------------------------------------------------------
  35. INT8U getcSPI()
  36. {


  37. }

  38. //-----------------------------------------------------------------
  39. // 向当前地址写入一字节数据
  40. //-----------------------------------------------------------------
  41. void putcSPI(INT8U dat)
  42. {


  43. }

  44. //-----------------------------------------------------------------
  45. // MMC命令帧清0
  46. //-----------------------------------------------------------------
  47. void clear_cmd_frame()
  48. {


  49. }

  50. //-----------------------------------------------------------------
  51. // 写MMC命令
  52. //-----------------------------------------------------------------
  53. INT8U MMC_Write_Command(INT8U *cmd_frame)
  54. {


  55. }

  56. //-----------------------------------------------------------------
  57. // MMC初始化
  58. //-----------------------------------------------------------------
  59. INT8U MMC_Initialise()
  60. {


  61. }

  62. //-----------------------------------------------------------------
  63. // 从指定的块地址读取单个块字节数据
  64. //-----------------------------------------------------------------
  65. INT8U MMC_Read_Block(INT32U address)
  66. {
  67.         INT16U i;
  68.         clear_cmd_frame();                                                //命令帧清0
  69.         cmd[0] = 0x51;                                                        //设置CMD17(0x51....0xFF)(读单个块)
  70.         cmd[5] = 0xFF;
  71.         address = address<<9;                                        //地址<<9位,取512的整数倍
  72.         cmd[1]  = address>>24;                                        //将address分解到
  73.         cmd[2]  = address>>16;                                        //四字节的命令帧参数中
  74.         cmd[3]  = address>>8;
  75.         cmd[4]  = address>>0;
  76.         if(MMC_Write_Command(cmd) != 0x00) return 0; //发送CMD17
  77.         while(getcSPI() != 0xFE) _nop_();                //等待数据接受开始(0xFE)
  78.         for(i = 0;i < 512; i++)                                        //读取块数据(512字节)
  79.           XBYTE[i] = getcSPI();
  80.         getcSPI();getcSPI();                                        //取走2字节的CRC
  81.         return 1;
  82. }
  83.         
  84. //-----------------------------------------------------------------
  85. // 向指定的块地址开始写入单个块字节数据
  86. //-----------------------------------------------------------------
  87. INT8U MMC_Write_Block(INT32U address)
  88. {
  89.         INT16U i,Dout;
  90.         clear_cmd_frame();                                                //命令帧清0
  91.         cmd[0] = 0x58;                                                        //设置CMD24(0x58....0xFF)(写单个块)
  92.         cmd[5] = 0xFF;
  93.         address = address<<9;                                        //地址<<9位,取512的整数倍
  94.         cmd[1]  = address>>24;                                        //将address分解到
  95.         cmd[2]  = address>>16;                                        //四字节的命令帧参数中
  96.         cmd[3]  = address>>8;
  97.         cmd[4]  = address>>0;
  98.         if(MMC_Write_Command(cmd) != 0x00) return 0; //发送CMD24
  99.         putcSPI(0xFF);                                                        //发送填冲字节
  100.         putcSPI(0xFE);                                                        //发送数据开始标志0xFE
  101.         //将块读写缓冲Block_bytes中的512字节数据写入MMC
  102.         for(i = 0;i < 512; i++) putcSPI(XBYTE[i]);
  103.         putcSPI(0xFF);                                                        //写入2字节CRC(未计算)
  104.         putcSPI(0xFF);
  105.         Dout = getcSPI() & 0x1F;                                //读取返回数据中的低5位
  106.         if(Dout != 0x05) return 0;                                //如果未能读到XXX0 0101则写入失败
  107.         while(getcSPI() == 0x00) _nop_();                 //忙等待
  108.         return 1;
  109. }
复制代码
  1. //-----------------------------------------------------------------
  2. //  名称: MMC存储卡测试
  3. //-----------------------------------------------------------------
  4. //  说明: 本例运行时,按下K1将向MMC卡第0块写入512个有序字节,按下K2时
  5. //                将向第1块写入512个随机字节,按下K3与K4时将分别读取并通过
  6. //                虚拟终端显示这些字节数据.
  7. //
  8. //-----------------------------------------------------------------
  9. #include <reg51.h>
  10. #include <intrins.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <math.h>
  14. #include <absacc.h>
  15. #define INT8U  unsigned char
  16. #define INT16U unsigned int
  17. #define INT32U unsigned long
  18. //定义按键操作
  19. #define K1_DOWN() !(P1 & (1<<0))
  20. #define K2_DOWN() !(P1 & (1<<2))
  21. #define K3_DOWN() !(P1 & (1<<4))
  22. #define K4_DOWN() !(P1 & (1<<6))
  23. //MMC相关函数
  24. extern void OpenSPI();
  25. extern INT8U MMC_Initialise();
  26. extern INT8U MMC_Read_Block(INT32U address);
  27. extern INT8U MMC_Write_Block(INT32U address);
  28. //串口相关函数
  29. extern void Init_USART();
  30. extern void PutChar(char c);
  31. extern void PutStr(char *s);
  32. INT8U OP = 0;                        //当前按键操作代号
  33. INT8U ERROR_Flag = 1;        //MMC卡操作错误标识(为1表示正常,为0表示出错)
  34. //-----------------------------------------------------------------
  35. // 延时函数
  36. //-----------------------------------------------------------------
  37. void delay_ms(INT16U x) {INT8U t; while(x--) for(t = 0; t<120; t++);}
  38. //-----------------------------------------------------------------
  39. // 以十六进制形式显示所读取的字节
  40. //-----------------------------------------------------------------
  41. void Show_Byte_by_HEX(INT32U Len)
  42. {
  43.         INT32U i; char s[] = "   ";//字符串初始为三个空格
  44.         for (i = 0; i < Len; i++)
  45.         {




  46.         }
  47.         PutStr("\r--------Finished!--------\r");
  48. }

  49. //-----------------------------------------------------------------
  50. // 向串口输出一个字符
  51. //-----------------------------------------------------------------
  52. void PutChar(INT8U c) { SBUF = c; while (TI == 0); TI = 0; }
  53. //------------------------------------------------------------------
  54. // 串口输出字符串
  55. //------------------------------------------------------------------
  56. void PutStr(char *s) { while (*s) PutChar(*s++); }
  57. //-----------------------------------------------------------------
  58. // 串口配置
  59. //-----------------------------------------------------------------
  60. void Init_USART()
  61. {


  62. }

  63. //-----------------------------------------------------------------
  64. // 主程序
  65. //-----------------------------------------------------------------
  66. void main()
  67. {
  68.         INT32U i,j;
  69.         //SPI,USART初始化
  70.         OpenSPI(); Init_USART(); delay_ms(100);
  71.         //初始化MMC
  72.         PutStr("Initialise MMC, Please Waiting.....");
  73.         ERROR_Flag = MMC_Initialise();
  74.         if (ERROR_Flag) PutStr("OK!\r\r"); else PutStr("ERROR!\r\r");
  75.         //提示进行K1-K4操作
  76.         PutStr("Plase Press K1,K2,K3 or K4 to Play MMC Test...\r\r");
  77.         //设置随机种子
  78.         srand(300);
  79.         while(1)
  80.         {        while (P1 == 0xFF); //未按键则等待-------------------------
  81.                 if                (K1_DOWN()) { delay_ms(10); if (K1_DOWN()) OP = 1; }
  82.                 else if (K2_DOWN()) { delay_ms(10); if (K2_DOWN()) OP = 2; }
  83.                 else if (K3_DOWN()) { delay_ms(10); if (K3_DOWN()) OP = 3; }
  84.                 else if (K4_DOWN()) { delay_ms(10); if (K4_DOWN()) OP = 4; }
  85.                 //如果上次MMC出错则重新初始化SPI接口与MMC卡
  86.                 if (ERROR_Flag == 0) //------------------------------------
  87.                 {


  88.                 }
  89.                 //根据按键操作代号分别进行操作,因为上述可能的重新初始化会耗费较多时间,
  90.                 //如果在这里仍用K1~K4的DOWN判断,按键可能已经释放,从而导致判断失效.
  91.                 //因此这里使用的是提前获取的按键操作代号
  92.                 if (OP == 1) //--------------------------------------------
  93.                 {


  94.                 }
  95.                 else if (OP == 2) //---------------------------------------
  96.                 {


  97.                 }
  98.                 else if (OP == 3) //---------------------------------------
  99.                 {


  100.                 }
  101.                 else if (OP == 4) //---------------------------------------
  102.                 {


  103.                 }
  104.                 next: while (P1 != 0xFF);                 //等待释放按键-----------------
  105.         }
  106. }
复制代码


所有资料51hei提供下载:
50 MMC存储卡测试.zip (33.82 KB, 下载次数: 35)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:104982 发表于 2019-3-14 09:25 | 只看该作者
代码不完整,还要找配套的书才可以
回复

使用道具 举报

板凳
ID:625070 发表于 2020-4-17 16:17 | 只看该作者
请问楼主,mmc映像文件怎么生成的呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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