sd卡数据传输协议

合集下载

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卡协议书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卡的传输协议和读写程序

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 SD῵SD῵ ϟˈЏ Փ⫼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 SPI῵SPI῵ ϟˈЏ Փ⫼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 协议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卡协议描述

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卡协议描述续二

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原理
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章中文翻译]

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 信号。

sd卡协议(中文)

sd卡协议(中文)

数据包的封装与命令协议相关1 sd 卡指令数据包sd 卡的指令被封装成48位的数据包,每次传送这48位的数据包。

数据包的内容包括起始位、结束位、传输位、命令索引、传输参数和7位CRC 校验码。

其具体格式分布如下图 Bit 位置 47 46 [45:40] [39:08] [07:01] 00 Bit 宽度 1 1 6 32 7 1 值 “0” “1” x x x “1”说明Start bit Transmission bit CommandindexArgument CRC7 End bit其中的命令索引位是[45:40],里面可以封装各种命令,具体的命令表将在下面给出。

不同的命令会对应不同的回应(respond),回应有三种(R1,R2,R3)格式,在命令表中的选项会给出。

2 sd 卡命令索引表 CMD 简略语 指令说明 SPI 模式自变量 回应0 GO_IDLE_STATE 这是使card 初始化到Idle 状态的指令.CS 信号设在Low 的状态时,接到本指令后,card 将转换到SPI 模式.None R11 SEND_OP_COND 接到本指令后,card 将做R3回应(含有OCR 数据).根据OCR 值,可以得知card 能工作电压范围.OCR 数据最高值位的1bit 是用来确认card 内部处理是否结束(Ready/Busy 轮询).None R12 ALL_SEND_CID 接到本指令后, 处于Ready 状态的card 将传送CID 数据.在MMC 模式下,数据被送到CMD 信号,在CID数据的每1bit传送后,CMD信号状态将与该card内部状态相比较,如果不一致,將中止数据传送,card返回到Ready状态.如果相一致,该card 将认为已被选中,然后转换到Identification 状态.3 SET_RELATIVE_ADDR 本指令会为已转换到Identification状态的card分配一个相对card地址(RCA).当RCA分配后,card将转换到Stand-by 状态,对以后的CMD2和CMD3不回应.4 NOP 这是用来设定DSR(DriveState寄存器)的指令,但是本car不支持DSR.7 SELECT/DESELECT_CARD本指令是用来选择一张card,让它在Stand-by状态和Transfer状态之间转换的指令.如果给card设定已分配到的RCA地址,card将从Stand-by状态转换到Transfer状态,并将回应以后的读取指令及其他指令.如果给card设定RCA以外的地址,card将转换到Stand-by状态。

sdio协议

sdio协议

sdio协议介绍SDIO(Secure Digital Input Output)协议是一种用于在设备之间进行数据传输的协议。

它是SD卡标准的一部分,用于在SD卡和主机设备之间进行数据通信。

SDIO协议支持高速数据传输和多种不同类型的设备连接,包括无线网络适配器、蓝牙模块、GPS接收器等。

SDIO协议的特点1.高速数据传输:SDIO协议支持高达50MHz的数据传输速率,可以实现快速的数据读写操作。

2.多设备连接:SDIO协议可以同时连接多个设备,通过多个数据线同时进行数据传输,提高通信效率。

3.灵活性:SDIO协议支持多种不同类型的设备连接,可以通过插入不同的设备实现不同功能的扩展,提高设备的可扩展性。

4.低功耗:SDIO协议在数据传输过程中采用了低功耗模式,可以有效地延长设备的电池寿命。

SDIO协议的使用场景SDIO协议广泛应用于各种设备中,特别是移动设备和嵌入式系统中。

以下是一些SDIO协议的使用场景:1.无线网络适配器:通过使用SDIO协议连接无线网络适配器,可以实现移动设备的无线联网功能,方便用户随时随地访问互联网。

