sd卡数据传输协议
sd卡协议

sd卡协议SD(Secure Digital)是一种插入式闪存存储卡,广泛应用于数码相机、手机等电子设备中,用于存储和传输数据。
SD卡协议定义了SD卡的物理接口、命令、数据传输等方面的规范,保证了SD卡与设备之间的正常通信和数据交互。
本文将对SD卡协议进行详细介绍。
首先,SD卡使用SPI(Serial Peripheral Interface)或者SD卡总线进行数据传输。
SPI总线包括时钟线、数据线和控制线,通过与主机设备进行交互来传输数据。
SD卡总线则是一种用于SD卡的专用接口,可以支持更高的数据传输率和更复杂的命令操作。
SD卡协议定义了一系列的命令来控制SD卡的读写操作。
例如,通过发送CMD0命令可以将SD卡设置为待机模式;通过CMD8命令可以获取SD卡的供电电压信息;通过CMD17命令可以读取指定扇区的数据等等。
这些命令通过SPI或SD卡总线发送给SD卡,并通过响应返回相应的状态或数据。
在数据传输方面,SD卡协议定义了多种数据格式和传输方式。
其中包括SDSC(Standard Capacity)和SDHC(High Capacity)两种存储容量类型。
SDSC最大支持2GB的存储容量,采用FAT16文件系统;而SDHC则支持最大32GB的存储容量,采用FAT32文件系统。
同时,SD卡还支持多种传输速率,从低速到高速不等。
除了基本的命令和数据传输,SD卡协议还定义了许多额外的特性和功能。
例如,SD卡可以通过密码进行保护,只有正确的密码才能访问数据;SD卡还支持写保护功能,可以防止数据被误写或删除;SD卡还可以通过CID(Card Identification)或CSD(Card Specific Data)等信息来识别和管理不同的SD卡等。
总之,SD卡协议是一套用于控制SD卡读写操作的规范,包括物理接口、命令、数据传输等方面的定义。
它保证了SD卡与设备之间的正常通信和数据交互,使得SD卡能够在各种电子设备中广泛应用。
sd卡协议书

sd卡协议书SD卡协议书写1000字一、协议目的本协议的目的是为了规范SD卡的使用和管理,确保SD卡的稳定性、安全性和可靠性,提高SD卡的使用效率和数据传输速度,促进SD卡的广泛应用和开发。
二、协议范围本协议适用于所有使用以及管理SD卡的相关机构和个人,包括SD卡生产商、SD卡供应商、SD卡使用者等。
三、基本原则1. 合法合规:所有使用和管理SD卡的行为必须遵守国家相关法律法规和政策规定,不得违反道义和伦理原则;2. 公正公平:SD卡的分配和管理必须公正和公平,不得存在任何不当行为和偏袒现象;3. 安全可靠:SD卡的使用和管理必须确保数据安全和可靠性,不得有任何破坏数据和泄露数据的行为;4. 高效便捷:SD卡的使用和管理应该遵循高效和便捷原则,提高数据传输速度和操作效率;5. 技术先进:SD卡的使用和管理应该采用先进的技术手段,推动SD卡的研发和创新。
四、协议内容1. SD卡标准:所有SD卡的制造和生产必须符合国际标准,包括物理尺寸、电气特性、通信协议等方面;2. SD卡分配:SD卡的分配必须按照需求和使用规模进行合理分配,不得浪费资源和滥用权限;3. SD卡管理:SD卡的管理包括存储空间管理、文件管理和权限管理等方面,需要建立相应的管理机制和流程;4. SD卡使用:SD卡的使用必须符合标准和规范,不得进行非法操作和损害SD卡本身的行为;5. SD卡维护:SD卡的维护包括SD卡的清洁、数据备份、灾备措施和修复等方面,需要建立相应的维护计划和措施;6. SD卡安全:SD卡的安全是重要的,所有SD卡的使用和管理必须加强数据加密、访问控制和防病毒等安全措施;7. SD卡更新:当新的SD卡标准和技术出现时,需要及时更新SD卡的标准和方案,推动SD卡的技术迭代和智能化发展。
五、协议执行1. SD卡制造商、供应商和用户必须严格执行本协议,确保SD卡的使用和管理质量;2. 相关机构和部门应该加强协议的宣传和培训,提高SD卡的使用和管理水平;3. 对于违反本协议的行为,应该进行严肃处理和追责,保护SD卡的合法权益。
SD卡的传输协议和读写程序

