SD卡的传输协议和读写程序
sd卡数据读写流程

SD卡数据读写流程引言SD卡(Secure Digital Card)是一种常用的存储设备,通常用于移动设备、相机等电子产品中。
在使用SD卡时,数据的读写是一个非常重要的过程。
本文将详细介绍SD卡的数据读写流程,包括初始化、文件操作和数据传输等环节。
初始化SD卡初始化SD卡是数据读写的第一步,确保SD卡可以被正确地识别和使用。
下面是SD卡数据读写的初始化流程:1.插入SD卡:将SD卡插入目标设备的SD卡插槽中。
2.电源供给:为SD卡提供稳定的电源,通常通过连接电源线或使用内置电池来实现。
3.延时等待:等待SD卡稳定,一般为几毫秒的时间。
4.发送命令:通过SPI或SDIO等接口向SD卡发送特定的命令,以初始化SD卡。
5.接收响应:SD卡将返回初始化成功与否的响应,如果初始化成功,则可以进行后续的数据读写操作。
SD卡文件系统在进行数据读写之前,需要先设置SD卡的文件系统。
常用的文件系统包括FAT16、FAT32和exFAT等。
下面是SD卡文件系统的设置流程:1.格式化SD卡:使用格式化工具对SD卡进行格式化,以清除原有的文件系统和数据。
2.创建分区:根据需求,可以将SD卡分为一个或多个分区,并设置每个分区的大小。
3.创建文件系统:选择合适的文件系统类型,在分区上创建文件系统,并分配文件系统的容量。
4.分配文件表:文件系统会维护一个文件表,记录文件的位置、大小等信息。
在创建文件系统时,会分配一块空间来存储文件表。
5.设置文件权限:根据需要,可以设置文件的读写、执行权限,以保证文件的安全性。
SD卡数据读写操作SD卡的数据读写操作包括文件的创建、打开、读取、写入和关闭等。
下面是SD卡数据读写操作的详细流程:1.创建文件:通过文件系统接口,调用相关函数创建一个新的文件,并指定文件的名称和路径。
2.打开文件:使用文件系统的函数打开已经存在的文件,以便后续的读取和写入操作。
3.读取文件:通过文件系统提供的函数,在已经打开的文件中进行读取操作。
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卡SPI读写中文资料

