欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17352|回復(fù): 11
收起左側(cè)

終于實(shí)現(xiàn)51單片機(jī)讀SD卡的邏輯0扇區(qū)高興

  [復(fù)制鏈接]
ID:83710 發(fā)表于 2015-6-23 18:39 | 顯示全部樓層 |閱讀模式
呵呵!今天晚上真是走運(yùn)啊,我12月8日開始的做SD讀實(shí)驗(yàn),到今天晚上11:00才做出來啊,其中寫片115次,變過四次程序,連著三晚上沒睡好覺,兩天偷偷的沒去上班在宿舍做實(shí)驗(yàn),終于搞定讀邏輯0扇區(qū)了!我算是受夠了,但是這幾天每天晚上都在找資料,請(qǐng)老師,可是真是那句話,靠誰也不如靠自己,別人是不了解你的實(shí)際情況的,在這里我真的很感謝網(wǎng)絡(luò),有了它,我在千千萬萬的資料中找到了最有用的幾分,然我得意找到鑰匙。
接下來說下SD卡(microsd)讀DBR:

SD卡作為一種存儲(chǔ)設(shè)備早在應(yīng)用了,但是關(guān)于SD卡我還是在做完12864顯示以后才發(fā)現(xiàn),光顯示圖片有啥意思?不如來點(diǎn)動(dòng)畫,呵呵殊不知存儲(chǔ)空間收到限制了,一幅BMP圖片要1KB的存儲(chǔ)空間,我的存儲(chǔ)容量是8K,呵呵,很顯然是不行的,有沒有一種大容量小體積便攜,便于PC操作的存儲(chǔ)設(shè)備那?指向了SD卡,一代的可以最大存儲(chǔ)4GB,這是相當(dāng)海量的,也是很理想的,決定后看了關(guān)于FAT32的文件系統(tǒng),感覺真是很難,不過,也大抵能找到根目錄,F(xiàn)AT表和數(shù)據(jù)區(qū),接下來是做實(shí)驗(yàn)搭模塊,開始看了關(guān)于SD卡的資料,網(wǎng)上資料很多,我看了大多泛泛而談,沒做過的,即使看了還是無處下手,我經(jīng)驗(yàn)如下:1.首先要了解SPI通信,因?yàn)樗腔A(chǔ),要靠他來完成數(shù)據(jù)交換,其實(shí)SPI也沒什么,個(gè)人感覺比異步簡單老鼻子了,關(guān)鍵是SD卡中數(shù)據(jù)發(fā)送時(shí)上升沿,數(shù)據(jù)接收是下降沿,記好了,期間一定要保證數(shù)據(jù)的穩(wěn)定,且在寫時(shí)MISO線要保持高電平,讀時(shí)MOSI要保持高電平,2,寫命令是公六字節(jié),最先發(fā)送的是指令代碼(高位先發(fā))然后是參數(shù),對(duì)于參數(shù)是地址的則按地址字節(jié)最高字節(jié)在前,以此類推,例如:ADD=0x01020304,那么先要發(fā)送01,在發(fā)02,在發(fā)03在發(fā)04;最后發(fā)CRC效驗(yàn),當(dāng)然這里默認(rèn)為FF,不用管它;3,先調(diào)復(fù)位SD卡,然后再調(diào)初始化,在調(diào)讀,這里注意,當(dāng)你初始化復(fù)位時(shí),時(shí)鐘一定要慢,當(dāng)要讀扇區(qū)是一定要提高時(shí)鐘頻率,要不非得操蛋不可,當(dāng)調(diào)好復(fù)位初始化后,先做個(gè)試驗(yàn),讀取0扇區(qū)的值,當(dāng)然這里指的是讀物理扇區(qū),如果讀到扇區(qū)的最后兩個(gè)字節(jié)是55AA,那恭喜你,你的程序沒問題了,但是FAT文件系統(tǒng)要的是邏輯0扇區(qū)的BPB(系統(tǒng)引導(dǎo)記錄),所以你要用軟件打開磁盤找到PHYSICALL SECTOR NO:和LOGICAL SECTOR NO:即物理扇區(qū)和邏輯扇區(qū),例如我的是253  0:表示什么呢?表示邏輯扇區(qū)0在物理253扇區(qū),所以找到253扇區(qū)就找到邏輯0扇區(qū)了,那怎樣找?又要注意了,SD卡的讀操作的尋址是按字節(jié)一扇區(qū)來的,所以要吧扇區(qū)轉(zhuǎn)換成字節(jié),一扇區(qū)是512字節(jié),那么邏輯0扇區(qū)的物理地址為253*512=129536;吧這個(gè)值寫入SD卡然后讀出來就是邏輯0扇區(qū)的值;一個(gè)也不搭茬;找到了邏輯0扇區(qū)就找到了進(jìn)入FAT32文件系統(tǒng)的第一步,也是一把非常重要的鑰匙,但是離最終的文件尋址還差的遠(yuǎn),要是沒這一步,文件尋址是不可能的!還證明了,WINheBUbub不能顯示物理0扇區(qū),只能顯示邏輯0扇區(qū),嘻嘻!

