色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > AVR的SD卡接口程序

          AVR的SD卡接口程序

          作者: 時間:2011-11-25 來源:網(wǎng)絡 收藏

          程序/*****************************************************/
          /* SD Code for M32L */
          /* By pasyong */
          /* 2006-4 */
          /* Base ICC6.31A */
          /************************************************************/
          #include iom32v.h>
          #include macros.h>
          #include "1011.h"
          #define uchar unsigned char
          #define uint unsigned int
          #define MMC_CS_PIN BIT(4) //PORTB.4
          #define MMC_PORT PORTB

          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; bn; 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卡關閉
          //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(arg0xff);
          Write_Byte_SPI(0x95); //僅僅對RESET有效的CRC效驗碼

          //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)(retry100)); //當沒有收到有效的命令的時候

          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;i0x0f;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); //設置一次讀寫B(tài)LOCK的長度為512個字節(jié)

          MMC_PORT =MMC_CS_PIN; //MMC_CS_PIN=1; //set MMC_Chip_Select to high
          return(0); //All commands have been taken.
          }
          //****************************************************************
          //從SD卡讀一個扇區(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; i512; i++)
          {
          BUFFER[i]=Read_Byte_SPI();
          }
          Read_Byte_SPI();//CRC - Byte
          Read_Byte_SPI();//CRC - Byte
          reading=0;
          MMC_PORT =MMC_CS_PIN; //關閉SD卡
          return(temp);
          }



          關鍵詞: AVR SD卡接口

          評論


          相關推薦

          技術專區(qū)

          關閉