7S P I模式本文是小弟自己翻译的(处女作哦~~~~~),难免有不妥之处,望交流指教!联系方式 QQ:286225453 Email:ioro55555@7.1介绍SPI模式SPI模式由二次传递协议组成,这个协议由Flash(基于SD卡)提供。
本模式是SD卡协议的子协议,目的是用SPI信道通讯。
SPI模式在SD卡上电后第一个复位指令(CMD0)执行后被选择,并且在接通电源时不能改变。
SPI标准定义7.2 SPI总线SD卡信道由指令和数据位(起始位和结束位)组成,SPI信道由字节定向。
每一个指令或数据块由8位的字节和CS标志构成。
类似SD卡协议, SPI通讯由指令、响应和数据组成。
全部的主机与SD卡之间的通信由主机控制。
主机执行每一跟CS标志为低的总线。
SPI模式与SD模式的响应特性有以下三方面不同∶1、被选择的卡始终对指令作出反应。
2、一个附加的(8BIT)响应产生。
3、在SD卡遇到数据检索问题时,它会作出错误反应,而不是像在SD模式中一样执行一次空操作。
除命令响应之外,每一个数据块在写操作期间会作出专门的信息响应标志反应发送给SD卡。
数据块可以大到一个扇区小到一个字节。
读/写操作由CSD(指令信号译码器)寄存器操作。
7.2.1模式选择SD卡在上电后自动SD模式。
如果CS标志在接受复位指令(CMD0)期间为低,它将进入SPI模式并且处于空闲状态。
如果SD卡识别到需要保持SD模式,它不会对指令作出任何反应并且保持在SD模式中。
如果需要SPI模式,SD卡将转到SPI模式并且进行SPI模式R1响应。
回到SD模式的必须重新上电。
在SPI 模式下,SD卡遵守部分协议系统。
支持SPI模式的SD卡指令始终有效。
7.2.2总线传送保护SPI模式每一个SD卡在总线上的数据传输由CRC(循环冗余码校验)保护。
在SPI模式, SD卡提供一种非保护模式(起动系统,建立可靠的数据联系来排除硬件或固件需要执行的CRC(循环冗余码校验)生成并且核验操作)。
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(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卡根据接收到的命令执行相应的操作,并返回执行结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.5.2 实现方法.........................................................................................................11
1.6
SD/MMC 卡读写模块的使用示例二 ....................................................................18
1.2.2 卡供电控制.......................................................................................................5
1.2.3 卡检测电路.......................................................................................................5
1.3.2 SD/MMC 读写模块整体框架 ..........................................................................6
1.4
SD/MMC 卡读写模块的使用说明..........................................................................6
1.1.1 SD 模式
在 SD 模式下,主机使用 SD 总线访问 SD 卡,其总线拓扑结构如图 1.3 所示。由图可 见,SD 总线上不仅可以挂接 SD 卡,还可以挂接 MMC 卡。
图 1.3 SD 存储卡系统(SD 模式)的总线拓扑结构 -2-
广州致远电子有限公司 Tel:(020)38730976 38730977 Fax:38730925
1.1.2 SPI 模式
在 SPI 模式下,主机使用 SPI 总线访问卡,当今大部分微控制器本身都带有硬件 SPI 接口,所以使用微控制器的 SPI 接口访问卡是很方便的。微控制器在卡上电后的第 1 个复 位命令就可以选择卡进入 SPI 模式或 SD 模式,但在卡上电期间,它们之间的通信模式不 能更改为 SD 模式。
1.2
访问 SD/MMC 卡的 SPI 模式硬件电路设计 .........................................................4
1.2.1 SPI 总线 ............................................................................................................5
SD 存储卡系统(SD 模式)的总线拓扑结构为: 一个主机(如微控制器)、多个从机(卡) 和同步的星形拓扑结构(参考图 1.3)。所有卡共用时钟 CLK、电源和地信号。而命令线 (CMD)和数据线(DAT0 ~ DAT3)则是卡的专用线,即每张卡都独立拥有这些信号线。 请注意,MMC 卡只能使用 1 条数据线 DAT0。
1.6.3 参考程序.........................................................................................................24
1.7
SD/MMC 软件包应用总结....................................................................................27
目录
第 1 章 SD/MMC 卡读写模块.....................................................................................1
1.1
SD/MMC 卡的外部物理接口..................................................................................1
1.3
SD/MMC 卡读写模块的文件结构及整体构架 ......................................................5
1.3.1 SD/MMC 卡读写模块的文件组成 ..................................................................5
i
广州致远电子有限公司 Tel:(020)38730976 38730977 Fax:38730925
第1章 SD/MMC 卡读写模块
SD/MMC 卡是一种大容量(最大可达 4GB)、性价比高、体积小、访问接口简单的存 储卡。SD/MMC 卡大量应用于数码相机、MP3 机、手机、大容量存储设备,作为这些便携 式设备的存储载体,它还具有低功耗、非易失性、保存数据无需消耗能量等特点。
1.6.1 实现方法.........................................................................................................18
1.6.2 例子建立与运行步骤.....................................................................................20
6 VSS2 7 DAT0
8 DAT1
9 DAT2
SD 模式
类型
描述
S
电源
I
时钟
S
电源地
I/O/PP
数据线[Bit 0]
I/O/PP
数据线[Bit 1]
I/O/PP
数据线[Bit 2]
名称 VDD SCLK VSS2 DO RSV RSV
SPI 模式
类型
描述
S
电源
I
时钟
S
电源地
O/PP
数据输出
注:1. S:电源;I:输入;O:推挽输出;PP:推挽 I/O。
2. 扩展的 DAT 线(DAT1 ~ DAT3)在上电后处于输入状态。它们在执行 SET_BUS_WIDTH 命令后 作为 DAT 线操作。当不使用 DAT1 ~ DAT3 线时,主机应使自己的 DAT1~DAT3 线处于输入模式。 这样定义是为了与 MMC 卡保持兼容。
3. 上电后,这条线为带 50KΩ 上拉电阻的输入线(可以用于检测卡是否存在或选择 SPI 模式)。用 户可以在正常的数据传输中用 SET_CLR_CARD_DETECT(ACMD42)命令断开上拉电阻的连接。 MMC 卡的该引脚在 SD 模式下为保留引脚,在 SD 模式下无任何作用。
1.5
SD/MMC 卡读写模块的应用示例一 ....................................................................11
1.5.1 硬件连接与配置.............................................................................................11
2 CMD
PP4
命令/响应
DI
3 VSS1
S
电源地
VSS
SPI 模式
类型
描述
I
片选(低电平有效)
I5
数据输入
S
电源地
-1-
广州致远电子有限公司 Tel:(020)38730976 38730977 Fax:38730925
续上表
引
脚
名称 1
4 VDD 5 CLK
在本章中,除了特别说明以外,“卡”都是指 SD 卡或 MMC 卡。
1.1 SD/MMC 卡的外部物理接口
SD 和 MMC 卡的外形和接口触点如图 1.1 所示。其中 SD 卡的外形尺寸为:24mm x 32mm x 2.1mm(普通)或 24mm x 32mm x 1.4mm(薄 SD 存储卡),MMC 卡的外形尺寸为 24mm x 32mm x 1.4mm。
SPI 总线以字节为单位进行数据传输,所有数据令牌都是字节(8 位)的倍数,而且字 节通常与 CS 信号对齐。SD 卡存储卡系统如图 1.PI 模式)的总线拓扑结构 -3-
广州致远电子有限公司 Tel:(020)38730976 38730977 Fax:38730925
4. MMC 卡在 SD 模式下为:I/O/PP/OD。
5. MMC 卡在 SPI 模式下为:I/PP。
由表 1.1 可见,SD 卡和 MMC 卡在不同的通信模式下,各引脚的功能也不相同。这里 的通信模式是指微控制器(主机)访问卡时使用的通信协议,分别为 SD 模式和 SPI 模式。
在具体通信过程中,主机只能选择其中一种通信模式。通信模式的选择对于主机来说 是透明的。卡将会自动检测复位命令的模式(即自动检测复位命令使用的协议),而且要 求以后双方的通信都按相同的通信模式进行。所以,在只使用一种通信模式的时候,无需 使用另一种模式。下面先简单介绍这两种模式。
卡的 SPI 接口与大多数微控制器的 SPI 接口兼容。卡的 SPI 总线的信号线如表 1.3 所示。
表 1.3 SD 卡与 MMC 卡的 SPI 接口描述
信号线
功能描述
CS CLK DataIn DataOut
主机向卡发送的片选信号 主机向卡发送的时钟信号 主机向卡发送的单向数据信号 卡向主机发送的单向数据信号
1.1.1 SD 模式.............................................................................................................2