下面是源碼、、、我用的是手機(jī)內(nèi)存卡1GB



  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit p1_7=P1^7;
  5. sbit CS=P2^0; //片選信號(hào)(低電平有效)
  6. sbit DATEIN =P2^1;//主-從數(shù)據(jù)輸入
  7. sbit SCLK=P2^2;//時(shí)鐘信號(hào)
  8. sbit DATEOUT=P2^3;//從-主數(shù)據(jù)輸出

  9. uint btime;
  10. uchar c;

  11. sbit led4=P1^0;
  12. sbit led3=P1^1;    //2010年12月14日與天津開發(fā)區(qū)
  13. sbit led2=P1^2;
  14. sbit led1=P1^3;
  15. uchar g=0,s=0,bw=0,q=0; //顯示單元 個(gè)位、十位、百位、千位
  16. uchar code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//不帶小數(shù)點(diǎn)顯示0~9

  17. unsigned char bdata dat;
  18. sbit dat_0=dat^0;
  19. sbit dat_1=dat^1;
  20. sbit dat_2=dat^2;
  21. sbit dat_3=dat^3;
  22. sbit dat_4=dat^4;
  23. sbit dat_5=dat^5;
  24. sbit dat_6=dat^6;
  25. sbit dat_7=dat^7;

  26. bit is_init;//決定是否延時(shí);
  27.   uchar lpp;
  28. unsigned char fhz;//返回值
  29. uchar fhz_buff; //讀返回值中間量
  30. unsigned char xdata tab[512];


  31. void delay(uint time)
  32. {  while(time)
  33.   time--;
  34. }

  35. //**********************************************
  36. /*讀sd卡子程序,無返回值,有參函數(shù),參數(shù)為要寫入DATEIN數(shù)據(jù)線的字節(jié)*/
  37. void write(unsigned char wr_)// 寫入一個(gè)字節(jié)SD卡
  38. {
  39.            dat=wr_;
  40.         DATEIN=dat_7;
  41.    
  42.       SCLK=0;
  43.    if(is_init)delay(200);
  44.      if(!is_init)delay(2);
  45.       SCLK=1;
  46.       if(is_init) delay(200);
  47.        if(!is_init)delay(2);
  48.   
  49.       DATEIN=dat_6;
  50.    
  51.       SCLK=0;
  52.      if(!is_init)delay(2);
  53.     if(is_init)delay(200);
  54.       SCLK=1;
  55.       if(is_init) delay(200);
  56.      if(!is_init)delay(2);

  57.       DATEIN=dat_5;
  58.    
  59.       SCLK=0;
  60.     if(is_init)delay(200);
  61.      if(!is_init)delay(2);
  62.       SCLK=1;
  63.       if(is_init) delay(200);
  64.     if(!is_init)delay(2);

  65.       DATEIN=dat_4;
  66.    
  67.       SCLK=0;
  68.     if(is_init)delay(200);
  69.       if(!is_init)delay(2);
  70.       SCLK=1;
  71.       if(is_init) delay(200);
  72.      if(!is_init)delay(2);

  73.      DATEIN=dat_3;
  74.    
  75.       SCLK=0;
  76.     if(is_init)delay(200);
  77.       if(!is_init)delay(2);
  78.       SCLK=1;
  79.       if(is_init) delay(200);
  80.     if(!is_init)delay(2);

  81.      DATEIN=dat_2;
  82.    
  83.       SCLK=0;
  84.     if(is_init)delay(200);
  85.       if(!is_init)delay(2);
  86.       SCLK=1;
  87.       if(is_init) delay(200);
  88.       if(!is_init)delay(2);

  89.     DATEIN=dat_1;
  90.    
  91.       SCLK=0;
  92.     if(is_init)delay(200);
  93.      if(!is_init)delay(2);
  94.       SCLK=1;
  95.       if(is_init) delay(200);
  96.      if(!is_init)delay(2);

  97.     DATEIN=dat_0;
  98.    
  99.       SCLK=0;
  100.     if(is_init)delay(200);
  101.       if(!is_init)delay(2);
  102.       SCLK=1;
  103.       if(is_init) delay(200);
  104.      if(!is_init)delay(2);
  105. }
  106. unsigned char read()// 讀取一個(gè)字節(jié)SD卡
  107. {
  108.           DATEOUT=1;
  109.          SCLK=1;
  110.    if(is_init)delay(200);
  111.      if(!is_init)delay(2);
  112.    SCLK=0;
  113.     if(is_init)delay(200);
  114.    if(!is_init)delay(2);
  115.     dat_7=DATEOUT;

  116.      SCLK=1;
  117.    if(is_init)delay(200);
  118.    if(!is_init)delay(2);
  119.    SCLK=0;
  120.     if(is_init)delay(200);
  121.      if(!is_init)delay(2);
  122.     dat_6=DATEOUT;

  123.     SCLK=1;
  124.    if(is_init)delay(200);
  125.     if(!is_init)delay(2);
  126.    SCLK=0;
  127.     if(is_init)delay(200);
  128.     if(!is_init)delay(2);
  129.     dat_5=DATEOUT;

  130.     SCLK=1;
  131.    if(is_init)delay(200);
  132.      if(!is_init)delay(2);
  133.    SCLK=0;
  134.     if(is_init)delay(200);
  135.    if(!is_init)delay(2);
  136.     dat_4=DATEOUT;

  137.      SCLK=1;
  138.    if(is_init)delay(200);
  139.     if(!is_init)delay(2);
  140.    SCLK=0;
  141.     if(is_init)delay(200);
  142.      if(!is_init)delay(2);
  143.     dat_3=DATEOUT;

  144.     SCLK=1;
  145.    if(is_init)delay(200);
  146.        if(!is_init)delay(2);
  147.    SCLK=0;
  148.     if(is_init)delay(200);
  149.        if(!is_init)delay(2);
  150.     dat_2=DATEOUT;

  151.      SCLK=1;
  152.    if(is_init)delay(200);
  153.         if(!is_init)delay(2);
  154.    SCLK=0;
  155.     if(is_init)delay(200);
  156.        if(!is_init)delay(2);
  157.     dat_1=DATEOUT;


  158.      SCLK=1;
  159.    if(is_init)delay(200);
  160.          if(!is_init)delay(2);
  161.    SCLK=0;
  162.     if(is_init)delay(200);
  163.           if(!is_init)delay(2);
  164.     dat_0=DATEOUT;


  165.    return (dat);

  166. }

  167. void restsd()//復(fù)位SD卡
  168. {  uchar i;
  169. uchar pcmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
  170. is_init=1;

  171. CS=1;
  172. for(i=0;i<15;i++)
  173. {
  174.        //120時(shí)鐘
  175.    write(0xff);
  176. }


  177.   
  178.   
  179.       CS=1;
  180.    write(0xff);//據(jù)說是提高兼容性
  181.    CS=0;//片選開

  182.    write( pcmd[0]);
  183.    write( pcmd[1]);
  184.    write( pcmd[2]);
  185.    write( pcmd[3]);
  186.    write( pcmd[4]);
  187.    write( pcmd[5]);

  188.    fhz=read();
  189. for(;;)
  190. {
  191.    fhz=read();
  192.    if(fhz==0x01)break;


  193. }

  194.   
  195.   CS=1;
  196.   write(0xff);

  197. }




  198. void initsd()//初始化
  199. {
  200. //
  201.    uchar pcmd[6]={0x41,0x00,0x00,0x00,0x00,0xff};//
  202. //

  203.       CS=1;
  204.    write(0xff);//據(jù)說是提高兼容性
  205.    CS=0;//片選開

  206.    write( pcmd[0]);
  207.    write( pcmd[1]);
  208.    write( pcmd[2]);
  209.    write( pcmd[3]);
  210.    write( pcmd[4]);
  211.    write( pcmd[5]);

  212.   
  213.    fhz=read();
  214. for(;;)
  215. {
  216.    fhz=read();
  217.    if(fhz==0x00)break;


  218. }

  219.   
  220.   CS=1;
  221.   write(0xff);








  222. }

  223. void readsd()//讀SD卡物理扇區(qū)

  224. {
  225.    uchar pcmd[6]={0x51,0x00,0x01,0xfa,0x00,0xff};//原來這里是高地址字節(jié)在前地地址在后啊201012月14日
  226.    uint j,n;


  227.    CS=1;
  228.    write(0xff);//據(jù)說是提高兼容性
  229.    CS=0;//片選開

  230.    write( pcmd[0]);
  231.    write( pcmd[1]);
  232.    write( pcmd[2]);
  233.    write( pcmd[3]);
  234.    write( pcmd[4]);
  235.    write( pcmd[5]);
  236.    DATEOUT=1;
  237.   
  238. for(;;)
  239. {
  240.    fhz=read();
  241.    if(fhz==0x00)break;


  242. }
  243. DATEOUT=1;

  244.    for(;;)
  245. {
  246.    fhz=read();
  247.    if(fhz==0xfe)break;


  248. }

  249.   DATEOUT=1;
  250. n=0;
  251. for(j=512;j;j--)
  252. {  
  253.    tab[n]=read();
  254.     n++;

  255. }
  256. fhz=read();
  257. fhz=read();
  258. CS=1;
  259. write(0xff);








  260. }
  261. /*void writesd()

  262. {
  263.    uchar pcmd[6]={0x58,0x00,0x00,0x00,0x00,0xff};
  264.    uint j,k;


  265.    CS=1;
  266.    write(0xff);//據(jù)說是提高兼容性
  267.    CS=0;//片選開

  268.    write( pcmd[0]);
  269.    write( pcmd[1]);
  270.    write( pcmd[2]);
  271.    write( pcmd[3]);
  272.    write( pcmd[4]);
  273.    write( pcmd[5]);

  274.    DATEOUT=1;
  275. for(;;)
  276. {
  277.    fhz=read();
  278.    if(fhz==0x00)break;


  279. }
  280. DATEOUT=1;

  281.    for(j=20;j;j--)
  282. {
  283.   write(0xff);



  284. }

  285. write(0xfe);
  286. for(j=512;j;j--)
  287. { k=tab[j];
  288.    write(k);


  289. }
  290. write(0xff);
  291. write(0xff);


  292. DATEOUT=1;
  293. for(;;)
  294. {
  295. fhz=read();
  296. if((fhz&0x0f)==0x05)break;
  297. }





  298.   if(!DATEOUT);
  299. {
  300.    write(0xff);

  301. }
  302. CS=1;
  303. write(0xff);








  304. }
  305. */
  306. void delay1(uint z) //延時(shí)程序
  307. {
  308. uint x,a,b;
  309.          for (x=0;x<z;x++)
  310.   
  311.        {
  312.        for(b=120;b>0;b--)
  313.     {
  314.         for(a=3;a>0;a--);
  315.    
  316.              }
  317.     }


  318. }
  319. void display(uchar sd) //顯示程序

  320. {   


  321.              c=sd;
  322.            g=(sd&0x0f);
  323.    
  324.    c=(c>>4);
  325.    s=(c&0x0f);
  326.     led1=0;
  327.     P0=tab1[g]; //個(gè)
  328.     delay1(2);
  329.     led1=1;
  330.      led2=0;
  331.     P0=tab1[s];//十
  332.     delay1(2);
  333.     led2=1;
  334.     led3=0;
  335.     P0=tab1[0];   //百
  336.     delay1(2);
  337.     led3=1;
  338.                  led4=0;
  339.     P0=tab1[0];    //千
  340.     delay1(2);
  341.     led4=1;


  342. }
  343. void delay2(void)   //誤差 -0.00000000025us
  344. {
  345.     unsigned char a,b,c,n;
  346.     for(c=217;c>0;c--)
  347.         for(b=225;b>0;b--)
  348.             for(a=225;a>0;a--);
  349.     for(n=10;n>0;n--);
  350. }
  351. void main()
  352. { uint ad;
  353. uchar v;
  354. is_init=1;
  355. restsd();
  356. initsd();
  357. is_init=0;//提高始終頻率
  358. p1_7=0;
  359. //writesd();
  360. readsd();//讀物理扇區(qū)
  361. p1_7=1;
  362.    btime=65536;
  363. while(1)
  364. {   btime=300;
  365.    delay2();



  366. for(;;)
  367. {
  368. v=tab[ad];
  369. display(v);
  370. btime--;
  371. if(btime==0)break;
  372.   }
  373.   ad++;
  374.   if(ad==512)ad=0;

  375. }





  376. }