2.蓝牙模块:通过使用SDIO协议连接蓝牙模块,可以实现设备之间的无线数据传输和通信,方便用户进行文件传输、音频传输等操作。

3.GPS接收器:通过使用SDIO协议连接GPS接收器,可以实现设备的定位功能,方便用户获取位置信息和导航。

4.摄像头模块:通过使用SDIO协议连接摄像头模块,可以实现设备的拍照和录像功能,方便用户进行影像捕捉和分享。

SDIO协议的工作原理SDIO协议通过主机设备和SD卡之间的通信来实现数据传输。

主机设备发送指令给SD卡,SD卡根据指令执行相应的操作并返回结果。

以下是SDIO协议的工作原理:1.握手阶段:主机设备与SD卡之间进行握手,确认通信的建立。

主机设备发送握手命令给SD卡,SD卡返回应答信号。

2.命令传输阶段:主机设备发送命令给SD卡,SD卡根据接收到的命令执行相应的操作,并返回执行结果。

sd卡协议分析

sd卡协议分析

sdMmc目录第一章 SD卡系统概念 3§1.1 SD卡概述 3§1.2 SD卡的系统特征 3§1.3 SD卡的系统概念 4§1.4 SD卡的总线传输 6§1.5 SD卡的引脚 10§1.6 SD卡主要寄存器介绍 12§1.7 SD卡子系统结构 14第二章 SD卡初始化及状态转换 16§2.1SD卡状态及初始化过程 16§2.2SD卡数据传输过程 181.SD卡基础1.SD卡概述SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制,同时三个公司联合成立了SD协会,并制定SD卡相关的协议标准。

SD卡协议主要包括物理层协议、SD卡控制器设计手册、SDIO卡手册三部分。

其中SDIO指的是安全数字输入输出卡(Secure Digital Input and Output Card),是在SD标准上定义了一种外设接口,通过SD的I/O接脚来连接外围设备,并且通过SD上的 I/O数据接位与这些外围设备进行数据传输。

相关的一些设备为:GPS、相机、Wi-Fi、调频广播、条形码读卡器、蓝牙等。

SDIO本质上是一种接口,通过该接口可以连接一些其他功能的设备而非仅仅是存储设备。

1.2 SD卡的系统特征(SD物理层协议v2.0)∙针对移动和固定应用;∙存储容量:标准容量SD存储卡:最高2G高容量SD存储卡:2G以上(在该规范版本中,最高32G)∙电压范围:高电压SD存储卡—操作电压范围:2.7~3.6V双电压SD存储卡—操作电压范围:低电压范围(T.B.D)和2.7~3.6V∙分为只读卡和读/写卡;∙默认模式:时钟频率可在0~25MHz间变化,高达12.5MB/s 的接口速度(使用4条并行数据线) ;∙高速模式:时钟频率可在0~50MHz间变化,高达25MB/s 的接口速度(使用4条并行数据线) ;∙支持高速,电子商务和将来功能的转换功能命令;∙存储域错误纠正;∙读操作期间移去卡,内容不损坏;∙内容保护机制—符合SDMI标准的最高安全性;∙卡的密码保护(CMD42 - LOCK_UNLOCK);∙机械开关的写保护特性;∙内嵌的写保护特性(永久或暂时) ;∙卡检测(插入/移去) ;∙应用特定命令;∙舒适的擦除机制∙通信通道协议属性;∙SD存储卡外形尺寸:标准尺寸SD存储卡(32*24*2.1mm) 。

sd协议基本概念

sd协议基本概念

sd协议基本概念SD协议(Secure Digital Protocol)是一种用于存储卡(如SD 卡、SDHC卡、SDXC卡等)的通信协议,它定义了存储卡与主机设备(如相机、手机、电脑等)之间的接口和通信规则。

SD协议的基本概念包括:1. 物理层:SD协议定义了存储卡的物理接口,包括卡片上的引脚排列和电气特性。

SD卡通常使用SPI(Serial Peripheral Interface)或SDIO(Secure Digital Input/Output)接口进行通信。

