新聞中心

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

        AVR的SD卡接口程序

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

        程序/*****************************************************/
        /* 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]; //扇區緩沖區
        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); //設置一次讀寫BLOCK的長度為512個字節

        MMC_PORT =MMC_CS_PIN; //MMC_CS_PIN=1; //set MMC_Chip_Select to high
        return(0); //All commands have been taken.
        }
        //****************************************************************
        //從SD卡讀一個扇區 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)
        {;} //直到讀取到了數據的開始頭0XFE,才繼續
        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卡接口

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 阜南县| 眉山市| 大化| 得荣县| 陵川县| 丰台区| 东至县| 金溪县| 交口县| 东海县| 环江| 息烽县| 新昌县| 喀什市| 桦川县| 格尔木市| 许昌县| 山东| 正阳县| 湟中县| 喀喇沁旗| 揭阳市| 定西市| 孝义市| 高安市| 佛冈县| 灌阳县| 尖扎县| 清涧县| 新营市| 巴林右旗| 广灵县| 延吉市| 平顺县| 康保县| 林周县| 扶沟县| 海城市| 高陵县| 金门县| 家居|