復(fù)制代碼
以上程序僅在本人試驗(yàn)?zāi)K中通過,不知兼容咋樣!用LED顯示512字節(jié)的碼形!
2015年12月14日-12月8日歷時(shí)一星期終于讀出BPB,加油啊,離文件系統(tǒng)還差的遠(yuǎn)。


評(píng)分

參與人數(shù) 1威望 +1 黑幣 +5 收起 理由
紅塵有你 + 1 + 5

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:73848 發(fā)表于 2015-7-1 09:55 來自觸屏版 | 顯示全部樓層
感受到樓主的喜悅了,接連發(fā)了那么多帖子,祝早日成功
回復(fù)

使用道具 舉報(bào)

ID:73848 發(fā)表于 2015-7-1 09:55 來自觸屏版 | 顯示全部樓層
感受到樓主的喜悅了,接連發(fā)了那么多帖子,祝早日成功
回復(fù)

使用道具 舉報(bào)

ID:81808 發(fā)表于 2015-7-1 12:48 | 顯示全部樓層
時(shí)空穿越了!現(xiàn)在就15年12月了,幸會(huì),幸會(huì)!
回復(fù)

使用道具 舉報(bào)

ID:84485 發(fā)表于 2015-7-1 16:50 | 顯示全部樓層
非常好
回復(fù)