2. 数据传输层:SD协议规定了数据如何在存储卡和主机设备之间传输。

它使用命令响应式数据传输机制,即主机设备发送命令到存储卡,存储卡响应命令并返回数据。

3. 应用层:SD协议定义了一系列的命令集,这些命令用于管理存储卡上的数据,包括文件的读取、写入、删除等操作。

此外,SD 协议还支持多种文件系统格式,如FAT12、FAT16、FAT32和exFAT。

4. 安全性:SD协议提供了数据加密和访问控制的功能,以保护存储在卡片上的数据不被未授权访问。

这些功能通常通过密码保护和加密算法实现。

5. 速度等级:随着技术的发展,SD协议也不断更新,支持更高的数据传输速度。

例如,UHS(Ultra High Speed)SD卡支持更高的读写速度,适用于需要高速数据传输的应用场景。

6. 兼容性:SD协议设计为向后兼容,这意味着新版本的SD卡可以被旧版本的主机设备使用,尽管可能无法发挥新版本的全部性能。

7. 电气特性:SD协议定义了存储卡的电气特性,包括工作电压、电流消耗、数据传输速率等。

SD协议的这些基本概念共同构成了存储卡的标准,使得不同厂商和不同型号的存储卡能够与各种主机设备兼容,并确保数据的安全和高效传输。

sdio协议

sdio协议

sdio协议SDIO协议。

SDIO(Secure Digital Input Output)是一种用于SD卡的扩展接口标准,它允许SD卡在不仅可以存储数据的同时,还可以进行输入输出操作。

SDIO协议在嵌入式系统和移动设备中得到广泛应用,为设备提供了更多的功能和灵活性。

SDIO协议的设计初衷是为了使SD卡能够支持更多的功能,比如无线通信、音频、视频、GPS等。

通过SDIO接口,SD卡可以像一个外部设备一样与主控制器进行通信,这为设备的功能扩展提供了便利。

SDIO协议在硬件接口上与SD卡的物理接口兼容,但在软件接口上有所不同。

SDIO协议定义了一套命令和数据传输的规范,使得SD卡可以通过SDIO接口进行数据的输入输出操作。

这些命令包括初始化、读写数据、中断处理等,通过这些命令,主控制器可以与SDIO设备进行通信,并实现各种功能。

在SDIO协议中,数据的传输是通过SDIO总线进行的。

SDIO总线包括一个时钟信号线和一个数据信号线,通过这两根信号线,SDIO设备可以与主控制器进行同步通信。

在数据传输过程中,主控制器通过时钟信号线控制数据的传输速度,而数据信号线则用于传输实际的数据。

SDIO协议还定义了一套中断处理机制,通过中断,SDIO设备可以向主控制器发出各种事件通知,比如数据传输完成、错误发生等。

这样,主控制器就可以及时处理这些事件,保证数据传输的可靠性和稳定性。

总的来说,SDIO协议为SD卡的功能扩展提供了良好的支持,使得SD卡不仅可以作为存储介质使用,还可以作为外部设备与主控制器进行通信。

在嵌入式系统和移动设备中,SDIO协议为设备的功能扩展提供了便利,为用户带来了更好的使用体验。

综上所述,SDIO协议是一种用于SD卡的扩展接口标准,它为SD卡的功能扩展提供了良好的支持,使得SD卡可以在嵌入式系统和移动设备中发挥更大的作用。

随着移动设备和嵌入式系统的不断发展,SDIO协议必将发挥越来越重要的作用,为设备的功能扩展和性能提升提供更多可能性。

SD3.0四个协议解读

SD3.0四个协议解读

SD3.0四个协议解读前⾯的⽂章提到过SD卡主要分为两个操作模式,⼀是初始化和识别操作模式。

还有⼀种就是这篇⽂章须要分析的传输数据模式啦。

传输数据模式:传输数据模式主要有六种状态,各⾃是Stand-by状态、Transfer状态、Sending-data状态、Receive-data状态、Programming状态、Disconnect状态。

