新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機讀寫SD卡最簡單最基本的程序

        單片機讀寫SD卡最簡單最基本的程序

        作者: 時間:2016-11-25 來源:網絡 收藏

          

          void read_data(U8 *buffer)

          {

          U32 i;

          U8 rsp = 0;

          while(!(rsp == 0xfe)) //答應字節的最低為0則代表起始位

          rsp = spi_read_byte();

          for(i = 0;i < BLOCK_LEN; i++) //讀一個block的內容,一般為512字節

          buffer = spi_read_byte();

          for(i = 0; i < 2; i++) //讀兩個CRC校正碼

          send_clk();

          send_clk(); //讀結束字節

          }

          

          U8 write_data(U8 *buffer)

          {

          U16 rsp = 0, tmp = 0, busy = 0, i = 6;

          spi_rt_mode();

          spi_write_byte(0xfe); //起始位

          for(i = 0; i < 512; i++) //發送512個字節

          spi_write_byte(buffer);

          for(i = 0; i < 2; i++) //發送16位的CRC校正

          spi_write_byte(0xff);

          spi_ro_mode(); //等待答應

          while(!(rsp == 0x1))

          {

          rsp =(U16)spi_read_byte();

          tmp = rsp;

          rsp &= 0x11;

          }

          while(!(busy == 0xff)) //判忙

          {

          busy = spi_read_byte();

          }

          tmp &= 0xe;

          if (tmp == 4)

          return NO_ERR;

          else

          {

          Uart_Printf("writing error!!!");

          return WR_SGL_BLK_ERR;

          }

          }

          

          U8 read_register(U8 len, U8 *buffer)

          {

          U8 rsp = 0xff, i = 0;

          spi_ro_mode();

          while((rsp == 0xff) && (i < 100))

          {

          rsp=spi_read_byte();

          }

          if (i > 99)

          {

          Uart_Printf("ERR in readding register!!!");

          return rsp;

          }

          if (rsp != 0xfe)

          {

          buffer[0] = rsp;

          i = 1;

          }

          else

          i = 0;

          for( ; i < len; i++)

          buffer = spi_read_byte();

          for(i = 0; i < 2; i++ )

          send_clk();

          send_clk();

          return NO_ERR;

          }

          

          

          void send_clk()

          {

          rSIOCON |= (1 << 3); //使能SPI

          while (!(rINTPND & BIT_SIO)); //等待發送完畢

          rI_ISPC|=BIT_SIO; //清除中斷標志

          }

          

          void spi_write_byte(U8 dat)

          {

          rSIODAT = dat;

          send_clk(); //SPI發送

          }

          

          U8 spi_read_byte(void)

          {

          send_clk(); //SPI發送

          return rSIODAT;

          }

          

          void spi_port_init()

          {

          rIVTCNT = 0;

          rPCONF = (rPCONF & 0xe3ff) | 0x1B0C00; //除了CLK,茶葉MISO,MOSI外,不改變其他位

          rPUPF |= 0x160; //使能MISO的上拉電阻

          }

          

          #ifndef _SD_CONG

          #define _SD_CONG

          #define BLOCK_LEN (512) //一個block的長度

          #define CMD0 0

          #define CMD1 1 // 讀OCR寄存器

          #define CMD9 9 // 讀CSD寄存器

          #define CMD10 10 // 讀CID寄存器

          #define CMD12 12 // 停止讀多塊時的數據傳輸

          #define CMD13 13 // 讀 Card_Status 寄存器

          #define CMD16 16 // 設置塊的長度

          #define CMD17 17 // 讀單塊

          #define CMD18 18 // 讀多塊,直至主機發送CMD12

          #define CMD24 24 // 寫單塊

          #define CMD25 25 // 寫多塊

          #define CMD27 27 // 寫CSD寄存器

          #define CMD28 28 // Set the write protection bit of the addressed group

          #define CMD29 29 // Clear the write protection bit of the addressed group

          #define CMD30 30 // Ask the card for the status of the write protection bits

          #define CMD32 32 // 設置擦除塊的起始地址

          #define CMD33 33 // 設置擦除塊的終止地址

          #define CMD38 38 //擦除所選擇的塊

          #define CMD42 42 // 設置/復位密碼或上鎖/解鎖卡

          #define CMD55 55 // 禁止下一個命令為應用命令

          #define CMD56 56 // 應用命令的通用I/O

          #define CMD58 58 // 讀OCR寄存器

          #define CMD59 59 // 使能或禁止

          //錯誤返回

          #define INIT_FAIL 0

          #define NO_ERR 1

          #define WR_SGL_BLK_ERR 2

          #define GET_INFO_ERR 3

          #define R1 1 //SD卡答應類型,表示一個字節

          #define R2 2 //SD卡答應類型,表示兩個字節

          //一下是移植時需修改的內容

          #define SD_desel() rPDATE=0x20; //使能SD卡

          #define SD_sel() rPDATE=0x00; //放開SD卡

          #define spi_high_speed() rSBRDR = 5; //spi高速模式

          #define spi_low_speed() rSBRDR = 99; //spi低速模式

          #define spi_ro_mode() rSIOCON = (0x0 << 7) | (0x0 << 6) | (0x0 << 5) | (0x0 << 4) | (0x0 << 3) | (0x0 << 2) | 0x1 //只讀模式

          #define spi_rt_mode() rSIOCON = (0x0 << 7) | (0x0 << 6) | (0x1 << 5) | (0x0 << 4) | (0x0 << 3) | (0x0 << 2) | 0x1 //讀寫模式

          #endif

        上一頁 1 2 下一頁

        關鍵詞: 單片機讀寫SD

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 呼图壁县| 江阴市| 元氏县| 资阳市| 茶陵县| 伊春市| 贡觉县| 木兰县| 安图县| 正阳县| 灵宝市| 南部县| 兴业县| 陵川县| 元氏县| 通化市| 依安县| 榆社县| 陆良县| 兴义市| 奉新县| 芜湖市| 外汇| 五峰| 宝丰县| 成武县| 宽城| 阳朔县| 永济市| 广汉市| 梨树县| 仁怀市| 灯塔市| 竹溪县| 斗六市| 团风县| 左贡县| 泾源县| 宁波市| 盱眙县| 普兰店市|