使用道具 舉報(bào)

ID:97940 發(fā)表于 2015-12-1 22:36 | 顯示全部樓層
有電路嗎 求
回復(fù)

使用道具 舉報(bào)

ID:97249 發(fā)表于 2015-12-2 12:25 | 顯示全部樓層
樓主精神實(shí)在可嘉,加油!
回復(fù)

使用道具 舉報(bào)

ID:101982 發(fā)表于 2016-1-5 22:01 | 顯示全部樓層
多謝。。。
回復(fù)

使用道具 舉報(bào)

ID:140999 發(fā)表于 2016-9-30 17:05 | 顯示全部樓層
"所以你要用軟件打開磁盤找到PHYSICALL SECTOR NO:和LOGICAL SECTOR NO:即物理扇區(qū)和邏輯扇區(qū)",請(qǐng)教一下樓主:你是怎么查看物理扇區(qū)和邏輯扇區(qū)的?用的是什么軟件。
回復(fù)

使用道具 舉報(bào)

ID:140218 發(fā)表于 2016-10-17 10:58 來自觸屏版 | 顯示全部樓層
一遍一遍的看
回復(fù)

使用道具 舉報(bào)

ID:140644 發(fā)表于 2020-1-25 15:41 | 顯示全部樓層
幫頂,支持樓主
回復(fù)

使用道具 舉報(bào)

ID:65707 發(fā)表于 2020-3-25 22:29 | 顯示全部樓層
幫頂,支持樓主.正在學(xué)習(xí)SD卡圖片顯示
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表