这六种状态通过不同的Command就能够切换到某种状态,换句话说,这六种状态贯穿了整个传输数据模式。

要理解传输数据模式的流程,⽼衲觉得除了理解这六种状态,还须要对Commands有⼀定的了解。

越熟悉越好。

当然。

这并⾮叫你去背Commands。

好了。

我们来看看传输数据模式的流程框图:⽼衲我第⼀次看到这图的时候,简直看晕了,有⽊有!。

太恶⼼了吧,谁定义的协议。

敢不敢再复杂⼀点?没办法,做IT的就是苦逼,仅仅能慢慢⼀点点啃,在理解流程之前。

我们必须讲协议⾥的英⽂翻译⼀遍,然后结合流程图理解究竟是怎么⼀回事,最后结合代码来看,这才⼲真正明确传输数据的过程是怎么⼀回事,以下是对英⽂协议⾥传输数据模式的翻译:传输数据模式(翻译):在SD卡识别模式结束之前,控制器使⽤的时钟频率均为Fod。

在传输数据模式,控制器可能会使⽤Fpp频率。

控制器发送⼀条SSEND_CSD(CMD9)命令来获取SD卡CSD寄存器(Card Specific Data)⾥⾯的描写叙述值,譬如,块长度。

卡容量信息等。

⼴播命令SET_DSR(CMD4)配置全部识别卡的驱动段。

相应于应⽤总线LayOut(长度)。

卡的数量和传输数据频率,这个命令设置DSR寄存器。

时钟频率在那个点上也应该从Fod切换Fpp。

SET_DSR命令对Host和卡都是可选的。

CMD7 ⽤来选择⼀个卡并将它置于传输状态(Transfer state)。

在不论什么时间仅仅能有⼀个卡处于传输状态。

假设已有⼀个卡处于传输状态,它和主机的连接将释放,并返回到 Stand-by状态。

sd协议基本概念 -回复

sd协议基本概念 -回复

sd协议基本概念-回复什么是SD协议?SD协议(Secure Digital Protocol)是一种用于存储设备的通信协议,主要用于SD卡和相关设备之间的数据传输和控制。

SD协议定义了存储设备的物理接口和传输协议,以确保数据的安全和可靠性。

SD协议具有广泛的应用范围,包括数字相机、手机、平板电脑等便携式设备。

SD协议基本结构SD协议由多个层次构成,每个层次负责不同的功能。

下面将逐步介绍SD协议的基本结构。

1. 物理层(Physical Layer)物理层是SD协议的最底层,负责定义SD卡的物理接口和信号传输方式。

SD卡通常采用9针接口,其中7针用于数据传输,另外的两针用于电源和地线。

物理层规定了每个针脚的具体功能和信号的电压范围。

2. 数据链路层(Data Link Layer)数据链路层负责将物理层发送的bit流进行错误检测和纠正,并将数据分割成固定大小的数据块。

数据链路层还负责管理数据传输的流程控制和读写操作的顺序。

3. 逻辑层(Logical Layer)逻辑层是SD协议的核心,它定义了对存储设备的文件系统和数据访问方法。

逻辑层将存储设备划分为多个逻辑单元,每个逻辑单元称为一个“逻辑块”。

逻辑层负责管理逻辑块的分配、索引和访问权限等。

4. 文件系统层(File System Layer)文件系统层负责管理存储设备上的文件和目录。

它定义了文件的存储格式、目录的组织结构和文件的访问权限等。

文件系统层通常采用FAT(文件分配表)或exFAT(扩展文件分配表)格式。

SD协议的操作流程SD协议的操作流程包括初始化、读写数据和关闭等多个步骤。

下面将逐个步骤详细介绍。

1. 初始化(Initialization)在使用SD卡之前,需要对SD卡进行初始化。

初始化包括发送命令和参数,建立与SD卡的连接,并进行资源的分配和配置。

