<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > avr的SD卡基本讀寫程序(一)

          avr的SD卡基本讀寫程序(一)

          作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
          /* SD Code for M32L */

          /* By pasyong */
          /* 2006-4 */
          /* Base ICC6.31A */
          /************************************************************/
          #include
          #include
          #include "1011.h"
          #define uchar unsigned char
          #define uint unsigned int
          #define MMC_CS_PIN BIT(4) //PORTB.4
          #define MMC_PORT PORTB

          本文引用地址:http://www.ex-cimer.com/article/201611/316550.htm

          uchar reading=0,a=0,pointer=0;
          void sd_port_init()
          {
          MMC_PORT|=MMC_CS_PIN;
          }
          uchar BUFFER[512]; //扇區(qū)緩沖區(qū)
          uint i=0;
          void delay_nus(uint n)
          {
          unsigned char b;
          for (b = 1; b;
          }
          //****************************************************************************
          //Send a Command to MMC/SD-Card
          //Return: the second byte of response register of MMC/SD-Card
          //****************************************************************************
          uchar SD_Write_Command(uchar cmd,unsigned long arg)
          {
          uchar tmp;
          uchar retry=0;

          //MMC_PORT|=MMC_CS_PIN; //SD卡關(guān)閉
          //send 8 Clock Impulse
          Write_Byte_SPI(0xFF);

          //set MMC_Chip_Select to low (MMC/SD-Card active)
          MMC_PORT&=~MMC_CS_PIN; //SD卡使能

          Write_Byte_SPI(cmd|0x40); //送頭命令
          Write_Byte_SPI(arg>>24);
          Write_Byte_SPI(arg>>16); //send 6 Byte Command to MMC/SD-Card
          Write_Byte_SPI(arg>>8);
          Write_Byte_SPI(arg&0xff);
          Write_Byte_SPI(0x95); //僅僅對(duì)RESET有效的CRC效驗(yàn)碼

          //get 8 bit response
          //Read_Byte_MMC(); //read the first byte,ignore it.
          do
          { //Only last 8 bit is used here.Read it out.
          tmp = Read_Byte_SPI();
          retry++;
          }
          while((tmp==0xff)&&(retry<100)); //當(dāng)沒有收到有效的命令的時(shí)候

          if(reading==0)
          MMC_PORT|=MMC_CS_PIN; //MMC_CS_PIN=1;
          else MMC_PORT&=~MMC_CS_PIN; //MMC_CS_PIN=0;
          return(tmp);
          }
          //****************************************************************************
          //SD卡初始化(SPI-MODE)
          //****************************************************************************
          uchar SD_Init(void)
          {
          uchar retry,temp;
          uchar i;
          MMC_PORT&=~MMC_CS_PIN; //SD卡使能

          delay_nus(250); //Wait MMC/SD ready...
          for (i=0;i<0x0f;i++)
          {
          Write_Byte_SPI(0xff); //send 74 clock at least!!!
          }
          //Send Command CMD0 to MMC/SD Card
          retry=0;

          do
          { //retry 200 times to send CMD0 command
          temp=SD_Write_Command(0,0);
          retry++;
          if(retry==100)
          {
          ;//CMD0 Error!
          }
          }
          while(temp!=1);

          //Send Command CMD1 to MMC/SD-Card
          retry=0;
          do
          { //retry 100 times to send CMD1 command
          temp=SD_Write_Command(1,0);
          retry++;
          if(retry==100)
          {
          ;
          }
          }
          while(temp!=0);
          retry=0;
          SD_Write_Command(16,512); //設(shè)置一次讀寫B(tài)LOCK的長(zhǎng)度為512個(gè)字節(jié)

          MMC_PORT|=MMC_CS_PIN; //MMC_CS_PIN=1; //set MMC_Chip_Select to high
          return(0); //All commands have been taken.
          }
          //****************************************************************************
          //從SD卡讀一個(gè)扇區(qū) Return 0 if no Error.
          //****************************************************************************
          uchar SD_Read_Block(unsigned long address)
          {
          uchar temp=0;uint i=0;
          reading=1;
          temp=SD_Write_Command(17,address); //讀出RESPONSE
          while (Read_Byte_SPI()!= 0xfe)
          {;} //直到讀取到了數(shù)據(jù)的開始頭0XFE,才繼續(xù)
          for(i=0; i<512; i++)
          {
          BUFFER[i]=Read_Byte_SPI();
          }
          Read_Byte_SPI();//CRC - Byte
          Read_Byte_SPI();//CRC - Byte
          reading=0;
          MMC_PORT|=MMC_CS_PIN; //關(guān)閉SD卡
          return(temp);
          }



          關(guān)鍵詞: avrSD卡讀寫程

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();