Ⳃ1ゴ SD/MMC 䇏 (1)1.1 SD/MMC ⱘ 䚼⠽⧚ (1)1.1.1 SD (2)1.1.2 SPI (3)1.2 䆓䯂SD/MMC ⱘSPI ⹀ӊ⬉䏃䆒䅵 (4)1.2.1 SPI 㒓 (5)1.2.2 կ⬉ (5)1.2.3 Ẕ⌟⬉䏃 (5)1.3 SD/MMC 䇏 ⱘ ӊ㒧 ԧ (5)1.3.1 SD/MMC 䇏 ⱘ ӊ㒘 (5)1.3.2 SD/MMC䇏 ԧḚ (6)1.4 SD/MMC 䇏 ⱘՓ⫼䇈 (6)1.4.1 SD/MMC 䇏 ⱘ⹀ӊ䜡㕂 (6)1.4.2 SD/MMC 䇏 կⱘAPI (9)1.5 SD/MMC 䇏 ⱘ ⫼⼎՟ϔ (11)1.5.1 ⹀ӊ䖲 Ϣ䜡㕂 (11)1.5.2 ⦄ ⊩ (11)1.6 SD/MMC 䇏 ⱘՓ⫼⼎՟Ѡ (18)1.6.1 ⦄ ⊩ (18)1.6.2 ՟ ゟϢ䖤㸠ℹ偸 (20)1.6.3 㗗 (24)1.7 SD/MMC䕃ӊ ⫼ 㒧 (27)1 SD/MMCSD/MMC ϔ⾡ 䞣˄ 䖒4GB˅ǃ Ӌ↨催ǃԧ⿃ ǃ䆓䯂 ㅔ ⱘ DŽSD/MMC 䞣 ⫼Ѣ ⷕⳌ ǃMP3 ǃ ǃ 䞣 䆒 ˈЎ䖭ѯ 䆒 ⱘ 䕑ԧˈ 䖬 Ԣ 㗫ǃ䴲 ǃ 䳔⍜㗫㛑䞣ㄝ⡍⚍DŽSD ϟ MMC˄MutliMediaCard ԧ ˅ ˈ䆓䯂SD ⱘSPI 䆂 䚼 Ҹг䗖⫼ѢMMC DŽSD/MMC 䇏 ZLG ㋏ Ё䯈ӊⱘ䞡㽕 Пϔˈ ⿄ЎZLG/SDDŽ䆹 ϔϾ⫼ 䆓䯂SD/MMC ⱘ䕃ӊ䇏 ˈⳂ ⠜ Ў2.00ˈ ⠜ ϡҙ㛑䇏 SD ˈ䖬 ҹ䇏 MMC ˗ϡҙ㛑 ㋏㒳˄ ㋏㒳˅ЁՓ⫼ˈ䖬 ҹ ㋏㒳ȝC/OS-IIЁՓ⫼DŽ SD/MMC ⱘSPI DŽ ゴЁˈ䰸њ⡍ 䇈 ҹ ˈĀ ā䛑 SD MMC DŽ1.1 SD/MMC ⱘ 䚼⠽⧚SD MMC ⱘ 㾺⚍ 1.1 ⼎DŽ ЁSD ⱘ Ў˖24mm x 32mm x 2.1mm˄ 䗮˅ 24mm x 32mm x 1.4mm˄㭘SD ˅ˈMMC ⱘ Ў24mm x 32mm x 1.4mmDŽ1.1 SD MMC⠽1.2 SD MMC ⼎ ˄Ϟ㾚 ˅㸼1.1ЎSD/MMC 㾺⚍ⱘ ⿄ ⫼ˈ ЁMMC Փ⫼њ1 ~ 7㾺⚍DŽ㸼1.1 SD/MMC ⱘ⛞Ⲭ 䜡SD SPI㛮 ⿄1㉏ 䗄 ⿄㉏ 䗄1 CD/DAT32 I/O/PP3 ⱘẔ⌟/ 㒓[Bit 3]CS I ⠛䗝˄Ԣ⬉ ˅2 CMD PP4 Ҹˋ DI I5 䕧3 V SS1 S ⬉⑤ VSS S ⬉⑤㓁Ϟ㸼SD SPI㛮 ⿄1㉏ 䗄 ⿄㉏ 䗄4 V DD S ⬉⑤VDD S ⬉⑤5 CLK I 䩳SCLK I 䩳6 V SS2 S ⬉⑤ VSS2 S ⬉⑤7 DAT0 I/O /PP 㒓[Bit 0] DOO/PP 䕧8 DAT1 I/O /PP 㒓[Bit 1] RSV9 DAT2 I/O /PP 㒓[Bit 2] RSV⊼˖1. S˖⬉⑤˗I˖䕧 ˗O˖ 䕧 ˗PP˖ I/ODŽ2. ⱘDAT㒓˄DAT1 ~ DAT3˅ Ϟ⬉ Ѣ䕧 ⢊ DŽ Ӏ 㸠SET_BUS_WIDTH ҸЎDAT㒓 DŽ ϡՓ⫼DAT1 ~ DAT3㒓 ˈЏ Փ㞾 ⱘDAT1~DAT3㒓 Ѣ䕧 DŽ䖭ḋ Н ЎњϢMMC DŽ3. Ϟ⬉ ˈ䖭 㒓Ў 50K Ϟ ⬉䰏ⱘ䕧 㒓˄ ҹ⫼ѢẔ⌟ 䗝 SPI ˅DŽ⫼ҹ ℷ ⱘ Ӵ䕧Ё⫼SET_CLR_CARD_DETECT˄ACMD42˅ Ҹ Ϟ ⬉䰏ⱘ䖲 DŽMMC ⱘ䆹 㛮 SD ϟЎ ⬭ 㛮ˈ SD ϟ ӏԩ⫼DŽ4. MMC SD ϟЎ˖I/O/PP/ODDŽ5. MMC SPI ϟЎ˖I/PPDŽ⬅㸼1.1 㾕ˈSD MMC ϡ ⱘ䗮 ϟˈ 㛮ⱘ 㛑гϡⳌ DŽ䖭䞠ⱘ䗮 ˄Џ ˅䆓䯂 Փ⫼ⱘ䗮 䆂ˈ ЎSD SPI DŽ ԧ䗮 䖛ЁˈЏ 㛑䗝 Ёϔ⾡䗮 DŽ䗮 ⱘ䗝 ѢЏ 䇈 䗣 ⱘDŽ Ӯ㞾 Ẕ⌟ ԡ Ҹⱘ ˄ 㞾 Ẕ⌟ ԡ ҸՓ⫼ⱘ 䆂˅ˈ㗠Ϩ㽕∖ҹ ⱘ䗮 䛑 Ⳍ ⱘ䗮 䖯㸠DŽ ҹˈ Փ⫼ϔ⾡䗮 ⱘ ˈ 䳔Փ⫼ ϔ⾡ DŽϟ䴶 ㅔ ҟ㒡䖭ϸ⾡ DŽ1.1.1 SDSD ϟˈЏ Փ⫼SD 㒓䆓䯂SD ˈ 㒓 㒧 1.3 ⼎DŽ⬅ 㾕ˈSD 㒓Ϟϡҙ ҹ SD ˈ䖬 ҹ MMC DŽ1.3 SD ㋏㒳˄SD ˅ⱘ 㒓 㒧SD 㒓Ϟⱘ 㒓ⱘ䆺㒚 㛑 䗄 㸼1.2 ⼎DŽ㸼1.2 SD 㒓 㒓 㛑 䗄㒓 㛑 䗄CLK Џ 䗕ⱘ⫼Ѣ ℹ 䗮 ⱘ 䩳CMD ⱘ ҸˋDAT0 ~ DAT3 4Ͼ ⱘ ˄MMC DAT0 㒓˅VDD ⬉⑤ℷ ˈϔ㠀⬉ 㣗 Ў2.7 ~ 3.6VVSS1ǃVSS2 ⬉⑤SD ㋏㒳˄SD ˅ⱘ 㒓 㒧 Ў: ϔϾЏ ˄ ˅ǃ ϾҢ ˄ ˅ ℹⱘ 㒧 ˄ 㗗 1.3˅DŽ ⫼ 䩳CLKǃ⬉⑤ DŽ㗠 Ҹ㒓˄CMD˅ 㒓˄DAT0 ~ DAT3˅ ⱘϧ⫼㒓ˈ ↣ 䛑⣀ゟ 䖭ѯ 㒓DŽ䇋⊼ ˈMMC 㛑Փ⫼1 㒓DAT0DŽ1.1.2 SPISPI ϟˈЏ Փ⫼SPI 㒓䆓䯂 ˈ Ҟ 䚼 䑿䛑 ⹀ӊSPI ˈ ҹՓ⫼ ⱘSPI 䆓䯂 ⱘDŽ Ϟ⬉ ⱘ1Ͼ ԡ Ҹ ҹ䗝 䖯 SPI SD ˈԚ Ϟ⬉ 䯈ˈ ӀП䯈ⱘ䗮 ϡ㛑 ЎSD DŽⱘSPI Ϣ ⱘSPI DŽ ⱘSPI 㒓ⱘ 㒓 㸼1.3 ⼎DŽ㸼1.3 SD ϢMMC ⱘSPI 䗄㒓 㛑 䗄CS Џ 䗕ⱘ⠛䗝CLK Џ 䗕ⱘ 䩳DataIn Џ 䗕ⱘDataOut Џ 䗕ⱘSPI 㒓ҹ 㡖Ў ԡ䖯㸠 Ӵ䕧ˈ Ҹ⠠䛑 㡖˄8ԡ˅ⱘ ˈ㗠Ϩ 㡖䗮 ϢCS 唤DŽSD ㋏㒳 1.4 ⼎DŽ1.4 SD ㋏㒳˄SPI ˅ⱘ 㒓 㒧Џ 䚼䖲 SD MMC ˈЏ ⫼CS 㒓 䖯㸠 DŽ՟ ˖ 1.4Ёˈ Џ 䳔㽕 SD AӴ䕧 䳔㽕Ң䆹 ˈ 乏 CS(A)㕂ЎԢ⬉ ˄ ⱘCS 㒓 乏㕂Ў催⬉ ˅DŽCS SPI ⧚˄ Ҹǃ ˅ 䯈 乏㓁 ˄Ԣ⬉ ˅DŽ ϔ՟ ⱘ 㓪ⱘ䖛DŽ 䖭Ͼ䖛ЁˈЏ ҹՓCS Ў催⬉ ˈԚϡ ⱘ㓪DŽ⬅ 1.4 㾕ˈ SPI 㒓Ϟ N ˈ䳔㽕N CS⠛䗝㒓DŽ1.2䆓䯂SD/MMC ⱘSPI ⹀ӊ⬉䏃䆒䅵SD/MMC ҹ䞛⫼SD 㒓䆓䯂ˈг ҹ䞛⫼SPI 㒓䆓䯂ˈ㗗㰥 䚼 䛑 SPI 㗠≵ SD 㒓 ˈ㗠Ϩ 䞛⫼I/O SD 㒓ˈϡԚ њ䕃ӊⱘ 䫔ˈ㗠Ϩ 㗠㿔ˈ 㒓䖰ϡ ⳳℷⱘSD 㒓䗳 ˈ䖭 䰡Ԣ 㒓 Ӵ䕧ⱘ䗳 DŽѢҹϞⱘ㗗㰥ˈ䞛⫼LPC2103 ⱘSPI Ў՟ ˈ䆒䅵䆓䯂SD/MMC ⱘ⹀ӊ ⬉䏃DŽLPC2103 ϢSD/MMC ⬉䏃 1.5 ⼎DŽ1.5 SD ϢLPC2103 ⬉䏃˄SPI ˅ЁˈLPC2103ϢSD/MMC ⱘ䖲 㛮 㸼1.4 ⼎DŽ㸼1.4 LPC2103ϢSD/MMC ⱘ䖲 㛮LPC2103 НP0.8_CS SPI⠛䗝 ˈ⫼Ѣ䗝 SPIҢ ˈ䆹 㛮Ў 䗮I/OP0.4_SCK SPI 䩳 ˈ⬅Џ ˈ⫼Ѣ ℹЏ П䯈ⱘ Ӵ䕧P0.6_MOSI SPIЏ 䕧 ˈҢ 䕧LPC2103 НP0.5_MISO SPIЏ 䕧 ˈҢ 䕧P0.9_SD_POWER կ⬉ ˈ LPC2103ⱘP0.9䕧 Ԣ⬉ 㒭 կ⬉P0.10_SD_INSERT ЁẔ⌟㒓ˈ 䕧 Ԣ⬉ ˈ 䕧 催⬉ P0.11_SD_WP Ẕ⌟ˈ 䕧 催⬉ ˈ 䕧 Ԣ⬉ġճ Ϣ ԅ ē Ќ ЉԨ ͬ ЉԨ Ϣ d1.2.1 SPI 㒓1.5 ⼎ˈLPC2103 SPI ⱘP0.8_CSǃP0.4_SCKǃP0.6_MOSIǃP0.5_MISOⳈ 䖲 ⱘⳌ ˈ ЁSPIⱘϸϾ 㒓P0.6_MOSIǃP0.5_MISO䖬 Ϟ ⬉䰏ˈ䖭 ЎњՓ ⬉䏃 ҹϢMMC ⱘ DŽSPI ϟ 䳔⫼ ⱘ 㒓DAT2 DATA1 ϟ ⬉䰏DŽ1.2.2 կ⬉ⱘկ⬉䞛⫼ ˈ䖭 Ўњ䰆ℶSD/MMC 䖯 ϡ⹂ ⢊ ˈ ҹ䗮䖛 䞡 Ϟ⬉Փ ԡ㗠 䳔 DŽ⬉䏃䞛⫼P MOSㅵ2SJ355ˈ⬅LPC2103ⱘGPIO P0.9_SD_POWER䖯㸠 ˈ P0.9_SD_POWER䕧 催⬉ ˈ2SJ355 ˈϡ㒭 կ⬉˗ P0.9_SD_POWER 䕧 Ԣ⬉ ˈ2SJ355 䗮ˈVCC3.3⬉⑤˄⬉ Ў3.3V˅㒭 կ⬉DŽ䞛⫼2SJ355ⱘⳂⱘ 䗮 ˈㅵ Ϟⱘ 䰡↨䕗 DŽ2SJ355ⱘⳌ ⡍ 䇋㾕 DŽ⫼ г ҹ䞛⫼ P ⱘMOSㅵˈԚ 㽕㗗㰥ㅵ 䗮 ˈⓣ Ϣ⑤ П䯈ⱘ 䰡㽕䎇 ˄ 䆕SD/MMC ⱘ ⬉ 䆌㣗 ˅ˈㅵ 䆌䗮䖛ⱘ⬉⌕г㽕⒵䎇 ⱘ㽕∖ˈϔ㠀ϔ SD/MMC ⱘ ⬉⌕䗮 Ў45mA ˈ ҹ䗝⫼ⱘMOSㅵ㽕∖ 䆌䗮䖛100mA ⱘ⬉⌕DŽ1.2.3 Ẕ⌟⬉䏃Ẕ⌟⬉䏃 ϸ䚼 ˖ Ё DŽẔ⌟ ⬅ ⱘϸϾ 㛮ҹ⬉ ⱘ 䕧 DŽ ԡ ˈP0.10_CARD_INSERT˄10㛮˅⬅Ѣ 䚼㾺⚍䖲 GNDˈ䕧 Ԣ⬉ ˗ ˈ䆹 㛮⬅ѢϞ ⬉䰏R2ⱘ 㗠䕧 催⬉ ˈ䆹䕧 ⬅LPC2103ⱘ䕧 㛮GPIO(P0.10_SD_INSERT) Ẕ⌟DŽⱘẔ⌟Ϣ ЁⱘẔ⌟ ⧚ ϔḋⱘDŽ1.3 SD/MMC 䇏 ⱘ ӊ㒧 ԧ㡖ҟ㒡 ⱘ㒘 ӊҹ ӀП䯈ⱘ ㋏DŽ1.3.1 SD/MMC 䇏 ⱘ ӊ㒘SD/MMC 䇏 ⱘ ӊ 㸼1.5 ⼎DŽ㸼1.5 SD/MMC 䇏 ⱘ ӊӊ⫼sdconfig.h 䇏 ⹀ӊ䜡㕂 ӊsdspihal.c 䇏 ⹀ӊ 䈵 ˈ ⦄SPI ˈSPI 㡖ⱘ ǃ ㄝϢSPI⹀ӊⳌ ⱘӊ⫼sdspihal.h sdspihal.c ӊsdcmd.c 䇏 Ҹ ˈ ⦄ ⱘ ⾡ Ҹҹ Џ Ϣ П䯈ⱘ ⌕sdcmd.h sdcmd.c ӊsddriver.c 䇏 ⫼ ˈ ⦄ ⱘ䇏ǃ ǃ API ˈ䆹 ӊ䖬 ϔѯ sddriver.h sddriver.c ӊˈ 㸠䫭䇃ҷⷕsdcrc.c Ⳍ ⱘCRC䖤ㅫsdcrc.h sdcrc.h ӊ㸼1.5Ё䖭ѯ ӊ њ ˈϟ䴶䇈 ⬅䖭ѯ ӊ ⱘ ԧḚ DŽ1.3.2 SD/MMC䇏 ԧḚ㗗㰥 䆹 ⱘ ⿏ỡ ⫼ ˈ Ў3Ͼ ˈ 1.6 ⼎DŽ Ёⱘ ㋏㒳 ϡ 乏ⱘˈг 䇈ˈ ҹ ⫼Ѣ ㋏㒳˄ ㋏㒳˅ˈг ҹ ⫼Ѣ ㋏㒳Ёˈ կ ㋏㒳 ㋏㒳ȝC/OS-IIЁ 㒳ϔⱘAPI DŽՓ⫼ ㋏㒳⬅ sdconfig.h ӊЁⱘ НSD_UCOSII_EN Փ㛑 ⽕ℶDŽ1.6 SD/MMC 䇏 㒧ⱘ⡍⚍ ϟ˖(1)⹀ӊ 䈵 ˖䇏 SD/MMC ⱘ⹀ӊ ӊ䜡㕂ˈϢ⹀ӊⳌ ⱘ ˗(2) Ҹ ˖SD/MMC ⱘⳌ Ҹҹ ϢЏ П䯈 ⌕ⱘ ˈ䖭ϔ Ϣ⹀ӊ˗(3) ⫼ ˖ ⫼ ⫼ ӊ㋏㒳 կ ⱘAPI DŽ 䞛⫼ ㋏㒳ˈ䖭ϔ ⬅ ㋏㒳 DŽ1.4 SD/MMC 䇏 ⱘՓ⫼䇈Փ⫼ П ˈ 乏䜡㕂 Փ⫼ⱘ⹀ӊ ӊˈ ⹀ӊ ӊϢ1.2 㡖Ёⱘ⹀ӊ ӊϔḋˈ䙷М 乏䜡㕂 䕃ӊ ҹゟ Փ⫼DŽϟ䴶䇈 ḋ䜡㕂 ⱘ⹀ӊ ӊˈ 㛑 ⫼ѢLPC2103㋏ DŽ1.4.1 SD/MMC 䇏 ⱘ⹀ӊ䜡㕂SD/MMC 䇏 LPC2103ⱘ䜡㕂 Ϣsdconfig.h ӊⳌ ˈ䜡㕂 ӊsdconfig.hՓ⫼ 㛑 䜡㕂 ⱘⳌ 㛑 㺕 ѯ ⫼ 䇈 䳔⫼ ⱘ DŽ䆹 㡖 ⱘ ⏙ 䛑 䆹 ӊϞDŽϟ䴶䯤䗄䆹 ӊⱘ䜡㕂 ⊩DŽ1ˊ 䜡㕂 ⱘ 䜡㕂 ⏙ 1.1 ⼎ˈ䜡㕂䗝乍 ϟ˖(1) 䖤㸠ѢȝC/OS-II ЁDŽ ҹ䖤㸠Ѣ ㋏㒳Ёˈ ҹ䖤㸠Ѣ㋏㒳ȝC/OS-II ЁDŽ 䖤㸠ѢȝC/OS-II Ё ˈ НSD_UCOSII_EN ⱘ 㕂Ў1ˈ 㕂Ў0DŽ(2)CRC 偠DŽ⬅ѢSD/MMC SPI 䗮 ϟ ҹϡ䳔㽕䖯㸠 Ӵ䕧ⱘCRC偠ˈ䆹 ⫼ѢՓ㛑 ⽕ℶ 䇏 ⱘ Ӵ䕧CRC 偠 㛑DŽՓ㛑CRC 偠 䗮 䴴 催ˈԚCRC 䖤ㅫг Ӵ䕧䗳 ⱘϔѯ ˈ⬅Ѣ 䞛⫼ 㸼ⱘ ⊩䅵ㅫCRC16ˈ ҹ䗳 ⬹ DŽ(3)SPI 䩳乥⥛DŽ НSPI 㒓ⱘCLK 㒓ⱘ乥⥛ˈ䆹乥⥛ ⫼Ѣ䅵ㅫ䇏ǃ ǃЁⱘ䍙 䯈 ⱘCLK Ͼ ˈ䖭ḋ 䍙 䯈䕀 Ў䍙 䅵 DŽ䆹乥⥛ ⱘ ԡЎ˖Hz ˈ䆹 䳔㽕⫼ НDŽ(4)SD/MMC ⱘ䭓 DŽ НSD/MMC ⱘ 䭓 ˈ Ҟ⌕㸠ⱘSD/MMCⱘ 䭓 䚼 䛑 512 㡖DŽ НSD_BLOCKSIZE_NBITS Ў9ˈ Ѣ29 = 512 㡖˄ Ѣ НSD_BLOCKSIZE ⱘ ˅ˈSD_BLOCKSIZE_NBITS ϢSD_BLOCKSIZE ϔ 㽕 䖭ḋⱘ ㋏DŽSD_BLOCKSIZE_NBITS ⫼Ѣ ӊ 䅵ㅫⱘ DŽ⫼ ϔ㠀 乏 䖭ϸϾ Нⱘ DŽ ⏙ 1.1 䜡㕂#define SD_UC OSII_EN 1 /* ȝC/OS-II Ϟ䖤㸠 */ #define SD_CRC_EN/* 䆒㕂 Ӵ䕧 Փ⫼CRC */ #define SPI_CL O CK 5529600 /* ℷ 䗮 ,SPI 䩳乥⥛(Hz) */ #define SD_BLO CKSIZE512 /* SD/MMC ⱘ䭓*/#define SD_BLO CKSIZE_NBITS9/* 2ⱘ9 Ў512˄ SD_BLOCKSIZE ⱘ ˅*/2ˊ 㛑䜡㕂 Ё ϔѯ 㛑ϡ ⫼ 䛑 㛑⫼ ⱘˈ ҹ ҹ㺕 ϡ䳔㽕ⱘ ˈҹҷⷕ䞣DŽ ⏙ 1.2ⱘ Н⫼ѢՓ㛑㓪䆥䇏 Ёⱘ ѯ↨䕗 ⫼ⱘ ˈ Ў1 ˈՓ㛑㓪䆥 ⱘ ˗Ў0 ˈ⽕ℶ㓪䆥 ⱘ DŽ䖭ѯ Н䍋 㺕 䇏 ҷⷕ ⱘⳂⱘDŽ ⏙ 1.2 Փ㛑/* ϟ䴶 ϡ ⫼, ⫼ ϡ䳔㽕, 㕂Ў 0 㺕 */ #define SD_ReadMultiBlock_EN 0 /* Փ㛑䇏 */ #define SD_WriteMultiBlock_EN 0 /* Փ㛑*/ #define SD_EraseBlock_EN 0 /* Փ㛑*/ #define SD_ProgramCSD_EN 0 /* Փ㛑 CSD*/ #define SD_ReadCID_EN/* Փ㛑䇏CID */#define SD_ReadSD_Status_EN 0 /* Փ㛑䇏SD Status */ #define SD_ReadSCR_EN 0 /* Փ㛑䇏SCR*/3ˊ⹀ӊ ӊ䜡㕂䖭䚼 ҹ ⱘ ⱘSPI IO Ⳍ 䖯㸠 Нˈ 㛑 ⹀ӊⳌ ⱘ䚼 Ѣ䖭ϔ䚼 DŽ՟ ˈ䜡㕂LPC2103ⱘ4ϾI/O ЎSPI ⱘ Н ⏙ 1.3(1) ⼎DŽ ѢSD կ⬉ 㛮ⱘ ⏙ 1.3(2) ⼎DŽ⫼ 䯙䇏LPC2103ⱘ ҹњ㾷䖭ѯ䜡㕂ⱘ НDŽ䆹 ӊ䖬 IO ⱘ䜡㕂ˈ䆺㾕sdconfig.h ӊDŽ ⏙ 1.3 LPC2103ⱘIO 䜡㕂 Н/* IO ЎSPI */#define SPI_INIT() PINSEL0 &= ~((0x03 << 8) + (0x03 << 10) + (0x03 << 12)); \PINSEL0 |= (0x01 << 8) + (0x01 << 10) + (0x01 << 12); (1) /* ⬉⑤ 㛮*/ (2)#defineSD_PO WER (0x01<<9)#define SD_POWER_GPIO() PINSEL0 &= ~(0x03 << 18) /* 䆒㕂 PO WER ЎGPIO */#defineSD_PO WER_OUT() IODIR|=SD_POWER /*䆒㕂 PO WER Ў䕧 */#define SD_PO WER_O FF() IO SET = SD_PO WER /* 㕂 PO WER Ў催⬉ */ #define SD_PO WER_O N() IO CLR = SD_PO WER /* 㕂 PO WER ЎԢ⬉ */ 䜡㕂 ӊⱘ 䚼 ҟ㒡 ℸˈ 㽕 ⿏ỡ MCUˈ 䖬䳔 sdhal.c ӊˈ䖭ϔ䚼 ϢMCUⱘSPI Ⳍ ˈ Փ⫼LPC2103ˈ䙷М 乏 䆹 ӊDŽ䖬 ϔ⚍ ⬹ⱘˈ 乏 LPC2103ⱘ 䆒 䩳乥⥛Fpclk䇗㟇 催˄ 䆌㣗 ˅ˈ䖭ḋˈ䇏 ⱘ䇏 䗳 㛑䖒 催DŽ㗠ϨSD/MMC ⱘSPI 㒓 䆂Ёˈ㽕∖SPIЏ 乏㛑 SPI 㒓ⱘ 䩳乥⥛DŽLPC2103 SPI 㒓 䩳ⱘ 䇈 ϟDŽ4ˊ䆒㕂SPI ⱘ 䩳乥⥛ Ѣ400kHz䆹 Џ㽕 SD/MMC 䰊↉ˈ⫼Ѣ䆒㕂SPI ⱘ 䩳乥⥛ Ѣ400kHzˈ ЎMMC 䯈SPI 㒓ⱘ 䩳乥⥛ϡ㛑催Ѣ400kHzˈ䖭ḋ 㛑䖒 MMC ⱘⳂⱘDŽ䆹 ⏙ 1.4 ⼎˄㾕sdhal.c ӊ˅DŽ䆹 LPC2103 SPI ⱘSPI 䩳䅵 SPI_SPCCRⱘ 乥 䖒 ⳂⱘDŽ ⏙ 1.4䆒㕂SPI ⱘ 䩳乥⥛ Ѣ400kHzvoid SPI_Clk400k(void){SPI_SPCCR=128; /*䆒㕂SPI 䩳 乥 Ў128 */}LPC2103ⱘ 䚼 乥⥛Fosc = 11.0592MHzˈ Ḍ 䩳乥⥛Fcclk䆒㕂ЎFosc ⱘ4 ˈ Fcclk = 44.2368 MHzDŽ 䆒 䩳乥⥛䆒㕂ЎϢ Ḍ 䩳乥⥛Ⳍ ˈ Fpclk = Fcclk = 44.2368 MHzˈ䙷МSPI 㒓ⱘ 䩳ЎFpclk㒣䖛SPI_SPCCR 乥 ⱘ 䩳DŽ ҹˈ㽕ՓSPI ⱘ 䩳乥⥛ Ѣ400kHzˈ 㽕 䆕SPI_SPCCR ⱘ Ў Ѣ8ⱘ ˈ䆹 ⱘ 乥 㽕䆒Ў128DŽⱘSPI SCKⱘ乥⥛Ў˖44.2368 / 128 = 0.3456 MHz = 345.6kHz < 400kHzDŽḋˈ 㽕䆒㕂SCKⱘ乥⥛Ў ˈ 乏䇗⫼void SPI_ClkToMax(void) ˄㾕sdhal.c ӊ˅ˈ䆹 SPI_SPCCRⱘ Ў8ˈ䙷М SCKⱘ乥⥛Ў˖44.2368 / 8 = 5.5296MHzDŽ䳔㽕⊼ ˈ Ҟ⌕㸠ⱘSD/MMC ⱘSPI ⱘ 䩳乥⥛ϔ㠀ϡ 䆌䍙䖛25MHzˈ ҹ НMCU䆓䯂SD/MMC ⱘ 䩳乥⥛ ˈ 乏⊼ 䖭ϔ⚍DŽ䇏㗙ⱘ 䚼 乥⥛Fosc LPC2103 䆒 䩳乥⥛Fpclk њˈ䇋⊼ 䖭ϸϾ Ёⱘ 乥 ˈ Ӭ 䇏 ⱘ䆓䯂䗳 DŽ䜡㕂 њ⹀ӊˈ䙷М ҹՓ⫼ њˈ䙷М կњ ѯAPI ⫼ 䆓䯂SD/MMC ˛ϟ䴶ҟ㒡䖭ѯAPI ⱘ DŽ1.4.2 SD/MMC 䇏 կⱘAPI⫼ ҹ ⫼ կⱘAPI SD/MMC 䖯㸠䆓䯂ˈ㾕㸼1.6㟇㸼1.11DŽ㸼1.6 SD_Initialize()⿄ SD_InitializeINT8U SD_Initialize(void)㛑 䗄 SD/MMC ǃ䆒㕂 Ў512 㡖ˈ㦋 ⱘⳌ䖨 SD_N O _ERR ˖ ˗ > 0: 䋹˄䫭䇃ⷕˈ㾕㸼1.12˅ ⡍⅞䇈 ⊼ ⚍䆹 䆒㕂њ ⱘ䇏/ 䭓 Ў512 㡖㸼1.7 SD_ReadBlock ()⿄ SD_ReadBlockINT8U SD_ReadBlock(INT32U blockaddr, INT8U *recbuf) 㛑 䗄 䇏SD/MMC ⱘϔϾblockaddr ˖ҹ Ў ԡⱘ DŽ՟ ˈ ⱘ0 ~ 511 㡖Ў 0ˈ512 ~ 1023㡖ⱘ Ўˍrecbuf ˖ 㓧 ˈ䭓 Ў512 㡖䖨 SD_N O_ERR ˖䇏 ˗ > 0: 䇏 䋹˄䫭䇃ⷕˈ㾕㸼1.12˅ ⡍⅞䇈 ⊼ ⚍recbuf ⱘ䭓 乏 512 㡖㸼1.8 SD_WriteBlock()⿄ SD_WriteBlockINT8U SD_WriteBlock(INT32U blockaddr, INT8U *sendbuf) 㛑 䗄 SD/MMC ⱘϔϾblockaddr ˖ҹ Ў ԡⱘ DŽ՟ ˈ ⱘ0 ~ 511 㡖Ў 0ˈ512 ~ 1023㡖ⱘ Ўˍsendbuf ˖ 䗕㓧 ˈ䭓 Ў512 㡖䖨 SD_N O _ERR ˖ ˗ > 0: 䋹˄䫭䇃ⷕˈ㾕㸼1.12˅ ⡍⅞䇈 ⊼ ⚍sendbuf ⱘ䭓 乏 512 㡖㸼1.9 SD_ReadMultiBlock()⿄ SD_ReadMultiBlockINT8U SD_ReadMultiBlock(INT32U blockaddr, INT32U blocknum, INT8U *recbuf) 㛑 䗄䇏SD/MMC ⱘ Ͼ㟈䖰⬉ 䰤 Tel ˖(020)38730976 38730977 Fax ˖38730925 㓁Ϟ㸼blockaddr ˖ ҹ Ў ԡⱘ blocknum ˖recbuf ˖ 㓧 ˈ䭓 Ў512 * blocknum 㡖䖨 SD_N O _ERR ˖䇏 ˗ > 0: 䇏 䋹˄䫭䇃ⷕˈ㾕㸼1.12˅⡍⅞䇈 ⊼ ⚍Փ⫼ 乏 sdconfig.h Ёⱘ Н SD_ReadMultiBlock_EN 㕂Ўˍ㸼1.10 SD_WriteMultiBlock ()⿄ SD_WriteMultiBlockINT8U SD_WriteMultiBlock(INT32U blockaddr, INT32U blocknum, INT8U *sendbuf) 㛑 䗄 䇏SD/MMC ⱘ Ͼblockaddr ˖ҹ Ў ԡⱘ blocknum ˖sendbuf ˖ 䗕㓧 ˈ䭓 Ў512 * blocknum 㡖䖨 SD_N O_ERR ˖ ˗ > 0: 䋹˄䫭䇃ⷕˈ㾕㸼1.12˅⡍⅞䇈⊼ ⚍Փ⫼ 乏 sdconfig.h Ёⱘ Н SD_WriteMultiBlock_EN 㕂Ўˍ㸼1.11 SD_EraseBlock()⿄ SD_EraseBlockINT8U SD_EraseBlock(INT32U startaddr, INT32U blocknum) 㛑 䗄 䰸SD/MMC ⱘ Ͼstartaddr˖ ҹ Ў ԡⱘ 䰸䍋 blocknum ˖ ˄ 㣗 1 ~ sds.block_num ˅䖨 SD_N O _ERR ˖ 䰸 ˗ > 0: 䰸 䋹˄䫭䇃ⷕˈ㾕㸼1.12˅ ⡍⅞䇈 ⊼ ⚍Փ⫼ 乏 sdconfig.h Ёⱘ Н SD_EraseBlock_EN 㕂ЎˍDŽStartaddr blocknum 䆂Ў sds.erase_unit ⱘ , Ў ⱘ 㛑ҹ sds.erase_unit Ў ԡ䖯㸠 䰸ϡ ⫼ˈ䖭䞠 ϡϔϔ њDŽ䳔㽕⫼ ⱘ䇏㗙 ҹ䯙䇏⑤ⷕЁⱘ䇈 DŽ㸼1.6㟇㸼1.11 䖨 ҷ㸼ⱘ Н 㸼1.12 ⼎DŽ㸼1.12䫭䇃ҷⷕ 㸼䫭䇃ⷕ НННSD_N O_ERR 0x00 㸠 SD_ERR_N O _CARD 0x01 ≵ ЁSD_ERR_USER_PARAM 0x02 ⫼ Փ⫼API ˈ 䫭䇃 SD_ERR_CARD_PARAM 0x03 Ё 䫭䇃˄Ϣ ϡ ˅ SD_ERR_V O L_N O TSUSP 0x04 ϡ 3.3V կ⬉ SD_ERR_O VER_CARDRANGE 0x05 䍙 㣗 SD_ERR_UNKN OWN_CARD 0x06 ⊩䆚 SD_ERR_CMD_RESPTYPE 0x10 Ҹ㉏ 䫭䇃 SD_ERR_CMD_TIME OUT 0x11 Ҹ 䍙㓁Ϟ㸼䫭䇃ⷕ НННSD_ERR_CMD_RESP 0x12 Ҹ 䫭䇃SD_ERR_DATA_CRC16 0x20 ⌕CRC16 偠ϡ䗮䖛SD_ERR_DATA_START_T OK 0x21 䇏 ˈ Ҹ⠠ϡℷ⹂SD_ERR_DATA_RESP 0x22 ˈ Ҹ⠠ϡℷ⹂ SD_ERR_TIME O UT_WAIT 0x30 ˈ ⫳䍙 䫭䇃 SD_ERR_TIME OUT_READ 0x31 䇏 䍙 䫭䇃SD_ERR_TIME O UT_WRITE 0x32 䍙 䫭䇃 SD_ERR_TIME O UT_ERASE 0x33 䰸 䍙 䫭䇃SD_ERR_TIME O UT_WAITIDLE 0x34 ˈㄝ 䗔 ぎ䯆⢊ 䍙 䫭䇃 SD_ERR_WRITE_BLK 0x40 䫭䇃SD_ERR_WRITE_BLKNUMS 0x41 ˈ 㽕 ⱘ Ϣℷ⹂ ⱘ ϡϔ㟈 SD_ERR_WRITE_PR OTECT 0x42 ⱘ ԡ㕂 SD_ERR_CREATE_SEMSD 0xA0 䆓䯂 ⱘ 䞣 䋹ϟ䴶㒭 Փ⫼SD/MMC 䇏 ⱘϔϾ՟ DŽ1.5 SD/MMC 䇏 ⱘ ⫼⼎՟ϔϟ䴶㒭 LPC2103 ⧚ ϞՓ⫼SD/MMC 䇏 SD/MMC 䖯㸠䇏ǃ ⱘ՟ DŽ䆹՟ ⫼LPC2103 կⱘSPI 䇏 SD/MMC ˈ ⱘ 䇏Ϣ ↨䕗ˈ偠䆕䇏 ⱘℷ⹂ DŽ 1.5.1⹀ӊ䖲 Ϣ䜡㕂⫼ 䙺㒓EasyARM2103ϢSD CARD PACK 䖲 䍋 ˈ䖲㒓 ⊩ 㸼1.13 ⼎DŽ 㸼1.13 EasyARM2103ϢSD CARD PACK 䖲 ㋏EasyARM2103˄JP5˅SD CARD PACK 㛮˄J1˅㒓 Н3.3V 3.3V SD CARD PACK կ⬉⬉⑤GND GND ⬉⑤P0.9 P OW_C 3.3V ⬉⑤կ㒭 P0.8 CS 䗝 SD/MMCP0.6 M O SI Џ SPI 䕧 ˈ SPI 䕧 P0.4 SCK SPI 㒓 䩳P0.5 MIS OЏ SPI 䕧 ˈ SPI 䕧 P0.10 INSERT Ẕ⌟ P0.11 WP Ẅ Ẕ⌟SD/MMC 䇏 咬䅸ⱘ⹀ӊ䜡㕂 㸼1.13ⱘ⹀ӊ ӊⳌヺDŽ ℸˈϡ䳔㽕 䇏 䖯㸠䜡㕂DŽ 1.5.2⦄ ⊩՟ SD/MMC 䖯㸠䇏ǃ 䰸ㄝ ⫼ DŽ՟ ⱘ䕃ӊ㒧 1.7 ⼎DŽ1.7 Џ ⌕SD ⫼⼎՟Џ ⏙ 1.5 ⼎DŽ ⏙ 1.5 SD Џ ҷⷕint main (void) {uint32 i; uint8 status;uint8 sdbuf[512]={0}; /* 㓧 */ uint8 sdbuf2[512]={0}; /* 䇏 㓧 */PINSEL1 = 0x00000000; /* 䆒㕂ㅵ㛮䖲 GPI O*/ IO0DIR |= BEEP;/* 䆒㕂BEEP Ў䕧 */IO 0SET = BEEP;for(i=0;i<512;i++){ /**/sdbuf[i] = i&0xff; }status = SD_Initialize(&sds); /* SD*/if (status != SD_NO_ERR){ while(1); } status = SD_WriteBlock(&sds,0,sdbuf);/* sdbuf 㓧 0 Ё*/if (status != SD_NO_ERR){while(1); }status = SD_ReadBlock(&sds,0,sdbuf2); /* 䇏0 ⱘ*/if (status != SD_NO_ERR){ while(1); }status = memcmp(sdbuf,sdbuf2,512); /* sdbuf2Ϣsdbuf ⱘ 䖯㸠↨䕗*/if(status!=0){/* ↨䕗䫭䇃,㳖号 㳖号ϝ */Beep O n O ff(3); }else{/* ↨䕗ℷ⹂,㳖号ϔ */Beep O n O ff(1); } while(1); return 0; }ϟ ⏙ 1.5ЁⱘSD ǃSD 䇏 ㄝ ⫼ Ҹ䖯㸠ㅔ㽕䆆㾷DŽ1ˊ SDSD ⌕ 1.8 ⼎ˈ佪 䆓䯂 ⱘ⹀ӊ ӊˈSdSpiHal_Initialize˄˅ ҷⷕ ⏙ 1.6 ⼎DŽ ⏙ 1.6 䆓䯂 ⱘ⹀ӊ ӊINT8U SdSpiHal_Initialize(sd_struct *sds) {SD_Power(); /* ϟ⬉, Ϟ⬉ */ SPI_INIT();/* SPI*/SD_INSERT_GPI O ();SD_INSERT_IN(); /* Ẕ⌟ Ў䕧 */ ˄1˅ SD_WP_GPIO();SD_WP_IN();/* Ẕ⌟ Ў䕧 */ ˄2˅ SPI_CS_SET();/* CS 㕂催*/ SdSpiHal_SetMCIClock(sds, SD_RATE_SLO W); /* 䆒㕂SPI 乥⥛ ѢㄝѢ400kHZ */ SPI_SPCR = 0 << 3 |/* CPHA = 0ϔϾ 䩳䞛ḋ */1 << 4 |/* CPOL = 1ˈSCK Ԣ */ 1 << 5 | /* MSTR = 1ˈ䆒㕂ЎЏ */ 0 << 6 | /* LSBF = 0ˈSPI Ӵ䕧MSB */0 << 7 ;/* SPIE = 0ˈSPI Ё ⽕ℶ*/return SD_N O _ERR; }SD ϟ⬉ˈ Ϟ⬉ ˈ SPI 㒓 䖯㸠 DŽ ⏙ 1.6˄1˅ ⫼ѢẔ⌟ ⱘ ⱘI/O 㛮 ЎGPIO ˈ Ϩ䆒㕂Ў䕧 DŽ ⏙ 1.6˄2˅ ⫼ѢẔ⌟ ⱘI/O 㛮 ЎGPIO ˈ Ϩ䆒㕂Ў䕧 DŽ 䆒㕂SPI ⱘSCK 㛮䕧 乥⥛ ѢㄝѢ400KHz ˈ ЎMMC ԡ䰊↉㽕∖SPI ⱘ 䩳乥⥛㽕 ѢㄝѢ400KHz DŽġ · ͧ ӾLPC2103ԅSPI ԅP0.7ďSPI Ҷ Đ ē ē LPC2103ԅSPI ϢѩӲҶ ēϢ Ү Ѻ SPI ē Ѻ ēSPI Վ Ҷ d1.8 SD ⌕Ϣ Ẕ⌟ 乏Ẕ⌟Ⳍ I/O ⱘ⬉ DŽ Ẕ⌟ ⏙ 1.7 ⼎DŽ䆹 䖨 0㸼⼎ ˈℸ ˈSD/MMC 䇏/ 䕃ӊ ϡ㛑 䖯㸠 DŽ ˈP0.10_SD_INSERT 㛮䕧 Ԣ⬉ DŽ ⏙ 1.7 Ẕ⌟INT8U SdHal_CheckCard(sd_struct *sds){if (SD_INSERT_STATUS() != 0)return 0; /* not insert entirely */elseentirely */ return 1; /* insert}ѢSD ⌕Ёⱘ ԡ 䖯 ぎ䯆⢊ ǃ▔⌏ 䖯 ҹ䆒㕂 䭓 䇏 ㄝ ˈ 䆓䯂 ⫼SD/MMC 㾘 乏㽕䖯㸠ⱘ ˈ 㦋 Ⳍ ⱘ ˈ 䆒㕂Ў 䗖ⱘ⢊ ˈ 䖯㸠䇏 䆓䯂DŽ2ˊ SD SD/MMC SPI ϟⱘ ϸ⾡˖ DŽ ⼎՟䞡⚍ҟ㒡DŽ SD_Initialize() 㒣䇗⫼њSpiCmd_Set_BlockLen() 䆒 њ䇏/ⱘ䭓 SD_BLOCKSIZE 㡖ˈ ˈ䇏/ 䛑 ҹ Ў ԡˈϔ 㟇 㽕 SD_BLOCKSIZE 㡖DŽSD_BLOCKSIZE 㡖ϔ㠀䛑Ў512 㡖DŽSD ⌕ 1.9 ⼎DŽ 䖭ḋ䖯㸠ⱘ˖1.9 SD ⌕(1)Џ Ẕ⌟ Ё˗(2)Џ Ẕ⌟ ˗(3)ҹϞ ӊ⒵䎇 ˈЏ 䗕 Ҹˈ ЎblockaddrⱘϔϾ ˗(4)Џ ㋻䎳䖭 䗕㽕 ⱘ ˈ 䭓 ЎSD_BLOCKSIZEDŽSD ⏙ ⏙ 1.8 ⼎ˈ 䆂 ⱘ ⫼ Ⳉ 䇗⫼䕃ӊⱘAPI DŽ ⏙ 1.8 SD ҷⷕ/******************************************************************************************** ⿄˖SD_WriteBlock** 㛑 䗄˖SPI ϟ, SD/MMC Ё ϔϾ** 䕧 ˖sd_struct *sds˖SD/MMC 㒧 ԧ** INT32U blockaddr˖ҹ Ў ԡⱘ , ՟ , ⱘ0 ~ 511 㡖Ў 0, 512 ~** 1023 㡖ⱘ Ў1** INT8U *sendbuf ˖ 䗕㓧 ,䭓 Ў 512 㡖** 䕧 ˖** 䖨 ˖0˖ℷ⹂>0˖䫭䇃ⷕ, 㾕 sddriver.h ӊ******************************************************************************************/ INT8U SD_WriteBlock(sd_struct *sds, INT32U blockaddr, INT8U *sendbuf){ret,tmp[2];INT8USD_RequestOSSem(sds);/* OS ⬇䇋䆓䯂 䞣 */if (!SdHal_CheckCard(sds)) {SD_ReleaseO SSem(sds);return SD_ERR_NO _CARD;/* ≵ Ё */}if (blockaddr > sds->block_num) { SD_Release O SSem(sds);return SD_ERR_OVER_CARDRANGE; /* 䍙 䞣㣗 */ }if (SdHal_CheckCardWP(sds)) {SD_Release OSSem(sds);return SD_ERR_WRITE_PR O TECT; /* */ } ret = SpiCmd_Write_Single_Block(sds, blockaddr); /* Ҹ*/if (ret != SD_NO_ERR) {SD_Release OSSem(sds); return ret; } ret = SdSpi_WriteBlockData(sds, 0, SD_BLOCKSIZE, sendbuf);/**/if (ret == SD_NO_ERR) {/* 䇏 , Ẕ */ret = SpiCmd_Send_Status(sds, 2, tmp);if (ret != SD_NO_ERR) { SD_Release OSSem(sds);return ret;/* 䇏 䋹 */}if((tmp[0] != 0) || (tmp[1] != 0)) {SD_Release O SSem(sds);ret = SD_ERR_WRITE_BLK; /* ⼎ 䋹*/}} SD_ReleaseO SSem(sds);return ret;/* 䖨 㒧*/}3ˊ SD 䇏 SD/MMC SPI ϟⱘ䇏 г ϸ⾡˖䇏 䇏 DŽ ⼎՟䞡⚍ҟ㒡䇏 DŽ SD_Initialize() 㒣䇗⫼њSpiCmd_Set_BlockLen() 䆒 њ䇏/ ⱘ䭓 SD_BLOCKSIZE 㡖DŽ ˈ䇏/ 䛑 ҹ Ў ԡˈ ҹϔ䇏 㟇 㽕䇏SD_BLOCKSIZE Ͼ 㡖DŽSD_BLOCKSIZE 㡖ϔ㠀䛑Ў512 㡖DŽSD 䇏 ⌕ 1.10 ⼎DŽ䇏 䖭ḋ䖯㸠ⱘ˖1.10 SD 䇏 ⌕(1)Џ 佪 Ẕ 㒣 Ё˗ (2)Ẕ 䍙 ⱘ 䞣㣗 ˗(3)ҹϞ ӊ⒵䎇 ˈ 䗕䇏 Ҹˈ䇏 Ўblockaddr ⱘϔϾ ˗ (4)䇗⫼䇏 Ң 䇏 ϔϾ DŽSD 䇏 ⏙ ⏙ 1.9 ⼎ˈ 䆂 ⱘ ⫼ Ⳉ 䇗⫼䕃ӊ ⱘAPI DŽ ⏙ 1.9 SD 䇏 ҷⷕ/****************************************************************************************** ** ⿄˖SD_ReadBlock** 㛑 䗄˖SPI ϟ, ҢSD/MMC Ё䇏 ϔϾ ** 䕧 ˖sd_struct *sds ˖SD/MMC 㒧 ԧ** INT32U blockaddr ˖ҹ Ў ԡⱘ , ՟ , ⱘ0 ~ 511 㡖Ў 0, 512 ~ ** 1023 㡖ⱘ Ў1** 䕧 ˖INT8U *recbuf ˖ 㓧 ,䭓 Ў 512 㡖** 䖨 ˖0˖ℷ⹂ >0˖䫭䇃ⷕ, 㾕 sddriver.h ӊ******************************************************************************************/ INT8U SD_ReadBlock(sd_struct *sds, INT32U blockaddr, INT8U *recbuf) {INT8U ret;SD_RequestOSSem(sds);/* OS ⬇䇋䆓䯂 䞣 */if (!SdHal_CheckCard(sds)) { SD_ReleaseOSSem(sds);return SD_ERR_NO_CARD;/* ≵ Ё */}if (blockaddr > sds->block_num) { SD_Release OSSem(sds);return SD_ERR_O VER_CARDRANGE; /* 䍙 䞣㣗 */ }ret = SpiCmd_Read_Single_Block(sds, blockaddr);/* 䇏 Ҹ*/if (ret != SD_NO_ERR) {SD_ReleaseOSSem(sds);return ret;}ret = SdSpi_ReadBlockData(sds, SD_BLOCKSIZE, recbuf); /* 䇏*/ SD_Release OSSem(sds); /* 䖬䆓䯂 䞣*/return ret;}1.6 SD/MMC 䇏 ⱘՓ⫼⼎՟Ѡϟ䴶㒭 LPC2103 ⧚ ϞՓ⫼SD/MMC 䇏 SD/MMC 䖯㸠䇏ǃ ǃⱘ՟ DŽ䆹՟ ѢuCOS-II ㋏㒳ˈ ⫼LPC2103կⱘSPI 䇏 SD/MMC ˈ䇏 ⱘ 䗮䖛LPC2103ⱘUART0 䗕 PC ⱘ䕃ӊ⬠䴶 ⼎ ˈ㽕 ⱘ г ҹ䗮䖛PC 䕃ӊ䗮䖛UART0 Ёˈ ˈ ՟ г կњ ⱘⓨ⼎DŽ 1.6.1⦄ ⊩՟ Џ㽕ⱘӏ ⓨ⼎䇏 SD/MMC ˈЎњ ⦄㛑 ⦄LPC2103ϢPC ⱘ䗮 ˈ ՟ Փ⫼њІ Ё䯈ӊϢ 䯳 Ё䯈ӊˈ 㞾PC ⱘ DŽ՟ ⱘ䕃ӊ㒧 1.11 ⼎DŽ1.11 ՟ ⦄ ⊩1.11Ёˈ ՟ ϸϾЁ䯈ӊ ϸϾӏ ˖ z І Ё䯈ӊϢ 䯳 Ё䯈ӊDŽ䖭ϸϾЁ䯈ӊ⫼Ѣ 㞾UART0ⱘ ˈ 䗮䖛UART0 䗕 PC DŽz І ӏ DŽ 㞾PC ⱘ ˈ 䋳䋷 ⱘ 䗕㒭 ӏ DŽzӏ DŽ 㞾І ӏ ⱘ ˈḍ Ё ⱘ Ҹ ⦄ SD/MMC ⱘ䇏ǃ ǃ DŽ 㸠㒧 Ѹ㒭І Ё䯈ӊϢ 䯳 Ё䯈ӊˈ⬅ Ӏ 䗕 PC ˈ 䇏 ⱘ 㸠ⱘ㒧 DŽ㾕ˈPC Ϣ ӏ П䯈䳔㽕ϔϾ 䆂 䇗ˈ 㛑ℷ⹂ SD/MMC ⱘ ǃ䇏ǃ ǃ DŽℸˈ ҹ ϔϾㅔ ⱘ 䆂 ˖(1) НLPC2103ⱘUART0 㾺 Ё ⏅ Ў8Ͼ 㡖ˈ Н8Ͼ 㡖Ўϔ ˈⱘӴ䕧ҹ Ў ԡˈPC 䗕ⱘ ⿄Ў Ҹ ˈLPC2103 䗕ⱘ ⿄Ў DŽ(2)PC 䗕ⱘ↣ϔ ⱘ1Ͼ 㡖Ў Ҹ ˈ2 ~ 8Ͼ 㡖Ў 䚼 ˈ 1.12⼎DŽ(3)LPC2103↣ PC ⱘϔϾ ˈḍ Ҹ 䖯㸠Ⳍ ⱘ ⧚˄ 䇏 ˅ˈ✊⧚㒧 ϔ PC ˈ ЎLPC2103 ⱘ Ҹ ˈ2 ~ 8 㡖Ў䚼 DŽPC ÆLPC213x ҸLPC213x ÆPC1.12 PC 䗕ⱘ Ҹ ϢLPC2103ⱘ(4) Ё 䕳ϔ⠛㓧 INT8U sd_buf[512]ˈ Ў520 㡖˄↨SD/MMCⱘϔϾ 8Ͼ 㡖˅DŽ⫼Ѣ Ң Ё䇏 ⱘ 䖯 Ёⱘ DŽ (5)ḍ ҹϞ ⚍ˈ ӏ SD/MMC 䖯㸠 ǃ䇏ǃ ǃ ⱘ ⊩ˈ⼎ 1.13 ⼎DŽ1.13 ӏ Ҹ ⱘ ⼎1.13 ⼎ˈ ӏ ḍ Ҹ ⱘ1Ͼ 㡖ˈ 㸠ϟ䴶ⱘ DŽ z CMD_SD_INIT Ҹˈ ҸDŽ ӏ 㸠 SD/MMC ⱘ ˈ✊ 㸠㒧 ⱘ2Ͼ 㡖ˈ PC 㒧 DŽ zCMD_SD_READ Ҹˈ䇏 ⱘ DŽPC 㽕䇏ⱘ CMD_SD_READ Ҹ ⱘϸϾ 㡖Ёˈ ӏ 䇗⫼䇏 䇏 ⱘ ˈ Ѣsd_buf[]Ёˈ䇏 ⱘ䖨 ⱘ2Ͼ 㡖ˈ PC 䇏 DŽ zCMD_SD_WRITE Ҹˈ ⱘ DŽPC 㽕 ⱘ CMD_SD_WRITE Ҹ ⱘϸϾ 㡖Ёˈ ӏ 䇗⫼ sd_buf[]Ёⱘ Ёˈ ⱘ䖨 ⱘ2Ͼ 㡖ˈ PC DŽzCMD_SD_ERASE Ҹˈ 䰸 ⱘ DŽPC 㽕 䰸ⱘ ⱘ Ϣ㽕 䰸ⱘ 䆹 Ҹ ⱘ 䴶ˈ ӏ 䇗⫼ ⱘ 䰸ˈ 䰸 ⱘ䖨 ⱘ2Ͼ 㡖ˈ PC 䰸 DŽz CMD_SD_RECV Ҹˈ ҸDŽ䆹 Ҹ ⱘ2 ~ 3 㡖 ⱘsd_buf[] ˈ4 ~ 8 㡖ЎPC ⱘ ˈ ӏ ⱘsd_buf[]ⱘЁDŽz CMD_SD_TRANS Ҹˈ 䗕 ҸDŽ䆹 ⱘ2 3Ͼ 㡖 PC 㽕䇏 sd_buf[]Ёⱘ ⱘ㓧 ˈ ӏ 䆹 ⱘ PC ˈѢ ⱘ2 ~ 8 㡖ЁDŽ㸠ҹϞӏԩϔϾ ˈ ӏ 䛑 䗕 PC DŽ(6) ⫼ҹϞ Ҹˈ 䖯㸠 ǃ䇏ǃ ǃ 䖭ḋ䖯㸠ⱘˈ 1.14 ⼎DŽ䇏䰸1.14 䖯㸠 ⾡ 䳔㽕 㸠ⱘ ҸҹϞ ⚍ ⦄ 1.11ⱘ ԧ 䆂DŽϟ䴶 㒭 ⦄ ՟ ⱘ 偠ℹ偸ˈ✊ 㒭 ⦄ҹϞ 䆂ⱘ⼎՟ҷⷕDŽ1.6.2՟ ゟϢ䖤㸠ℹ偸ϟ䴶ㅔ 䇈 ՟ ⱘ ゟ䖛DŽ1.⫼ADS1.2 ゟϔϾ ˈ ЎSDMMCExamˈ ゟ Փ⫼ ARMImage for uCOSII for LPC2103DŽ ゟ ˈ⫳ ӊ SDMMCExamDŽ2. SDMMCExamⳂ ϟ ゟϔϾⳂ SDMMCˈ 䆹Ⳃ ϟ 㕂SD/MMC 䇏 ⱘ ӊDŽ3. SDMMCExamⱘ 㑻Ⳃ ϟ ゟarm Source ӊ ˈSource ӊ 㕂ȝC/OS-II⑤ҷⷕDŽarmⳂ Ё 㕂ϢLPC2000⹀ӊⳌ ⱘȝC/OS-II⿏ỡҷⷕDŽ4. SDMMCExamⳂ ϟ ゟϔϾ ӊ uart0ˈ І Ё䯈ӊⳌ ӊ Ѣ䆹ӊ Ёˈ ゟqueue ӊ ˈ 䯳 Ё䯈ӊⳌ ӊ Ѣ䆹 ӊ ЁDŽ5. Ё ゟ3Ͼ㒘ˈ ЎSDMMCǃuartǃqueueˈ ⱘ Ё䯈ӊ䖭ѯ㒘ЁDŽ6. config.hЁ 䰸 ⱘĀ#include "..\..\Arm_Pc\pc.h"ā䇁 DŽ7. Ёⱘconfig.h ӊˈ LPC2103 䆒 䩳乥⥛ ҹϟ DŽ#define Fpclk (Fcclk / 4) * 48. sdconfig.h ӊˈ НSD_EraseBlock_ENⱘ 㕂Ў1DŽ#define SD_EraseBlock_EN 19. config.h ӊЁ Ⳍ Ё䯈ӊⱘ ӊ 䜡㕂DŽ ⏙ 1.10 ⼎DŽ ⏙ 1.10Ⳍ Ё䯈ӊⱘ ӊ 䜡㕂/* SD/MMC ӊ */#include "sdconfig.h"#include "sddriver.h"/* 䯳 ⱘ䜡㕂 */#define QUEUE_DATA_TYPE uint8#include "\queue\queue.h"#define EN_QUEUE_WRITE 1 /* ⽕ℶ(0) 䆌(1)FIFO 䗕 */#define EN_QUEUE_WRITE_FRO NT 0 /* ⽕ℶ(0) 䆌(1)LIFO 䗕 */#define EN_QUEUE_NDATA 1 /* ⽕ℶ(0) 䆌(1) 䯳 Ⳃ*/#define EN_QUEUE_SIZE 1 /* ⽕ℶ(0) 䆌(1) 䯳 䞣 */#define EN_QUEUE_FLUSH 0 /* ⽕ℶ(0) 䆌(1)⏙ぎ䯳 *//* UART0ⱘ䜡㕂 */#include "uart0.h"#define UART0_SEND_QUEUE_LENGTH 60 /* 㒭UART0 䗕 䯳 䜡ⱘぎ䯈 */10. os_cfg.h ӊˈ ㋏㒳Փ⫼ⱘ џӊ Ў3DŽ#define O S_MAX_EVENTS 311. ⹀ӊ 㒓 1.5ϔḋˈ䙷М 乏䜡㕂sdconfig.hˈ 1.4.1 㡖ⱘ䇈䖯㸠䜡㕂DŽ 䆂 sdconfig.h ӊ ѢSDMMCExam\srcⳂ ϟˈ Ў䖭 䜡㕂SD/MMC䇏 ⱘ ӊˈ ҹ㹿⫼ ⱘ ӊDŽ12. irq.s ӊⱘ ⏏ UART0Ё ⱘ∛㓪䇁㿔䚼 ҷⷕˈ ⏙ 1.11 ⼎ ⏙ 1.11 UART0Ё ⱘҷⷕ;/* 0Ё */;/*Time0 Interrupt*/Timer0_Handler HANDLER Timer0_Exception;/*䗮⫼І㸠 0Ё */UART0_Handler HANDLER UART0_Exception13. Target.c ӊⱘTargetInit() Ёˈ⏏ UART0ⱘҷⷕˈ ⏙ 1.12⼎DŽ ⏙ 1.12⏏ UART0 ҷⷕvoid TargetInit(void){O S_ENTER_CRITICAL();srand((uint32) TargetInit);VICInit();Timer0Init();UART0Init(115200);OS_EXIT_CRITICAL();}14. Target.c ӊⱘVICInit() Ёˈ⏏ UART0 䞣Ё ⱘ ҷⷕˈ ⏙ 1.13 ⼎DŽ ⏙ 1.13 U ART0 䞣Ёvoid VICInit(void){extern void IRQ_Handler(void);extern void Timer0_Handler(void);extern void UART0_Handler(void);VICIntEnClr = 0xffffffff;VICDefVectAddr = (uint32)IRQ_Handler;VICVectAddr14 = (uint32)UART0_Handler;VICVectCntl14 = (0x20 | 0x06);VICIntEnable = 1 << 6;VICVectAddr15 = (uint32)Timer0_Handler;VICVectCntl15 = (0x20 | 0x04);VICIntEnable = 1 << 4;}15.ḍ ՟ ⱘ 䆂 ˈ main.c ӊЁ㓪 䗮䖛І 䇏 SD/MMC ⱘⳌDŽ16.䗝 DebugInFlash⫳ Ⳃ ˈ✊ 㓪䆥䖲 DŽ ADS1.2䲚 ⦃ Ё䗝ProjectÆDebugˈ AXD䖯㸠JTAGӓⳳ䇗䆩ˈ 䗳䖤㸠 DŽ17.⹂ ⹀ӊ䖲 ℷ⹂ˈSD MMC ЁDŽ18. ѻ ⲬЁ կⱘPC ッ 㸠䕃ӊSDExample.exe ⹀Ⲭˈ ADS1.2ⱘ 䖤㸠 䖤㸠䆹䕃ӊDŽ䕃ӊ⬠䴶 1.15 ⼎DŽ19. 1.15Ёˈ䗝 І 䗮 ⊶⡍⥛ˈ✊ Ā䖲 LPC2103ā 䬂ˈĀ 㸠㒧 āḚЁ ⼎䆹䕃ӊ 㛑ϢLPC2103 䗮 DŽ20. І ˈ䙷М䇋 Ā SD/MMC āˈ Ā㸠㒧 āЁ ⼎ DŽ 䋹ˈ䆹Ā 㸠㒧 ā ⼎ 䫭䇃ҷⷕˈ⼎ⱘ䫭䇃ⷕϢ㸼1.12ϔϔ ˈ㒭 䫭䇃ⷕⱘⳂⱘ ⫼ 䇗䆩 DŽ21.SD/MMC ˈ Ā䇏 āḚЁ 㽕䇏ⱘ ⱘ ˈ✊ ˈĀ䇏ā 䬂ˈ䇏 ⱘ ⱘ Ā ⼎āḚЁ ⼎ ˈĀ 㸠㒧 āḚ⼎ 㸠㒧 ˈ 㸠㒧 䫭ˈ 㒭 䫭䇃ҷⷕDŽ1.15䖲 LPC2103 SD/MMC22. 㽕 ˈ 䳔㽕⫼哴 ⚍ Ā ⼎āḚЁⱘĀ ā ˈ✊⫼䬂Ⲭ䬂 㽕 ⱘ ˈ✊ Ā ā 䬂ˈ䕃ӊ 䆹 SD/MMC ЁˈĀ 㸠㒧 āḚ ⼎ 㸠㒧 DŽ 1.16 ⼎DŽ1.16 SD/MMC㽕 SD/MMC ˈ䙷М䇋 Ā 䰸ā 䬂ˈ 1.17 ⼎ⱘ 䰸 䆱Ḛˈ 䍋 㽕 䰸ⱘ ˈ✊ Ā 䰸āDŽ 䰸 㸠㒧 1.16 ⼎ⱘĀ 㸠㒧 āЁ ⼎ DŽ 䰸䰤 5000 ⱘⳂⱘ 䰆ℶ 䰸 䯈 䭓 㟈І㸠䗮 䍙 ˈ 䴲䇈SD/MMC ϔ 䰸 㛑 5000 DŽO1.17 䰸 䆱Ḛ1.17䖬 ⼎⫼ ⱘĀ䍋 ā Ā 䞣ā 䆂Ўsds.erase_uintⱘ DŽ䖭 Ў ϔѯ ⱘ ԡЎsds.erase_uint ˈг 䇈ˈ Փ Ҹ 䰸Ā䍋 ā䖭ϔ ˈԚSD/MMC 䰸Ā䍋 ā ⱘsds.erase_uint DŽ1.6.3 㗗1. main.c ӊЁ Ⳍ ӊ Н ⫼ ⱘ 䞣DŽ ⏙ 1.14⼎DŽ ⏙ 1.14 Ⳍ ӊ НⳌ 䞣#include "config.h"#define TASK_STK_SIZE 64 (1)Ҹ*/ (2)/*CMD_SD_INIT 0x00#define#define CMD_SD_READ 0x01 /* 䇏 Ҹ*/ #define CMD_SD_WRITE 0x02 /* Ҹ*/ #define CMD_SD_ERASE 0x03 /* 䰸 Ҹ*/ #define CMD_DATA_TRANS 0x04 /* sd_bufЁⱘ 䗕 PC */ #define CMD_DATA_RECV 0x05 /* 㞾І ⱘ , sd_bufЁ */ /* SD/MMC 䇏 㓧 ,↨SD/MMC ϔϾ 8 㡖 */uint8sd_buf[520]; (3) ⏙ 1.14(1) Нњӏ Փ⫼ⱘ ˈ ⏙ 1.14(2)ЎPC 䗕ⱘ Ҹ ⱘ Ҹ Нˈ ⏙ 1.14(3)ЎSD/MMC 䇏 Փ⫼ⱘ㓧 ˈ䆹㓧 ↨SD/MMC ⱘϔϾ 8Ͼ 㡖ˈ䖭ḋ НⱘⳂⱘ ЎњІ ⱘ ˄І ⱘ ҹ8Ͼ 㡖Ў Ё 㾺 ⏅ ˅DŽ2. Н ӏ ⱘ UART0 䚂ㆅˈ ⏙ 1.15 ⼎DŽ ⏙ 1.15 䚂ㆅ НO S_STK TaskStk[TASK_STK_SIZE]; /* ӏ */ O S_STK TaskCardStk[TASK_STK_SIZE]; /* ӏ */І 䚂ㆅ*//*S_EVENT*Uart0ReviceMbox;3.㓪 Џ main()ˈ ⏙ 1.16 ⼎DŽ њ ㋏㒳䖤㸠ⱘϔϾӏ TaskCard ()ˈ ⏙ 1.16(1) ⼎DŽ ⏙ 1.16 main()int main (void){O SInit();OSTaskCreate(TaskCard, (void *)0, &TaskCardStk[TASK_STK_SIZE - 1], 0); (1) OSStart();return 0;}4.㓪 ӏ TaskCard()ˈ䆹 Ўmain() ⱘ1Ͼӏ ˈⳌ ⹀ӊ˄ ⏙ 1.17(3)˅ˈ ゟІ 䚂ㆅ˄ ⏙ 1.17(1)⼎˅ ӏ ˄ ⏙ 1.17(2) ⼎˅ˈ ӏ Ў ӏ DŽ ⏙ 1.17 ӏvoid TaskCard(void *pdata){uint8 *pRec;uint8 err;uint32 bufaddr,blockaddr,blocknum;pdata = pdata; /* 䙓 㓪䆥䄺 */Uart0ReviceMbox = O SMboxCreate(NULL); /* ゟ䚂ㆅ*/ (1) if (Uart0ReviceMbox == NULL)while (1);O STaskCreate(TaskUart0Revice, (void *)0,&TaskStk[TASK_STK_SIZE - 1], 10); /* Uart0 ӏ */ (2) TargetInit(); /* Ⳃ */ (3)for (;;){pRec = (uint8 *)O SMboxPend(Uart0ReviceMbox, 0, &err); /* */ (4) switch(pRec[0]) (5) {case CMD_SD_INIT: pRec[1] = SD_Initialize(); /* */ (6)break;case CMD_SD_READ: (7) blockaddr = (pRec[1] << 24) + (pRec[2] << 16) + /* 䅵ㅫ */+pRec[4];<<8)(pRec[3]pRec[1] = SD_ReadBlock(blockaddr, sd_buf); /* 䇏 */ break;case CMD_SD_WRITE:blockaddr = (pRec[1] << 24) + (pRec[2] << 16) ++pRec[4];8)(pRec[3]<<pRec[1] = SD_WriteBlock(blockaddr, sd_buf); /* */ break;case CMD_SD_ERASE:blockaddr = (pRec[1] << 24) + (pRec[2] << 16) +(pRec[3] << 8) + pRec[4]; /* 䍋 */ blocknum = (pRec[5] << 16) + (pRec[6] << 8) +(pRec[7]); /* */ pRec[1] = SD_EraseBlock(blockaddr, blocknum); /* 䰸 */ break;case CMD_DATA_RECV:bufaddr = (pRec[1] << 8) + pRec[2]; /* 䅵ㅫ㓧 */memcpy(sd_buf + bufaddr, &pRec[3], 5); /* pRec */ break;case CMD_DATA_TRANS:bufaddr = (pRec[1] << 8) + pRec[2]; /* 䅵ㅫ㓧 */memcpy(&pRec[1], sd_buf + bufaddr, 7); /* sd_buf pRec */ break;default: break;}UART0Write(pRec, 8); /* 䗕 */ (8) }} ⏙ 1.17(4) 䚂ㆅㄝ І ӏ TaskUart0Revice() 䚂ӊˈ䚂ӊЎ ⱘ ⱘ㓧 䍋 pRecDŽ ⏙ 1.17(5) 䚂ㆅЁ ˈг PC ⱘϔϾ Ҹ ˈ Ҹ ⱘ1Ͼ㡖Ў Ҹ ˈ䙷М 㸠 Ͼ Ҹ DŽ ⏙ 1.17(6) 㸠 Ҹ ˈ 㸠㒧 ѢpRec[1]ЁDŽ ⏙ 1.17(7) 㸠䇏 Ҹ ˈ 䅵ㅫ ˈ✊ 䇏 ⱘ ˈ䇏 ⱘѢ 㓧 sd_buf[]Ёˈ䇏 ⱘ䖨 ѢpRec[1]ЁDŽҸ ˈ ǃ ⱘ 䇏 Ҹ ⱘ 㸠 ⧚гϔḋDŽ ⏙ 1.17(8) ⱘ 㸠㒧 䗮䖛І Ё䯈ӊ 䗕 PC DŽ5.UART0 ӏ DŽ ⏙ 1.18(1) ⼎ˈ䆹ӏ 䇗⫼І Ё䯈ӊⱘ㡖 UART0Getch()ㄝ 㞾PC ⱘ ˈ ˈ䙷МҢІ ⱘ㓧 䇏 8Ͼ 㡖ˈ䇏 ⱘ ѢBuf[]ЁDŽ✊ Buf[]ⱘ 䚂ㆅUart0ReviceMboxЁ˄ ⏙ 1.18(2) ⼎˅䗮ⶹ ӏ TaskCard()˖њˈ Buf[]ЁDŽ䖭ḋ ӏ ҹḍ ⱘ 䖯㸠ⳌњDŽ ⏙ 1.18 U ART0 ӏvoid TaskUart0Revice(void *pdata){uint8 Buf[4],i;pdata = pdata; /* 䙓 㓪䆥䄺 */for (;;){Buf[0] = UART0Getch(); /* */ (1) for (i = 1; i < 8; i++)Buf[i] = UART0Getch();O SMboxPost(Uart0ReviceMbox, (void *)Buf); (2) }}ҹϞ՟ Ёˈ Ͼ Ϣ Ⳍ ˈ 䚼 䇁 䛑 ⧚PC ϢLPC2103П䯈ⱘ 䗮 ˈҹ 䇗 ⱘ ⾡ DŽ ՟ ϡҙ㒭 њ SD/MMC䇏 API ⱘՓ⫼ ⊩ˈ䖬⼎՟њ ԩՓ⫼ Ͼ Ё䯈ӊ 㒘 ϔϾ DŽ1.7 SD/MMC䕃ӊ ⫼ 㒧ZLG/SDⱘ䬔/ 䕃ӊ ҟ㒡 ℸˈ⫼ ҹ 䰙 ⫼Ё ⫼ 䕃ӊ ˈ䞛⫼Ⳉ 䇗⫼API ⫼ ⱘ ⊩ ⦄䇏ǃ ǃ 䰸SD/MMC ㄝ DŽ。
sd 协议

