- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
HCS12X单片机的SD卡FAT文件系统读写设计
3.2 HCSl2XSPl模块初始化
MC9S12XSl28MAA单片机包含2个串行外设接口SPI,可以很方便地实现对Micro SD卡接口的数据传输。为了配置时钟和数据长度,需要对SPI控制寄存器(SPCRl和SPICR2)、SPI波特率寄存器SPIBR和SPI数据寄存器SPIDR进行设置:使能SPI模块,将SPICRl中的MSTR位置1使单片机工作在主机模式,产生串行时钟来同步主从双方的移位寄存器,配置SPI时钟极性位与SPI时钟相位控制位,使能从机输出选择;初始化SPI波特率寄存器。
3.3 SD卡初始化
SD卡初始数据传输需工作在低于400 kb/s的频率,因此配置SPI波特率寄存器,以工作在低速模式下。片选信号后应延时至少74个时钟周期。SD卡默认缺省使用SD总线传输协议,主机需要发出命令CMDO(CMD_GO_IDLE_STATE)才能使SD卡工作在SPI传输模式下,当单片机返回0x 01时说明已经进入了IDLE状态。此时应循环发送CMD55+ACMD41以确认是否为SD卡,如果回应超时则发送CMDl(CMD_SEND_OP_COND)以确认是否为MMC卡。经实验发现,Kingston公司的Micro SD卡使用CMD55+ACMD41或者CMDl都可以进行激活。激活SD卡的SPI模式后SD卡进入准备状态,此时发送CMDl6(CMD_SET_BLOCKLEN)设置SD卡的读写块大小,然后重新配置SPI波特率寄存器SPIBR使单片机SPI工作在高速频率下,延时8个时钟周期后返回,完成SD卡初始化。图2为SD卡SPI高速模式初始化流程。
3.4读写单块数据
SD卡单块数据的读取是先通过单片机发送CMDl7(CMD_READ_SINGLE_BLOCK)命令,以SD卡指定数据块起始位地址作为参数,如果读取成功SD卡会返回1个R1命令作为响应。然后发送1个起始数据命令,接着发送单块字节数量的数据并接收SPI数据寄存器SPIDR中的数据,最后是2字节CRC校验。
SD卡单块数据的写入与读取相似,通过单片机发送CMD24(CMD_WRITE_SINGLE_BLOCK)命令,以SD卡指定数据块起始位地址作为参数,如果读取成功SD卡会返回1个R1命令作为响应。然后发送1个起始数据命令,接着发送单块字节数量的需写入数据,最后是2字节CRC校验。
3.5 FAT文件系统信息读取
为了SD卡文件数据管理方便并且与PC机之间兼容得更好,同时考虑到SD卡自身容量的限制,选择FATl6文件系统对SD卡信息进行管理。
为了方便管理和扩展性开发,对SD卡进行了分区。模拟硬盘模式创建出了MBR区(主引导扇区)与DBR区(操作系统引导记录区),在向下兼容的同时实现了对分区过的SD卡FAT文件系统的读写。
SD卡数据可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区。MBR区是主引导区,位于整个SD卡的第1单块上。在总共512字节的主引导扇区中,MBR只占用了其中的446个字节,另外的64个字节是DPT(Disk Partition Table,分区表),最后2个字节"55 AA"是分区的结束标志。这整体构成了SD卡的主引导扇区。DBR是操作系统引导记录区,是操作系统可以直接访问的第1个扇区,它包括1个引导程序和1个被称为BPB(Bios Parameter Block)的本分区参数记录表。BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT、个数,分配单元的大小等重要参数。
FAT文件系统的分区有如下几个部分:保留区,存放FAT文件系统的重要参数和引导程序;FAT表,记录簇使用情况;根目录区,记录根目录信息。
本文中单片机对FAT系统的读写利用的是MBR区上的DPT分区表信息,用于找到FAT分区。然后通过FAT分区的DBR区上的BPB分区参数记录表信息找到根目录,读取根目录信息并通过FAT表中的文件簇信息实现文件的管理。
研究中为方便代码的移植和优化,在FAT初始化的时候将读写扇区函数指针指向Micro SD卡的读写函数,并使用了2个结构体来存储SD卡的MBR与DBR信息。但鉴于单片机自身的内存容量,又建立了1个SimpleFat.c程序文件,只存储程序所需的几个地址常量:StartMbrAddress(MBR起始地址)、StartDbrAddress(DBR起始地址)、StartFatlAddress(FATl表起始地址)以及SeePerClu(簇扇区数量),大大减小了单片机内存的开销。
作者:时 尧 天津大学 来源:电子设计工程
闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗霉閿濆牊顏犵紒鈧繝鍌楁斀闁绘ɑ褰冮埀顒€顕槐鎾愁潩鏉堛劌鏋戦梺鍝勫暙閻楀嫰鍩€椤戣法绐旂€殿喕绮欓、姗€鎮欓懠鍨涘亾閸喒鏀介柨娑樺娴犙呯磼椤曞懎鐏︾€殿噮鍋婇幃鈺冪磼濡攱瀚奸梻鍌欑贰閸嬪棝宕戝☉銏″殣妞ゆ牗绋掑▍鐘炽亜閺傛娼熷ù婊勭矋閵囧嫰骞樼捄杞版勃闂佺ǹ顑冮崕鎶藉焵椤掑喚娼愭繛鍙夌矒楠炲﹪骞樼拠鑼弨婵犮垼娉涜墝闁哄閰i弻鐔兼焽閿曗偓閺嬫稓绱掗幓鎺撳仴婵﹤顭峰畷鎺戔枎閹存繂顬夐梻浣筋嚃閸犳牠鎮ラ悡搴f殾闁圭増婢橀崡鎶芥煟韫囨凹鍤欑紓宥咃躬楠炲啫饪伴崼鐔风檮婵犮垼娉涢惌鍫ュ船閻㈠憡鈷戦悹鍥ㄥ絻閸よ京绱撳鍛棦鐎规洑鍗冲浠嬵敃閵堝嫮鐟濋梻浣告惈鐞氼偊宕曢弻銉﹀亗婵炲棗绶疯ぐ鎺撳亗閹艰揪绲鹃幉鐓庘攽閻愭潙姣嗛柛銉e妿閸橀潧顪冮妶鍡橆梿鐎规洜鏁哥划锝夊籍閳ь剟骞堥妸锔剧瘈闁告侗鍣禒鈺呮⒑閸涘﹦澧柣妤冨Т椤曪綁骞橀钘変簻闂佸憡绺块崕杈╁緤閸喒鏀介柨娑樺娴滃ジ鏌涙繝鍐ㄧ伌鐎规洜顢婇妵鎰板箳閹惧瓨鐝栨俊鐐€曠换鎰版偋閸曨垰鐒垫い鎴f硶椤︼箓鏌嶇拠鏌ュ弰妤犵偞锚閻g兘宕堕懜鏁屟冣攽閿涘嫬浜奸柛濠冪墵閹兾旈崘銊︾€抽悗骞垮劚椤︿即宕愰崹顐犱簻闁瑰搫妫楁禍楣冩⒑鐎圭媭娼愰柛銊ユ健楠炲啫鈻庨幘宕囩厬婵犮垼鍩栬摫闁挎稐绶氬缁樻媴鐟欏嫬浠╅梺鍛婃煥闁帮絽鐣锋导鏉戝唨鐟滄粓宕甸弴鐐╂斀闁绘ê纾。鏌ユ煛閸涱喗鍊愰柡灞诲姂閹倝宕掑☉姗嗕紦 | More...
闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗霉閿濆牊顏犵紒鈧繝鍌楁斀闁绘ɑ褰冮埀顒€顕槐鎾愁潩鏉堛劌鏋戦梺鍝勫暙閻楀嫰鍩€椤戣法绐旂€殿喕绮欓、姗€鎮欓懠鍨涘亾閸喒鏀介柨娑樺娴犙呯磼椤曞懎鐏︾€殿噮鍋婇幃鈺冪磼濡攱瀚奸梻鍌欑贰閸嬪棝宕戝☉銏″殣妞ゆ牗绋掑▍鐘炽亜閺傛娼熷ù婊勭矋閵囧嫰骞樼捄杞版勃闂佺ǹ顑冮崕鎶藉焵椤掑喚娼愭繛鍙夌矒楠炲﹪骞樼拠鑼弨婵犮垼娉涜墝闁哄閰i弻鐔兼焽閿曗偓閺嬫稓绱掗幓鎺撳仴婵﹤顭峰畷鎺戔枎閹存繂顬夐梻浣筋嚃閸犳牠鎮ラ悡搴f殾闁圭増婢橀崡鎶芥煟韫囨凹鍤欑紓宥咃躬楠炲啫饪伴崼鐔风檮婵犮垼娉涢惌鍫ュ船閻㈠憡鈷戦悹鍥ㄥ絻閸よ京绱撳鍛棦鐎规洑鍗冲浠嬵敃閵堝嫮鐟濋梻浣告惈鐞氼偊宕曢弻銉﹀亗婵炲棗绶疯ぐ鎺撳亗閹艰揪绲鹃幉鐓庘攽閻愭潙姣嗛柛銉e妿閸橀潧顪冮妶鍡橆梿鐎规洜鏁哥划锝夊籍閳ь剟骞堥妸锔剧瘈闁告侗鍣禒鈺呮⒑閸涘﹦澧柣妤冨Т椤曪綁骞橀钘変簻闂佸憡绺块崕杈╁緤閸喒鏀介柨娑樺娴滃ジ鏌涙繝鍐ㄧ伌鐎规洜顢婇妵鎰板箳閹惧瓨鐝栨俊鐐€曠换鎰版偋閸曨垰鐒垫い鎴f硶椤︼箓鏌嶇拠鏌ュ弰妤犵偞锚閻g兘宕堕懜鏁屟冣攽閿涘嫬浜奸柛濠冪墵楠炴劖銈i崘銊х崶闁瑰吋鐣崝宥夊磻閻旇褰掓偂鎼达絾鎲奸梺鎶芥敱閸ㄥ潡寮诲☉妯锋婵鐗婇弫楣冩煟鎼达紕浠涢柣鐔叉櫊瀵顓奸崼顐n€囬梻浣告啞閹搁箖宕版惔顭戞晪闁挎繂妫涚弧鈧┑顔斤供閸樿棄鈻嶉姀銈嗏拺閻犳亽鍔屽▍鎰版煙閸戙倖瀚�
闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗銆掑锝呬壕濡ょ姷鍋涢ˇ鐢稿极閹剧粯鍋愰柛鎰紦缂冩洟姊绘担鍛婃儓婵炲眰鍔嶉幈銊︻槹鎼达絿鐒兼繝鐢靛Т閸婄敻寮ㄦ禒瀣厽婵☆垰鎼痪褔鏌熼崗鐓庡闁哄本绋撴禒锔炬嫚閹绘帩娼庨梻浣告惈閺堫剙煤閻旈鏆﹂柣鎾崇岸閺€浠嬫煙闁箑甯ㄧ憸鏂款潖閾忓湱鐭欐繛鍡樺劤閸擃參姊洪崨濠冪叆闁活厼鍊搁敃銏$瑹閳ь剙顫忓ú顏勭閹艰揪绲块悾鐢告⒑閻熸澘鏆遍梺甯到椤曪綁骞庨懞銉ヤ簻闂佺ǹ绻楅崑鎰板储娴犲鈷戦柛婵嗗閳ь剙婀遍埀顒傜懗閸パ冩優闂佹悶鍎洪崜姘舵偂濞嗘劑浜滈柡鍐e亾妞ゆ垶鐟ュ玻鍧楀箛閻楀牏鍘甸悗鐟板婢ф宕甸崶顒佺厵妞ゆ梹鍎抽崢瀛橆殽閻愯尙效妞ゃ垺宀稿畷銊╊敊瑜忛崑娑㈠煘閹达附鏅柛鏇ㄥ亗閺夘參姊虹粙鍖℃敾闁绘濞€閻涱噣骞囬鐘电槇濠殿喗锕╅崜娑㈡偩濞差亝鈷戠紒瀣濠€鐗堟叏濡ǹ濮傜€殿喗濞婇弫鍐磼濞戞艾寮伴梻濠庡亜濞诧箓宕欓悷鎼細闁规壆澧楅悡鏇㈢叓閸ャ劍鈷掗柣顓熷浮閺岋紕浠﹂崜褉妲堝Δ妤婁簷閸楁娊宕洪埀顒併亜閹烘垵鈧鎯岄崱妞尖偓鎺戭潩閿濆懍澹曢柣搴㈩問閸n噣宕戞繝鍥╁祦閹兼番鍔嶉崵宥夋煏婢诡垰鍟粻娲⒒閸屾瑨鍏岀紒顕呭灦閺佸鎮楀▓鍨灈闁绘牕銈搁悰顕€寮介鐐电杸濡炪倖甯掗ˇ閬嶅船閻㈠憡鍋℃繝濠傚暟閻忛亶鏌涢幒鎾崇瑨闁宠閰i獮姗€鎼归锛版岸姊绘笟鈧ḿ褏鎹㈤崼銉ョ9闁哄稁鍘奸悿楣冩煙闂傚鍔嶉柣鎾卞劦閺岋綁寮撮悙娴嬪亾閸︻厸鍋撳鐐
闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗霉閿濆牊顏犵紒鈧繝鍌楁斀闁绘ɑ褰冮埀顒€顕槐鎾愁潩鏉堛劌鏋戦梺鍝勫暙閻楀嫰鍩€椤戣法绐旂€殿喕绮欓、姗€鎮欓懠鍨涘亾閸喒鏀介柨娑樺娴犙呯磼椤曞懎鐏︾€殿噮鍋婇幃鈺冪磼濡攱瀚奸梻鍌欑贰閸嬪棝宕戝☉銏″殣妞ゆ牗绋掑▍鐘炽亜閺傛娼熷ù婊勭矋閵囧嫰骞樼捄杞版勃闂佺ǹ顑冮崕鎶藉焵椤掑喚娼愭繛鍙夌矒楠炲﹪骞樼拠鑼弨婵犮垼娉涜墝闁哄閰i弻鐔兼焽閿曗偓閺嬫稓绱掗幓鎺撳仴婵﹤顭峰畷鎺戔枎閹存繂顬夐梻浣筋嚃閸犳牠鎮ラ悡搴f殾闁圭増婢橀崡鎶芥煟韫囨凹鍤欑紓宥咃躬楠炲啫饪伴崼鐔风檮婵犮垼娉涢惌鍫ュ船閻㈠憡鈷戦悹鍥ㄥ絻閸よ京绱撳鍛棦鐎规洑鍗冲浠嬵敃閵堝嫮鐟濋梻浣告惈鐞氼偊宕曢弻銉﹀亗婵炲棗绶疯ぐ鎺撳亗閹艰揪绲鹃幉鐓庘攽閻愭潙姣嗛柛銉e妿閸橀潧顪冮妶鍡橆梿鐎规洜鏁哥划锝夊籍閳ь剟骞堥妸锔剧瘈闁告侗鍣禒鈺呮⒑閸涘﹦澧柣妤冨Т椤曪綁骞橀钘変簻闂佸憡绺块崕杈╁緤閸喒鏀介柨娑樺娴滃ジ鏌涙繝鍐ㄧ伌鐎规洜顢婇妵鎰板箳閹惧瓨鐝栨俊鐐€曠换鎰版偋閸曨垰鐒垫い鎴f硶椤︼箓鏌嶇拠鏌ュ弰妤犵偞锚閻g兘宕堕懜鏁屟冣攽閿涘嫬浜奸柛濠冪墱閺侇噣骞掑Δ鈧壕褰掓煕椤垵娅橀柣搴ゅ煐閵囧嫰寮捄銊︾檨闂佽 鍋撳ù鐘差儏缁犳娊鏌熼幆鐗堫棄缁炬儳缍婇弻锟犲炊閳轰絿娑㈡煕鐎n偅灏い顐g箞椤㈡鍩€椤掆偓鍗卞┑鐘崇閹虫岸鏌i幇顔煎妺闁绘挶鍎甸弻锝夊即閻愭祴鍋撻崷顓涘亾濮樼偓瀚�
闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掑鏅悷婊冪箻楠炴垿濮€閵堝懐鐤€濡炪倖妫佸Λ鍕償婵犲洦鈷戠憸鐗堝笒娴滀即鏌涢悩鍐叉诞鐎规洘鍨块獮姗€骞囨担鐟板厞婵$偑鍊栭崝鎴﹀垂閸︻厾鐭堟い鏇楀亾婵﹥妞藉Λ鍐ㄢ槈濞嗘ɑ顥i梻浣呵归敃銈夆€﹂悜鐣屽祦闁硅揪绠戠粈瀣亜閹烘垵鈧骞婂┑鍡╂富闁靛牆妫涙晶顒傜棯閺夎法孝闁宠绉电换婵嬪炊閵娿垺瀚藉┑鐐存尰閸╁啴宕戦幘瀵哥濞达絽鍟垮ú锕傚疾椤掑嫮鍙撻柛銉e妿閳藉鏌i幒鎴犱粵闁靛洤瀚伴獮鎺楀箣濠垫劒鎮i梻浣芥閸熶即宕伴弽顓炶摕闁哄洢鍨归柋鍥ㄧ節閸偄濮堥弫鍫ユ⒒娴e懙褰掝敄閸愵喖绀夌€广儱顦闂佸憡娲﹂崹浼村礃閳ь剟姊洪棃娑掑悍濠碘€虫搐閳绘捇濡堕崱娆戠槇闂佸啿鐨濋崑鎾绘煕閺囥劌澧版い锔垮嵆濮婃椽宕崟顓犲姽缂傚倸绉崇欢姘舵偘椤斿槈鐔煎礂閻撳孩鐎梻浣告啞濞诧箓宕㈣ぐ鎺戠劦妞ゆ巻鍋撻柨鏇ㄤ簻椤繐煤椤忓懎浠梺鍝勵槹鐎笛傜昂濠碉紕鍋戦崐鏍垂閻㈡潌鍥偨缁嬭銉ッ归敐鍛棌婵炵鍔戦弻宥堫檨闁告挾鍠栭悰顕€宕橀妸銏犵墯闂佸壊鍋呯换鍌炴嚀閸喒鏀芥い鏃傜摂濞堟梹淇婇锝庢疁鐎殿噮鍋夐妵鎰板箳閹绢垱瀚藉┑鐐舵彧缂嶁偓婵☆偄瀚板畷銉ㄣ亹閹烘挾鍘遍梺缁樓圭亸娆掑€存繝鐢靛仜濡酣宕归懞銉ょ箚闁兼悂娼х欢鐐测攽閻樻彃顏撮柛鐐垫暬濮婄粯鎷呴懞銉с€婇梺闈╃秶缁犳捇鐛箛娑欐櫢闁跨噦鎷