初始化的目的是为了确保存储设备能够正常工作。

2. 读取数据(Read Data)读取数据是SD协议中的常见操作。

SD卡协议-中文

SD卡协议-中文

一概述1. SD总线模式下CLK:时钟信号CMD双向命令和响应信号DAT0-3:双向数据信号VDD,VSS:电源和地信号SD模式下允许有一个主机,多个从机(即多个卡),主机可以给从机分别地址•主机发命令有些命令是发送给指定的从机,有些命令可以以广播形式发送•SD模式下可以选择总线宽度,即选用几根DAT信号线,可以在主机初始化后设置.2. SD总线协议SD模式下的命令和数据流都有一个开始位和结束位>命令:是在CMD上传输的用于启动一个操作的比特流•由主机发往从机,可以是点对点也可以是广播的.>响应:是在CMDk传输的用于之前命令回答的比特流•由从机发往主机•>数据:是在DAT上传输的比特流,双向传输.多块读操作模式多块写操作模式HMI 1cct-dfrom1Q 転DATCMD无响应模式无数据模式transr n*r tt. '1 --hM* ooE-mpS13T 31 a 'W EOom HT and rnntent: untimpnd BTC ad*Hg3"Ih DS-ane :^. pr;iecr*:i ;y ' DL ^F?O、4*1 CONTENTCRC1tat&l length MB bitsena oi站陛? 1rn.R3.RSR2 命令格式ranfTTfltir &1: D *13^ "BfiDDnse Mart &1: a V . B ^B DR MDDHS * rurronM EDHnBnd ttn<l 9lal 」目 irrfa ・P* A a 飞吁;RP3朝 OCR R3 p e9KH5B o 『RCA iRE-! p r otKl&d try i 中 1 CRC £TK"」Eend on.』衣列弓10 0 CONTENT1■total lengthMB hits•厂0 0 CONTENT=CID or CS 口CRC1tctil I#ngthv116 bitiV _— --------------------- •fifnrf M .ar.vfrys 1响应格式mm. &A T 3 DAT1 [nock lengthh 4al^aya *0" 4Standa^l DJS ;sny C A~0 胡書戈 0CRC 1block length4 ------------------------------------------------ 40 4X£3CRC10 2CRC 10 4Dfi3、CRC 10 DCRC1DAT2DATO数据格式 SD 卡上电后会自动初始化,通过给卡发送 CMD (也可以复位卡 .SD 卡命令描述.1. 广播命令:给所有卡都发送,某些命令需要响应. 2. 点对点命令给指定地址的卡发送,需要响应. SD 卡系统有两种工作模式: 1.卡识别模式主机上电复位后即处于此模式,它会在总线上等待卡•卡复位后也处于此模式,直到SEND_RCA(CMD命令至U来.2.数据传输模式.卡收到SEND_RCA(CMD命)令后即进入此模式•主机识别到卡后也进入此模式•卡状态和工作模式对照表1.卡识别模式•此模式下主机复位总线所有的卡,验证工作电压,询问卡的地址.这个模式下所有数据的传输都是只通过CMD线来完成.1) 卡的复位•当卡上电或收到GO_IDLE_STATE (CMD0命令后,卡即进入Idle State 状态.此时卡将其RCA设为0,相关寄存器设为传输稳定的最优模式.2) 工作电压验证每个卡的最高和最低工作电压存储在OCR.只有当电压比配时,CID和CSD的数据才能正常传输给主机.SD_SEND_OP_COND (ACMD命1令用来判断卡的工作电压是否符合,如果不符合的话,卡应该放弃总线操作,进入In active State 状态.在发送SD_SEND_OP_COND (ACMD命令前记得要首先发送APP_CMD (CMD55).卡的状态变换图•ACMD4命令响应中的BUSY^也用于卡表示其还没准备好,主机此时应重发 ACMD4命令,直到卡准备好•主机在这个阶段的 ACMD41中不允许改变工作电压,如果确实想改变的话,应该先发送 CMD0,然后再发送改变后的 ACMD41.GO_INACTIVE_STATE (CMD15命令用于使指定地址的卡进入 In active State 模式•3)卡识别过程•ALL_SEND_CID (CMD2命令用于获取卡的 CID 信息,如果卡处于 Ready State, 它就会在 CMD 线上传送它的 CID 信息,然后进入Identification State 模式•紧接着发送 CMD3(SEND_RELATIVE_ADD 命令,用于设置卡新的地址•卡收到新的地址后进入Stand-by State模式•2.数据传输模式•card is busy or host omitted vo tage rangeNo Response (hton V8li 口COmmandy Must be a Mu ti r.ie diaCardhan all states except (i naiStand' by(Stby)Power onI CMDO *ACMD4*/ SPI Operation V^Mcde7 ICF-.1D1 5(ready CMD2Of.'bj4^ta*transter modefrom 引I states in cata*tf Brtafer-moce■'" Inactive"Vl^Stete (ina)^Identificati3ri'\ Slate (ident) J/Sari Multi Med iaCard '、、 nitiaiization process | rtingmt ChW )CMD3J — a rd resp anna with netvRCAi cards vvith non compattiie voltage 「自ng 总 Care responds with card-identification modenew RCA数据传输模式下卡的状态转变图进入数据传输模式后,主机先不停的发送SEND_CSD (CMD命令获取卡的CSD信息.SET_DSR (CMD4用于设置卡的DSR寄存器,包括数据总线宽度,总线上卡的数目,总线频率,当设置成功后,卡的工作频率也随之改变•此步操作是可选的•CMD7命令用于使指定地址的卡进入传输模式,任何指定时刻只能有一个卡处于传输模式•传输模式下所有的数据传输都是点对点的,并且所有有地址的命令都需要有响应•.所有读命令都可以由CMD1;命令停止,之后卡进入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线.。

SD卡规范协议学习

SD卡规范协议学习

SD卡规范协议学习首先,本博文遵照SD卡协议3.01版本,最旧协议版本为1.10,但是协议是向下兼容的。

关于SD卡做一个简单介绍如下:SD卡按照内存容量大小分3类:SDSC(标准容量SD内存卡):最大支持为2GByte。

SDHC(大容量SD内存卡):SD卡容量介于2Gyte~32GByte。

SDXC(扩展容量SD卡内存卡):SD卡容量介于32GByte~2TByte。

再来介绍一下关于SD卡的传输速度分为5个等级:Class 0 :未定义它的传输速度!!Class 2 :定义它的传输速度大于等于2MB/secClass 4 :定义它的传输速度大于等于4MB/secClass 6 :定义它的传输速度大于等于6MB/secClass 10 :定义它的传输速度大于等于10MB/sec协议中还规定了SDHC和SDXC这两类卡的传输速度应当大于等于2MB/sec。

有SD卡的可以看看自己SD卡上边有这些标号:这些标号代表此SD卡的传输速度!!再介绍下SD卡控制器是如何识别SD卡大小的,SD卡内部有一些关于SD卡自身信息的寄存器,关于SD卡大小的就是CSD Register,此寄存器共128位,最高两位(即:127:126两位)的值分为2个版本,如下:注释:0代表此卡容量为标准容量。

1代表此卡容量为大容量或扩展容量。

2、3保留下面介绍CSD寄存器中与容量有关的位,它的大小与这三个参数有关C_SIZE, C_SIZE_MULT and READ_BL_LEN,下图是寄存器中的位置:下图是关于READ_BL_LEN寄存器位的说明:注释:4个二进制位来表示最大读取数据的长度,1001b表示读取数据最大长度为29 Byte = 512Byte,1010b表示读取数据最大长度为210 Byte= 1024Byte,1011b表示读取数据最大长度为211 Byte=2048Byte,注意:SD内存卡的WRITE_BL_LEN一直等于READ_BL_LEN的大小!!下图是关于C_SIZE_MULT 寄存器为的说明:注释:3个二进制位来表示计算设备总大小的一个乘数。

sd卡协议(中文版)

sd卡协议(中文版)

数据包的封装与命令协议相关
1 sd卡指令数据包
sd卡的指令被封装成48位的数据包,每次传送这48位的数据包。

数据包的内容包括起始位、结束位、传输位、命令索引、传输参数和7位CRC校验码。

其具体格式分布如下图
其中的命令索引位是[45:40],里面可以封装各种命令,具体的命令表将在下面给出。

不同的命令会对应不同的回应(respond),回应有三种(R1,R2,R3)格式,在命令表中的选项会给出。

3 命令回应repond
1)R1模式
对象指令
CMD0 :GO_IDLE_STATE CMD1 :SEND_OP_COND CMD9 :SEND_CSD
CMD10:SEND_CID
CMD12:STOP_TRANSMISSION CMD16:SET_BLOCKLEN
CMD17:READ_SINGLE_BLOCK
CMD18:READ_MULTIPLE_BLOCK CMD23:SET_BLOCK_COUNT CMD59:CRC_ON_OFF
2)R2模式
对象指令
CMD13:SEND_STATUS
3)R3模式
对象指令
CMD58:READ_OCR
4. sd卡的配置信息
4.1卡识别寄存器——CID(card identification register )
4.2卡特性寄存器——CSD(card specific data register)。

SD协议

SD协议

一、SD规范介绍二、物理层规范三、SD Memory Card四、SDIO Card五、驱动编写一、SD2.0规范介绍1、版本SD spec1.0 低速度、低容量25M 2GSD spec1.1 高速度、低容量50M 2GSD spec2.0 高速度、高容量50M 32G2、SD规范包括(1) 物理层规范(2) 文件系统规范(3) SD卡安全规范(4) SD卡音频应用规范+其他相关应用规范(5) SD MC扩展规范移动设备(6) SDIO卡规范现在针对SD Memory 和SDIO两种类型的设备,所以下面内容只涉及子协议(1)、(6)。

3、符合SD2.0规范的设备SD卡MiniSD、MicroSD 1.0/1.1SDIO卡wifi 、GPSSDHC 2.0 最少支持class2SDXCCombo Card传输速度类型分为class0 旧的卡,class2 大于2MB/Sclass4 大于4MB/Sclass6 大于6MB/S二、物理层规范引脚SD模式SPI模式名称类型描述名称类型描述1 CD/DAT3 I/O/PP Card Direct/数据线[Bit3] CS I 片选(negtrue)2 CMD PP 命令/响应DI I 数据输入3 VSS S 电源地VSS S 电源地4 VDD S 电源正VDD S 电源正5 CLK I 时钟SCLK I 时钟6 VSS2 S 电源地VSS2 S 电源地7 DAT0 I/I/PP 数据线[Bit0] DO O/PP 数据输出8 DAT1 I/O/PP 数据线[Bit1] RSV9 DAT2 I/O/PP 数据线[Bit2] RSV2、总线传输模式SPI 串行传输、低速度SD 最多支持四线传输兼容MMC3 SD总线3.1 总线分为host device(1) comand 命令host to device 都是48位A、广播命令B、点对点命令(2) response 响应device to host根据内容不同分为R1、R3、R4、R7(48位)和R2(136位)初始化阶段,host给SD卡分配地址数据传输是有单块传输命令和多块传输命令,然后通过发送一个终止命令停止传输单块还是多块传输,通过host去配置命令先传msb 在lsb3.2 格式(1) 命令格式(2) 响应格式(3) 数据格式有两种(1) usual data bus 字节为单位发送(2) wide data bus 以块单位发送usual data :先发送高位,在发送低位一字节一字节发送wide data bus :整个数据块发送三、SD Memory Card1、初始化,发送命令读写卡中的寄存器发送命令完成读写、擦除等操作名称带宽描述CID 128 卡的ID号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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数据寄存器。

相关文档
最新文档