sd 协议SD协议(Secure Digital Protocol)是一种用于在存储设备和电子设备之间进行数据传输和通信的标准协议。
SD协议的发展标志着存储技术的进步和电子设备的智能化。
SD协议的最初版本是在1999年发布的,后来陆续推出了多个版本,包括SDHC协议、SDXC协议和SDUC协议等。
这些协议的不断更新和完善,使SD卡的存储容量不断扩大,同时保证数据传输的速度和稳定性。
SD协议的实现主要依靠两个要素:硬件接口和软件协议。
硬件接口是指SD卡和设备之间的物理连接,包括引脚和接口规范等。
软件协议则是指存储设备和设备间进行数据传输和通信时所需要遵循的规则和约定。
在SD协议中,数据的传输是通过指令和应答来完成的。
首先,设备发送指令给SD卡,指令可能包括读取数据、写入数据、擦除数据等操作。
SD卡接收到指令后,进行相应的处理并返回应答给设备。
设备接收到应答后,根据应答的结果进行下一步的操作。
为了保证数据的安全性和完整性,SD协议还支持数据加密和校验功能。
设备在写入数据时,可以选择进行数据加密,以防止数据泄露。
在读取数据时,设备可以对数据进行完整性校验,以确保数据的准确传输。
SD协议的应用非常广泛,几乎所有的数码设备和移动设备都支持SD卡扩展存储。
例如,相机、手机、平板电脑等设备都可以使用SD卡来进行数据存储和传输。
同时,SD卡也被广泛应用于一些特殊领域,如工业控制、车载设备等。
SD协议的优势在于其高速、高容量和可靠性。
通过不断的技术革新和发展,SD协议的存储容量从最初的几十兆字节,发展到现在的几十TB。
同时,SD协议的传输速度也从最初的几MB/s,提高到现在的几百MB/s。
这些优势使得SD卡成为了存储设备中的主流产品。
总之,SD协议是一种用于存储设备和电子设备之间进行数据传输和通信的标准协议。
通过不断的技术发展和创新,SD卡的容量和传输速度不断提升,为用户提供更高效、更可靠的数据存储和传输解决方案。
SD卡协议描述

