日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]SD卡是嵌入式設(shè)備中很常用的一種存儲(chǔ)設(shè)備,體積小,容量大,通訊簡(jiǎn)單,電路簡(jiǎn)單所以受到很多設(shè)備廠商的歡迎,主要用來(lái)記錄設(shè)備運(yùn)行過(guò)程中的各種信息,以及程序的各種配置信息,很是方便,有這樣幾點(diǎn)是需要知道的SD卡是基于fl

SD卡是嵌入式設(shè)備中很常用的一種存儲(chǔ)設(shè)備,體積小,容量大,通訊簡(jiǎn)單,電路簡(jiǎn)單所以受到很多設(shè)備廠商的歡迎,主要用來(lái)記錄設(shè)備運(yùn)行過(guò)程中的各種信息,以及程序的各種配置信息,很是方便,有這樣幾點(diǎn)是需要知道的

SD卡是基于flash的存儲(chǔ)卡。

SD卡和MMC卡的區(qū)別在于初始化過(guò)程不同。SD卡并不是我們通常意義上的手機(jī)擴(kuò)展卡,那種卡叫做TF卡,但是通訊以及驅(qū)動(dòng)模式是類(lèi)似的.

SD卡的通信協(xié)議包括SD和SPI兩類(lèi),SD卡上電之后默認(rèn)處于SD狀態(tài)。

SD卡使用卡內(nèi)智能控制模塊進(jìn)行FLASH操作控制,包括協(xié)議、安全算法、

數(shù)據(jù)存取、ECC算法、缺陷處理和分析、電源管理、時(shí)鐘管理。這些都不需要用戶(hù)關(guān)系,這是SD卡廠商做的事情

驅(qū)動(dòng)SD卡主要要實(shí)現(xiàn)讀扇區(qū),寫(xiě)扇區(qū),初始化,獲取SD卡相關(guān)配置信息這幾個(gè)就可以了,

另外.SD卡本身只是一種數(shù)據(jù)介質(zhì),它不含有文件系統(tǒng),文件系統(tǒng)是一種文件的組織格式,是獨(dú)立于存儲(chǔ)介質(zhì)的一種規(guī)范


標(biāo)準(zhǔn)SD卡引腳序列


SD卡引腳功能表


TF卡引腳排序


TF卡引腳功能表

由此可見(jiàn),TF卡比SD卡少了一個(gè)VSS引腳,也就是少了一個(gè)供電引腳

另外電路設(shè)計(jì)時(shí)若SD卡使用SPI模式,那么不用的幾根數(shù)據(jù)線應(yīng)加上上拉電阻,否者會(huì)因?yàn)檫@幾根數(shù)據(jù)線的電流震蕩引起電流損耗,造成電路上的不穩(wěn)定

SD卡電路SPI驅(qū)動(dòng)模式

SD卡內(nèi)部有五個(gè)我們可以讀取的寄存器,分別如下

要讀取這些信息就需要與卡通訊,SD通訊是用命令+數(shù)據(jù)的形式進(jìn)行的,命令格式如下


也就是說(shuō),一次SD卡命令發(fā)送一共要發(fā)送6個(gè)字節(jié),對(duì)于SPI通訊而言,就是SPI總線上傳送六個(gè)字節(jié)

字節(jié)1的最高2位固定為01,低6位為命令號(hào)(比如CMD16,

為10000即16進(jìn)制的0X10,完整的CMD16,第一個(gè)字節(jié)為01010000,即0X10+0X40)。

字節(jié)2~5為命令參數(shù),有些命令是沒(méi)有參數(shù)的。對(duì)于沒(méi)有參數(shù)的命令默認(rèn)發(fā)送0即可

字節(jié)6的高七位為CRC值,最低位恒定為1,crc計(jì)算遵循以下規(guī)律


