在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32 SD卡_沒有加文件系統(tǒng)

            STM32 SD卡_沒有加文件系統(tǒng)

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

            下圖是萬利板子的SD卡部分

            本文引用地址:http://www.biyoush.com/article/201611/316408.htm

            其中SD_PWR連接到了 PD10 通過一個控制


            P-Channel 2.5-V (G-S) MOSFET 控制SD卡的電源

            =====================================================================

            SPI模式 讀寫SD卡

            SD卡初始化過程:

            1. 初始化STM32的SPI接口 使用低速模式
            2. 延時至少74clock
            3. 發(fā)送CMD0,需要返回0x01,進入Idle狀態(tài)
            4. 循環(huán)發(fā)送CMD55+ACMD41,直到返回0x00,進入Ready狀態(tài)
            5. 設置讀寫block大小為512byte
            5. 把STM32的SPI設置為高速模式



            讀一個block塊的過程

            1. 發(fā)送CMD17(單塊)或CMD18(多塊)讀命令,返回0x00
            2. 接收數(shù)據(jù)開始令牌0xfe + 正式數(shù)據(jù)512Bytes + CRC 校驗2Bytes

            寫一個block塊的過程

            1. 發(fā)送CMD24(單塊)或CMD25(多塊)寫命令,返回0x00
            2. 發(fā)送數(shù)據(jù)開始令牌0xfe + 正式數(shù)據(jù)512Bytes + CRC校驗2Bytes

            /*******************************************************************************
            * Function Name : SD_MMC_SPI_Init
            * Description : SD_MMC_SPI_Init
            * Input : None
            * Output : None
            * Return : zero init success, non-zero init error
            *******************************************************************************/
            u8 SD_MMC_SPI_Init(void)
            {
            GPIO_InitTypeDef GPIO_InitStructure;

            /* Enable SPI1 and GPIO clocks */
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA |
            RCC_APB2Periph_SD_MMC_SPI_CS, ENABLE);

            /* Configure SPI1 pins: SCK, MISO and MOSI */
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_Init(GPIOA, &GPIO_InitStructure);

            /* Configure SD_MMC_SPI_CS */
            GPIO_InitStructure.GPIO_Pin = SD_MMC_SPI_CS_Pin_CS;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
            GPIO_Init(SD_MMC_SPI_CS, &GPIO_InitStructure);

            //////////////////////////////////////////////////////////////////////////////
            /* initialize SPI with lowest frequency */
            SD_MMC_Low_Speed();

            /* card needs 74 cycles minimum to start up */
            for(u8 i = 0; i < 10; ++i)
            {
            /* wait 8 clock cycles */
            SD_MMC_ReadWrite_Byte(0x00);
            }

            /* address card */
            SD_MMC_SPI_SELECT();

            /* reset card */
            u8 response;
            for(u16 i = 0; ; ++i)
            {
            response = SD_MMC_Send_Command(CMD_GO_IDLE_STATE , 0 );
            if( response == 0x01 )
            break;

            if(i == 0x1ff)
            {
            SD_MMC_SPI_DESELECT();
            return 1;
            }
            }

            /* wait for card to get ready */
            for(u16 i = 0; ; ++i)
            {
            response = SD_MMC_Send_Command(CMD_SEND_OP_COND, 0);
            if(!(response & (1 << R1_IDLE_STATE)))
            break;

            if(i == 0x7fff)
            {
            SD_MMC_SPI_DESELECT();
            return 1;
            }
            }

            /* set block size to 512 bytes */
            if(SD_MMC_Send_Command(CMD_SET_BLOCKLEN, 512))
            {
            SD_MMC_SPI_DESELECT();
            return 1;
            }

            /* deaddress card */
            SD_MMC_SPI_DESELECT();

            /* switch to highest SPI frequency possible */
            SD_MMC_High_Speed();

            return 0;
            //////////////////////////////////////////////////////////////////////////////
            }

            /*******************************************************************************
            * Function Name : SD_MMC_Read_Single_Block
            * Description : SD_MMC_Read_Single_Block
            * Input : sector number and buffer data point
            * Output : None
            * Return : zero success, non-zero error
            *******************************************************************************/
            u8 SD_MMC_Read_Single_Block(u32 sector, u8* buffer)
            {
            u8 Response;
            u16 i;
            u16 Retry = 0;

            //讀命令 send read command
            Response = SD_MMC_Send_Command(CMD_READ_SINGLE_BLOCK, sector<<9);

            if(Response != 0x00)
            return Response;

            SD_MMC_SPI_SELECT();

            // start byte 0xfe
            while(SD_MMC_ReadWrite_Byte(0xff) != 0xfe)
            {
            if(++Retry > 0xfffe)
            {
            SD_MMC_SPI_DESELECT();
            return 1; //timeout
            }
            }

            for(i = 0; i < 512; ++i)
            {
            //讀512個數(shù)據(jù)
            *buffer++ = SD_MMC_ReadWrite_Byte(0xff);
            }

            SD_MMC_ReadWrite_Byte(0xff); //偽crc
            SD_MMC_ReadWrite_Byte(0xff); //偽crc

            SD_MMC_SPI_DESELECT();
            SD_MMC_ReadWrite_Byte(0xff); // extra 8 CLK

            return 0;
            }


            /*******************************************************************************
            * Function Name : SD_MMC_Write_Single_Block
            * Description : SD_MMC_Write_Single_Block
            * Input : sector number and buffer data point
            * Output : None
            * Return : zero success, non-zero error.
            *******************************************************************************/
            u8 SD_MMC_Write_Single_Block(u32 sector, u8* buffer)
            {
            u8 Response;
            u16 i;
            u16 retry=0;

            //寫命令 send write command
            Response = SD_MMC_Send_Command(CMD_WRITE_SINGLE_BLOCK, sector<<9);
            if(Response != 0x00)
            return Response;

            SD_MMC_SPI_SELECT();

            SD_MMC_ReadWrite_Byte(0xff);
            SD_MMC_ReadWrite_Byte(0xff);
            SD_MMC_ReadWrite_Byte(0xff);

            //發(fā)開始符 start byte 0xfe
            SD_MMC_ReadWrite_Byte(0xfe);

            //送512字節(jié)數(shù)據(jù) send 512 bytes data
            for(i=0; i<512; i++)
            {
            SD_MMC_ReadWrite_Byte(*buffer++);
            }

            SD_MMC_ReadWrite_Byte(0xff); //dummy crc
            SD_MMC_ReadWrite_Byte(0xff); //dummy crc

            Response = SD_MMC_ReadWrite_Byte(0xff);

            //等待是否成功 judge if it successful
            if( (Response&0x1f) != 0x05)
            {
            SD_MMC_SPI_DESELECT();
            return Response;
            }
            //等待操作完 wait no busy
            while(SD_MMC_ReadWrite_Byte(0xff) != 0x00)
            {
            if(retry++ > 0xfffe)
            {
            SD_MMC_SPI_DESELECT();
            return 1;
            }
            }
            SD_MMC_SPI_DESELECT();
            SD_MMC_ReadWrite_Byte(0xff);// extra 8 CLK

            return 0;
            }

            if( SD_MMC_SPI_Init() ==1)
            printf(" _SD_MMC Initialization ERRORrn");
            else
            {
            printf(" _SD_MMC Initialization OKrn");
            //memset(buffer,0,512);
            //讀取一個扇區(qū)的內容 這里讀的是0扇區(qū)
            SD_MMC_Read_Single_Block( 0 , buffer );
            Uart1_PutString( buffer , 512 );
            }



            關鍵詞: STM32SD卡文件系

            評論


            技術專區(qū)

            關閉