上周看了卡的识别模式后,现在看看卡的数据传输模式,这是最重要的模式,勿庸置疑。
因为一些卡可能有时钟限制,fpp必须保持在fod,直到CSD寄存器被host读取。
host发出SEND_CSD(CMD9)来得到一些卡的专用数据,比如block length等等。
CMD7可以将卡置在传输模式。
只有一个卡可以在一个时间内在这个状态。
如果一个之前的卡在这个状态,那么与host的连接将会释放,并且回到stand-by 模式,当CMD7被发出保留相关卡地址0x0000,所有的卡传输都回到stand-by 状态。
这个可以用来识别新插入卡,并且不会重置以及注册的卡。
以及有RCA的卡,不需要对识别命令相应。
*取消选择发生在一个特定的卡在重试CMD7的时候,发现RCA不匹配。
在另外一个卡和CMD线通用的时候,会自动发生。
因此,在SD卡系统中,系统需要负责做二选其一的事情。
-初始化后,通过公用CMD线工作,在这个情况下,取消选择会自动发生-有意识去取消选择,如果CMD线是分开的所有的数据通信在数据传输模式都是点对点的。
所有的命令都会有个在CMD线上的相应。
下面我们看下卡里的命令。
1 停止命令CMD12,能够忽略所有的读命令在任何时候,数据传输会中止,并且卡会返回到传输状态,读命令能够阻止块读CMD17,多块读CMD18,发送写保护CMD30,发送SCR ACMD51,和general命令在读模式中CMD56。
2 停止命令CMD12,能够中止所有的数据写命令在任何时候。
写命令必须在取消选择CMD7之前停止。
写命令被块写CMD24、CMD25,写CSD(CMD27),锁和解锁(CMD42),和在写模式的通用命令(CMD56)阻止。
3 当数据传输完成的时候,sd卡会在数据写状态。
之后如果写成功了,那么就去编程状态,如果失败了,就去传输状态。
4 如果block写操作被停止,并且block长度的crc是有效的,数据会被写入。
5 卡可以提供块写入的缓冲,下一个块可以在之前的块被写入的时候往卡里发送,如果所有的卡buffer都满了的话,sd卡就会在编程状态,DAT0线会被拉低6 没有buffer提供给写CSD,写保护,和擦除。
SanDisk SD Card产品手册之四SD卡协议描述续二