GX為生成多項(xiàng)式,具體計(jì)算方法請(qǐng)查看CRC計(jì)算相關(guān),不過(guò)有一點(diǎn)好處就是,在SPI驅(qū)動(dòng)模式下,不需要CRC校驗(yàn)(默認(rèn)SD卡在SPI模式下不開(kāi)啟CRC校驗(yàn),在SD模式下默認(rèn)開(kāi)始CRC校驗(yàn)),所以我們只需要對(duì)CMD0進(jìn)行CRC就可以了,后面的CRC都可以不管(因?yàn)樵贑MD0之前是SD模式,所以第一個(gè)命令需要,切換之后就不用了),而CMD0的CRC為0x95(加上了之后的一位1)

注:SPI模式下打開(kāi)crc校驗(yàn)需要用到CMD59的保留命令,請(qǐng)查閱相關(guān)資料

SD卡的命令表如下所示(以下僅寫(xiě)出SPI模式的CMD)


CMD0復(fù)位SD卡,重置所有卡到Idle狀態(tài),參數(shù)為0

CMD1設(shè)置SD卡到ACTIVATE模式,也就是推出IDLE模式


CMD8發(fā)送接口狀態(tài)命令

CMD9讀取CSD寄存器

CMD10讀取CID寄存器


CMD12在多塊讀取的時(shí)候請(qǐng)求停止讀取

CMD13讀取SD卡狀態(tài)寄存器


CMD16設(shè)置單個(gè)扇區(qū)的大小一般都設(shè)置為512字節(jié)一個(gè)扇區(qū)

CMD17讀取扇區(qū)命令

CMD18讀取多個(gè)扇區(qū)知道發(fā)送停止命令


CMD24寫(xiě)扇區(qū)命令

CMD25寫(xiě)多個(gè)扇區(qū)命令


CMD27編輯CSD位

CMD28設(shè)置地址組保護(hù)位。寫(xiě)保護(hù)由卡配置數(shù)據(jù)的WP_GRP_SIZE指定

CMD29清除保護(hù)位


CMD30要求卡發(fā)送寫(xiě)保護(hù)狀態(tài),參數(shù)中有要查詢(xún)的地址


CMD32設(shè)置要擦除的第一個(gè)寫(xiě)數(shù)據(jù)塊地址

CMD33設(shè)置要擦除的最后一個(gè)寫(xiě)數(shù)據(jù)塊地址


CMD38擦除所有選中的塊


CMD42設(shè)置SD卡的解鎖或者上鎖

CMD55告訴SD卡下一個(gè)命令式卡應(yīng)用命令,不是標(biāo)準(zhǔn)命令


CMD56應(yīng)用相關(guān)的數(shù)據(jù)塊讀寫(xiě)命令


CMD58讀取OCR信息

CMD59設(shè)置crc校驗(yàn)的使能與關(guān)閉(前面說(shuō)到過(guò))


ACMD13發(fā)送SD卡狀態(tài)


ACMD18保留作為SD安全應(yīng)用(也就是這命令沒(méi)用)


ACMD22發(fā)送寫(xiě)數(shù)據(jù)塊的數(shù)目。響應(yīng)為32位+CRC

ACMD23設(shè)置寫(xiě)前預(yù)擦除的數(shù)據(jù)塊數(shù)目(用來(lái)加速多數(shù)據(jù)塊寫(xiě)操作)?!?”=默認(rèn)(一個(gè)塊)(1)

不管是否使用ACMD23,在多數(shù)據(jù)塊寫(xiě)操作中都需要STOP_TRAN(CMD12)命令


ACMD25 26 38保留作為安全應(yīng)用


ACMD41要求訪問(wèn)的卡發(fā)送它的操作條件寄存器(OCR)內(nèi)容

ACMD42連接[1]/斷開(kāi)[0]卡上CD/DAT3(pin 1]的50K歐姆上拉電阻。上拉電阻可用來(lái)檢測(cè)卡

ACMD43-49保留作為安全應(yīng)用

ACMD51讀取SD配置寄存器SCR

ACMD命令,全稱(chēng)應(yīng)該是application CMD,所以使用ACMD都需要在發(fā)送CMD55之后