上周看了卡的识别模式后,现在看看卡的数据传输模式,这是最重要的模式,勿庸置疑。
因为一些卡可能有时钟限制,fpp必须保持在fod,直到CSD寄存器被host读取。
host发出SEND_CSD(CMD9)来得到一些卡的专用数据,比如block length等等。
CMD7可以将卡置在传输模式。
只有一个卡可以在一个时间内在这个状态。
如果一个之前的卡在这个状态,那么与host的连接将会释放,并且回到stand-by 模式,当CMD7被发出保留相关卡地址0x0000,所有的卡传输都回到stand-by 状态。
这个可以用来识别新插入卡,并且不会重置以及注册的卡。
以及有RCA的卡,不需要对识别命令相应。
*取消选择发生在一个特定的卡在重试CMD7的时候,发现RCA不匹配。
在另外一个卡和CMD线通用的时候,会自动发生。
因此,在SD卡系统中,系统需要负责做二选其一的事情。
-初始化后,通过公用CMD线工作,在这个情况下,取消选择会自动发生-有意识去取消选择,如果CMD线是分开的所有的数据通信在数据传输模式都是点对点的。
所有的命令都会有个在CMD线上的相应。
下面我们看下卡里的命令。
1 停止命令CMD12,能够忽略所有的读命令在任何时候,数据传输会中止,并且卡会返回到传输状态,读命令能够阻止块读CMD17,多块读CMD18,发送写保护CMD30,发送SCR ACMD51,和general命令在读模式中CMD56。
2 停止命令CMD12,能够中止所有的数据写命令在任何时候。
写命令必须在取消选择CMD7之前停止。
写命令被块写CMD24、CMD25,写CSD(CMD27),锁和解锁(CMD42),和在写模式的通用命令(CMD56)阻止。
3 当数据传输完成的时候,sd卡会在数据写状态。
之后如果写成功了,那么就去编程状态,如果失败了,就去传输状态。
4 如果block写操作被停止,并且block长度的crc是有效的,数据会被写入。
5 卡可以提供块写入的缓冲,下一个块可以在之前的块被写入的时候往卡里发送,如果所有的卡buffer都满了的话,sd卡就会在编程状态,DAT0线会被拉低6 没有buffer提供给写CSD,写保护,和擦除。
sd express原理

sd express原理
SD Express是一种新一代存储卡接口标准,它结合了PCI Express(PCIe)和NVMe协议,具有高速数据传输和低延迟
的特点。
SD Express的原理如下:
1. PCIe接口:SD Express使用PCIe 3.0或更高版本的接口标准,支持多通道和多线程传输。
PCIe接口提供了高带宽和高
速度的数据传输能力。
2. NVMe协议:SD Express使用NVMe(Non-Volatile Memory Express)协议,它是为固态硬盘设计的一种高性能、低延迟
的存储接口协议。
NVMe协议能够更有效地管理和访问存储设备,提供更好的性能和响应时间。
3. UHS-II总线:SD Express的物理层采用了UHS-II总线,它
是SD卡的一种高速传输标准,能够支持更快的数据传输速度。
UHS-II总线支持多个数据通道和更高的电压,提供了更好的
性能表现。
4. 兼容性:SD Express保持与传统SD卡的兼容性,可以支持SDHC、SDXC等标准。
这意味着SD Express可以插入现有的SD卡读卡器中,并与现有的设备兼容。
总的来说,SD Express通过结合PCIe和NVMe协议,利用高
速的数据传输接口和低延迟的存储协议,提供了更快、更高性
能的存储解决方案。
它可以在相机、移动设备和电脑等各种设备中使用,提供更高的存储容量和更快的数据传输速度。
SD2.0协议标准完整版[1-6章中文翻译]
![SD2.0协议标准完整版[1-6章中文翻译]](https://img.taocdn.com/s3/m/6963f0cabb4cf7ec4afed05a.png)
3.5.1 SD 总线
图 3-2 SD 卡总线拓扑 SD 总线包含下面的信号: CLK: 时钟信号 CMD: 双向命令/响应信号 DAT0-DAT3: 双向数据信号 Vdd,Vss1,Vss2: 电源和地信号 SD 卡总线有一个主(应用),多个从(卡),同步的星型拓扑结构(图 3-2)。时钟,电源和 地信号是所有卡都有的。命令(CMD)和数据(DAT0-3)信号是根据每张卡的,提供连续地点对 点连接到所有卡。 在初始化时, 处理命令会单独发送到每个卡, 允许应用程序检测卡以及分配逻辑地址给 物理卡槽。数据总是单独发送(接收)到(从)每张卡。但是,为了简化卡的堆栈操作,在初始 化过程结束后,所有的命令都是同时发送到所有卡。地址信息包含在命令包中。 SD 总线允许数据线的动态配置。上电后,SD 卡默认只使用 DAT0 来传输数据。初始化之 后, 主机可以改变总线宽度(使用的数据线数目)。 这个功能允许硬件成本和系统性能之间的 简单交换。
注意:当 DAT1-DAT3 没有使用的时候,相关的主机 DAT 先应该被设置为输入模式。SDIO 卡 DAT1 和 DAT2 用于信令。
3.5.2 SPI 总线
SD 卡的 SPI 兼容通信模式是用来同 SPI 信道通信,主要是用在市场是哪个的各种微处 理器。模式选择是在上电后的第一次 reset 命令期间,并且只要不断电就不能改变。SPI 标 准只是定义了物理连接,没有完成数据传输协议。SD 卡的 SPI 实现使用了 SD 模式相同的命 令。从应用的角度来说,SPI 模式的优点是使用现成主机的能力,从而减小设计压力。相对 于使能宽总线选项的 SD 卡来说,缺点是性能的损失。SD 卡 SPI 接口同市场上现有的 SPI 主 机兼容。同其他 SPI 设备一样,SD 卡的 SPI 信道有以下 4 个信号: CS: 主机到卡的片选(chip select)信号 CLK: 主机到卡的时钟信号 DataIn: 主机到卡的数据信号 DataOut: 卡到主机的数据信号 另一个 SPI 的通用特点是字节传输,这也是卡的实现。所有的数据都是字节(8 bit)的 整数倍,并且直接总是对齐 CS 信号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一概述1. SD总线模式下CLK:时钟信号CMD:双向命令和响应信号DAT0-3:双向数据信号VDD,VSS:电源和地信号SD模式下允许有一个主机, 多个从机(即多个卡), 主机可以给从机分别地址. 主机发命令有些命令是发送给指定的从机,有些命令可以以广播形式发送.SD模式下可以选择总线宽度, 即选用几根DAT信号线, 可以在主机初始化后设置.2. SD总线协议SD模式下的命令和数据流都有一个开始位和结束位.>命令: 是在CMD上传输的用于启动一个操作的比特流. 由主机发往从机, 可以是点对点也可以是广播的.>响应: 是在CMD上传输的用于之前命令回答的比特流. 由从机发往主机.>数据: 是在DAT上传输的比特流, 双向传输.无响应模式 无数据模式多块读操作模式多块写操作模式命令格式响应格式数据格式SD卡上电后会自动初始化,通过给卡发送CMD0也可以复位卡.二.SD卡命令描述.1.广播命令:给所有卡都发送, 某些命令需要响应.2.点对点命令给指定地址的卡发送, 需要响应.SD卡系统有两种工作模式:1.卡识别模式.主机上电复位后即处于此模式,它会在总线上等待卡. 卡复位后也处于此模式, 直到SEND_RCA(CMD3)命令到来.2.数据传输模式.卡收到SEND_RCA(CMD3)命令后即进入此模式. 主机识别到卡后也进入此模式.卡状态和工作模式对照表1.卡识别模式.此模式下主机复位总线所有的卡, 验证工作电压, 询问卡的地址. 这个模式下所有数据的传输都是只通过CMD线来完成.1)卡的复位.当卡上电或收到GO_IDLE_STATE (CMD0)命令后, 卡即进入Idle State状态. 此时卡将其RCA设为0, 相关寄存器设为传输稳定的最优模式.2)工作电压验证每个卡的最高和最低工作电压存储在OCR. 只有当电压比配时, CID和CSD的数据才能正常传输给主机.SD_SEND_OP_COND (ACMD41)命令用来判断卡的工作电压是否符合, 如果不符合的话, 卡应该放弃总线操作, 进入Inactive State状态. 在发送SD_SEND_OP_COND (ACMD41)命令前记得要首先发送APP_CMD (CMD55).卡的状态变换图.ACMD41命令响应中的BUSY位也用于卡表示其还没准备好, 主机此时应重发ACMD41命令,直到卡准备好.主机在这个阶段的ACMD41中不允许改变工作电压, 如果确实想改变的话, 应该先发送CMD0, 然后再发送改变后的ACMD41.GO_INACTIVE_STATE (CMD15)命令用于使指定地址的卡进入Inactive State模式.3)卡识别过程.ALL_SEND_CID (CMD2)命令用于获取卡的CID信息, 如果卡处于Ready State, 它就会在CMD线上传送它的CID信息, 然后进入Identification State模式. 紧接着发送CMD3 (SEND_RELATIVE_ADDR)命令, 用于设置卡新的地址. 卡收到新的地址后进入Stand-by State 模式.2.数据传输模式.数据传输模式下卡的状态转变图进入数据传输模式后, 主机先不停的发送SEND_CSD (CMD9)命令获取卡的CSD信息. SET_DSR (CMD4)用于设置卡的DSR寄存器, 包括数据总线宽度, 总线上卡的数目, 总线频率, 当设置成功后, 卡的工作频率也随之改变. 此步操作是可选的.CMD7命令用于使指定地址的卡进入传输模式, 任何指定时刻只能有一个卡处于传输模式.传输模式下所有的数据传输都是点对点的, 并且所有有地址的命令都需要有响应..所有读命令都可以由CMD12命令停止,之后卡进入Transfer State. 读命令包括单块读(CMD17), 多块读(CMD18), 发送写保护(CMD30), 发送scr(ACMD51)和读模式一般命令(CMD56)..所有写命令都可以由CMD12命令停止. 写命令包括单块读(CMD24), 多块读(CMD25), 写CID(CMD26), 写CSD(CMD27),锁和解锁命令(CMD42)和写模式一般命令(CMD56)..当写命令传输完成后, 卡进入Programming State(传输成功)或Transfer State(传输失败).如果一个卡写操作被停止,但其前面数据的CRC和块长度正确, 数据还是会被写入..卡要提供写缓冲, 如果写缓冲已满并且卡处于Programming State, DAT0保持低BUSY. .写CID,CSD, 写保护, 擦除命令没有缓冲, 当这些命令没完时, 不应发送其他的数据传输命令..参数设置命令在卡被编程时是不允许发送的, 这些命令包括设置块长度(CMD16), 擦除块起始(CMD32)和擦除块结束(CMD33)..当卡正编程时读命令是禁止的..用CMD7使另一个卡进入Transfer State不会终止当前卡的编程和擦除, 当前卡会进入Disconnect State并且释放DAT线.. Disconnect State模式的卡可通过CMD7重新被选中,此时卡进入Programming State 并且使能busy信号.. CMD0或CMD15会终止卡的编程操作, 造成数据混乱, 此操作应禁止.1)总线宽度选择命令ACMD6命令用于选择总线宽度, 此命令只有在Transfer State有效. 应在CMD7命令后使用.2)块读命令块是数据传输的最小单位, 在CSD (READ_BL_LEN)中定义, SD卡为固定的512B.每个块传输的后面都跟着一个CRC校验. CMD17(READ_SINGLE_BLOCK)用于传输单个块,传输完之后,卡进入Transfer State. CMD18 (READ_MULTIPLE_BLOCK)用于多个块的传输,直到收到一个CMD12命令.3)块写命令与块读命令类似, 每个块传输的后面都跟着一个CRC校验.卡写数据时会进行CRC校验.多块写比重复的单块写更能提高效率.如果CSD中的WRITE_BLK_MISALIGN没设置, 并且发送的数据不是块对齐的, 卡会设置状态寄存器中的ADDRESS_ERROR位,并且进入Receive-data-State状态等待停止命令.此时写操作也会停止, 并且卡会设置其的WP_VIOLATION位.如果写缓冲满的话, 卡会停止接受WRITE_BLOCK命令. 此时主机应发送SEND_STATUS (CMD13)命令, 卡返回数据的READY_FOR_DATA位标志卡是否准备好接受新的数据.在多块写操作中通过事先发送ACMD23命令可提高写速度. ACMD23用于定义接下来要写数据的块的数目. 每次多块写操作后, 这个值又被设为默认的1.ACMD22会使卡返回写成功的块数目.4)擦除命令擦除命令的顺序是: ERASE_WR_BLK_START(CMD32),ERASE_WR_BLK_END(CMD33)and ERASE (CMD38).如果(CMD38或(CMD32, 33)接收到出错信息, 卡会设置状态寄存器中的ERASE_SEQ_ERROR 位并且重新等待新的命令时序.如果接收到时序错误命令, 卡会设置其ERASE_RESET位并且重新等待新的命令时序.5)写保护管理三种机制:-.写保护物理开关-.卡内部写保护通过设置CSD中的WP_GRP_ENABLE位和WP_GRP_SIZE位, SET_WRITE_PROT和CLR_WRITE_PROT命令用来设置和清除保护机制.-. 密码保护.三. 时钟控制如果主机要发送1K的数据, 但是主机缓冲区只有512B, 那么主机可以在发送完前512B 后, 可以先停止时钟, 然后把后512B填充入缓冲区, 再启动时钟, 这样卡并不会检测要两次发送之间的间隔, 认为其是一次完整的数据发送过程.四 CRC校验1.CRC7CRC7用于所有的命令, 除R3以外的响应, 以及CID和CSD寄存器.2.CRC16CRC16用于数据块的校验五. 错误类型.1. CRC错误和命令非法错误命令的CRC校验出错, 卡设置其状态寄存器的COM_CRC_ERROR位.非法命令错误, 卡设置其状态寄存器的ILLEGAL_COMMAND位.非法命令包括:不支持的命令,未定义的命令以及当前状态不支持的命令.2. 读,写和擦除超时.卡应该在指定的时间内完成一个命令或返回移动的错误信息. 如果在指定的超时时间内主机收不到响应, 应认为卡停止工作, 应重新复位卡.六 命令1. 命令类型:- bc不需要响应的广播命令.- bcr需要响应的广播命令. 每个卡都会独立的接收命令和发送响应.- ac点对点命令, DAT线上没数据- adtc点对点命令, DAT线上有数据所有命令均遵守上图中的格式, 总共48位. 首先是1个起始位0, 接着是1个方向位(主机发送位1), 6个命令位( 0-63 ), 32位参数(有些命令需要), CRC7位校验, 1个停止位.2.卡命令根据不同的类型分成了不同的Class, 见下表,其中Class0,2,4,5,8是每个卡都必须支持的命令, 不同的卡所支持的命令保存在CSD中.3.命令详细描述 1)基本命令Class02)读命令Class23)写命令Class43)擦除命令Class54)应用特定命令Class8下表中的所有命令使用前都应先跟一个APP_CMD(CMD55)命令七. 卡状态转换表八. 应答.所有的应答都是通过CMD发送,不同的应答长度可能不同.总共有四种类型的应答.1. R1: 长度位48位.注意每个块传输完成后有一个BUSY位.2.R1b:与R1类似, 只是将BUSY位加入响应中.3.R2(CID CSD寄存器) : 长度为136位, CID为CMD2和CMD10的应答, CSD为CMD9的应答.4.R3(OCR寄存器):长度位48位. 作为ACMD41的应答.5.R6(RCA地址应答):长度为48位九. 卡的状态SD卡支持两种状态:-卡状态:与MMC卡兼容.-SD卡状态:扩充到了512位.1.卡状态:R1应答包含一个32位的卡状态.见下表.其中Type中的含义为:E:错误位. S:状态位. R:根据命令在响应中设置.X:根据在命令执行期间设置, 必须再次读此位才能获得命令执行后的情况.Clear Condition:A: 与卡的当前状态有关B: 总是与命令有关,无效的命令会清除此位.C: 通过读此位来清除下表指明了哪些命令可能使哪些位产生变化2.SD卡状态:这些位通过DAT线传输, 并伴有CRC16校验. 其是作为ACMD13的应答.十. 卡存储器形式.-块:块是基本读写命令的单位,它可以是固定的或可变的. 关于块的大小以及其是否可变性存储在CSD中.-扇区:扇区是擦除命令的单位, 它是固定的值,保存在CSD中.十一. 时序图时序图中字母含义:1.命令和应答1)卡识别和卡工作电压确认模式:CMD2,ACMD412)地址分配模式:CMD33)数据传输模式:4)命令结束->下一个命令:5)两个命令直接1)单块读:CMD172)多块读:读过程时序.停止命令时序 3.数据写1)单块写:注意Busy信号.2)多块写:多块写命令时序停止命令时序卡主动停止时的时序十二.寄存器.SD卡有六个寄存器OCR, CID, CSD, RCA, DSR and SCR. 其中前四个保存卡的特定信息, 后两个用来对卡进行配置.1.OCR寄存器:保存有卡支持的工作电压, 支持的话相应的位置1,否则为0.2.CID:保存有卡的身份信息.3.CSD保存有如何访问卡的信息.TAAC定义了数据访问的异步时间部分. NSAC为数据访问最坏需要的异步时间.TRAN_SPEED定义了单条DAT线上的最快速度:CCC:SD卡支持的命令集READ_BL_LEN:最大读块长度. WRITE_BL_LEN等于READ_BL_LENDSR_IMP: DSR寄存器是否允许配置, 1为允许,0为不允许.FILE_FORMAT: SD卡上的文件格式.4.RCA保存有卡的地址信息.5.DSR用于配置卡, 默认值为0x4046.SCR寄存器也保存有卡的特定信息.SD_BUS_WIDTHS指明卡支持的传输类型.第二部分 S3C2410 SD卡控制器一 SDI操作1.CPU寄存器设置过程.1)正确设置SDICON寄存器.2)正确设置SDIPRE寄存器.3)等待74个时钟信号初始卡.2.CMD命令发送过程.1)向SDICARG寄存器中写入发送的参数.2)确定命令类型并且通过设置SDICCON[8]来启动命令.3)确定命令是否发送完成. 没应答的话看SDICSTA[11], 有应答的话看SDICSTA[9].4)清除SDICSTA中的相应位.3.数据传输过程.1)向SDITIMER中写入超时值.2)向SDIBSIZE中写入块大小的值.3)设置块模式,总线宽度等, 通过SDIDCON启动传输.4)通过SDIFSTA检查TxFIFO是否可用, 再通过SDIDAT写入发送数据.5)通过SDIFSTA检查RxFIFO是否可用, 再通过SDIDAT读入接收数据.6)通过检查SDIDSTA[4]确定传输过程已完成.7)清除SDIDSTA中的相应位.4. SDIO有两种工作模式,中断和读等待模式.二. SDI寄存器.1.SDICON:SDI控制寄存器字节序类型:Type A: D[7:0] D[15:8] D[23:16] D[31:24]Type B: D[31:24] D[23:16] D[15:8] D[7:0]2.SDIPRE:波特率预分频寄存器.4. SDICCON:SDI命令控制寄存器.5. SDICSTA:SDI命令状态寄存器.6.SDIRSP0-SDIRSP3:命令响应寄存器8. SDIBSIZE:SDI块大小寄存器.9. SDIDCON:SDI数据控制寄存器10. SDIDCNT:SDI数据维持寄存器.12. SDIFSTA:SDI FIFO状态寄存器13. SDIDAT:SDI数据寄存器。