發(fā)出命令后會(huì)收到相應(yīng)的響應(yīng),所有響應(yīng)通過(guò)CMD線傳輸,響應(yīng)以MSB開(kāi)始,不同類(lèi)型的響應(yīng)長(zhǎng)度根據(jù)類(lèi)型不同而不同。

響應(yīng)以起始位開(kāi)始(通常為“0”),接著這是傳輸方向的位(卡為0)。除了R3外其他

響應(yīng)都有CRC。每個(gè)響應(yīng)都以結(jié)束位(通常為“1”)結(jié)束。,SD卡響應(yīng)格式有多種

1.R1響應(yīng)



2.R1b響應(yīng)


多了一個(gè)忙數(shù)據(jù)

3.R2響應(yīng)


4.R3響應(yīng)(針對(duì)于read ocr的響應(yīng)CMD58)


5.響應(yīng)R4和R5都是正對(duì)于SD mode的響應(yīng)

6.針對(duì)CMD8命令的響應(yīng)R7

SD卡的初始化以及識(shí)別過(guò)程(為了方便起見(jiàn),我們只檢測(cè)響應(yīng)的R1狀態(tài))

1.初始化與SD卡連接的硬件條件(MCU的SPI配置,IO口配置);

2.上電延時(shí)(>74個(gè)CLK)(為了讓卡正常啟動(dòng))

3.復(fù)位卡(CMD0),進(jìn)入IDLE狀態(tài),檢測(cè)R1的最低位,是否為閑置狀態(tài)

4.發(fā)送CMD8,檢查是否支持2.0協(xié)議,因?yàn)檫@個(gè)命令是在2.0的協(xié)議里面才添加的

5.根據(jù)不同協(xié)議檢查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等);

6.取消片選,發(fā)多8個(gè)CLK,結(jié)束初始化

具體請(qǐng)查看下圖


以下是網(wǎng)絡(luò)上找到的一份經(jīng)我修改之后的SD卡驅(qū)動(dòng),不完全符合SD卡標(biāo)準(zhǔn)驅(qū)動(dòng),但是我用著一直還蠻正常,大家有興趣可以看看改改

Spisd.c

#include"spisd.h"

//預(yù)定義SD卡類(lèi)型

u8SD_Type=0;//SD卡的類(lèi)型

//這部分應(yīng)根據(jù)具體的連線來(lái)修改!

#defineSD_CSPAout(4)//SD卡片選引腳

//data:要寫(xiě)入的數(shù)據(jù)

//返回值:讀到的數(shù)據(jù)

staticu8SdSpiReadWriteByte(u8data)

{

returnSpi1ReadWriteByte(data);

}

//SD卡初始化的時(shí)候,需要低速

staticvoidSdSpiSpeedLow(void)

{

Spi1SetSpeed(SPI_SPEED_256);//設(shè)置到低速模式用于初始化,最高spi速度為400k

}

//SD卡正常工作的時(shí)候,可以高速了

staticvoidSdSpiSpeedHigh(void)

{

Spi1SetSpeed(SPI_SPEED_4);//設(shè)置到高速模式初始化完成之后進(jìn)行,最高可到25M,不過(guò)一般不用

}

staticvoidSdIOInit(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化A4

SD_CS=1;

Spi1Init();//初始化SPI接口

SdSpiSpeedLow();//初始化設(shè)置為低速

}

//等待卡準(zhǔn)備好

//返回值:0,準(zhǔn)備好了;其他,錯(cuò)誤代碼

staticu8SdWaitReady(void)

{

u32t=0;

do

{

if(SdSpiReadWriteByte(0XFF)==0XFF)return0;//OK

t++;

}while(t<0XFFFFFF);//等待

return1;

}

//取消選擇,釋放SPI總線

voidSD_DisSelect(void)

{

SD_CS=1;

SdSpiReadWriteByte(0xff);//提供額外的8個(gè)時(shí)鐘

}

//選擇sd卡,并且等待卡準(zhǔn)備OK

//返回值:0,成功;1,失敗;

u8SdSelect(void)

{

SD_CS=0;

if(SdWaitReady()==0)return0;//等待成功

SD_DisSelect();

return 1;//等待失敗

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