Electoday 2025

ไมโครคอนโทรลเลอร์ => ARM Processors => Topic started by: tha on May 28, 2022, 09:34:51 AM

Title: How to Use MMC/SDC
Post by: tha on May 28, 2022, 09:34:51 AM
http://elm-chan.org/docs/mmc/mmc_e.html (http://elm-chan.org/docs/mmc/mmc_e.html)
ต้องขอขอบคุณทางทีมงานเว็บไซส์นี้ ที่ให้ความรู้เรามาไว้ ณ ที่นี้ด้วยครับ

How to Use MMC/SDC

The Secure Digital Memory Card (SDC below) เป็น the de facto standard memory card สำหรับ mobile equipments. The SDC ถูกพัฒนาให้เข้ากันได้แบบสูงกว่ากับ Multi Media Card (MMC ด้านล่าง). SDC compleant equipments สามารถใช้ MMCs ในกรณีส่วนใหญด้วย. มี reduced size versions ด้วย, อย่างเช่น RS-MMC, miniSD and microSD, ที่มี the same function. The MMC/SDC มี a microcontroller ในมัน. The flash memory controls (block size translation, การปรับระดับการสึกหรอและการแก้ไขข้อผิดพลาด - รู้จักกันในชื่อ FTL) เสร็จสมบูรณ์ ภายใน the memory card. The data ถูกส่งถ่ายระหว่าง the memory card and the host controller เป็น data blocks ในหน่วยของ 512 bytes, ดังนั้นมันสามารถถูกมองเห็นเป็น a block device เหมือน a generic harddisk drive จากมุมมองของ upper level layers.

หน้านี้อธิบายความรู้พื้นฐานและเรื่องเบ็ดเตล็ดที่ฉันรู้เกี่ยวกับการใช้ MMC/SDC กับระบบฝังตัวขนาดเล็ก ฉันเชื่อว่าข้อมูลนี้จะต้องเป็นประโยชน์ในการเริ่มต้น บันทึกย่อสำหรับผู้ที่กำลังจะใช้ MMC/SDC บน the electronics handiwork projects.

(https://i.imgur.com/2dQdNri.png)

(https://i.imgur.com/BjKNNKi.png)
Title: Re: How to Use MMC/SDC
Post by: tha on May 28, 2022, 10:29:01 AM
Pinout

ภาพขวาแสดง the contact surface of the SDC/MMC. The MMC มี 7 contact pads. The SDC มี 9 contact pads ซึ่งมีหน้าสัมผัสเพิ่มเติมอีก 2 กับ the MMC. The three of the contacts ถูกระบุสำหรับ power supply, ดังนั้น the number of effective signals คือ 4 (MMC) และ 6 (SDC). ดังนั้น the data transfer ระหว่าง the host and the card ถูกทำโดยทาง a synchronous serial interface.

The working supply voltage range ถูกแสดงให้เห็นโดย the operation conditions register (OCR) และมันควรถูกอ่านและยืนยัน the operating voltage range ตอน card initialization. อย่างไรก็ตาม, the supply voltage ยังสามารถถูกกำหนดไว้ที่ 3.0 ถึง 3.3 volts โดยไม่มีการยืนยันใดๆเนื่องจาก the all MMC/SDCs ทำงานที่ 2.7 ถึง 3.6 volts เป็นอย่างน้อย. ห้ามจ่ายไฟ 5.0 volts ให้กับ the card, มิฉะนั้น the card จะพังทันที. The current consumption ที่ write operation สามารถถึงสูงถึง 100 miliamperes, ดังนั้น the host system ควรพิจารณาเพื่อจ่ายไฟ 100 miliamperes ให้กับ tha card เป็นอย่างน้อย.

(https://i.imgur.com/b7JaT72.png)

(https://i.imgur.com/Ey810bV.png)

(https://i.imgur.com/VzCJQAu.png)
Title: Re: How to Use MMC/SDC
Post by: tha on May 28, 2022, 11:08:58 AM
SPI Mode

เอกสารนี้อธิบายเกี่ยวกับ SPI mode เพื่อควบคุม the MMC/SDCs. The SPI mode เป็น an alternative operating mode ที่กำหนดให้ใช้ the MMC/SDCs โดยไม่มี a native host interface. The communication protocol of the SPI mode เรียบง่ายเล็กน้อยเมื่อเทียบกับ native operating mode ของมัน. The MMC/SDC สามารถถูกแนบติดกับ the most microcontrollers โดยทาง a generic SPI interface หรือบาง GPIO ports. ดังนั้น the SPI mode เหมาะสำหรับ low cost embedded applications ที่ไม่มี native host interface ให้ใช้งาน. มี 4 SPI modes ที่แตกต่างกัน, 0 ถึง 3, ขึ้นอยู่กับ clock phase and polarity. The SPI mode 0 ถูกกำหนดสำหรับ SDC. สำหรับ the MMC, มันไม่เป็น the SPI spec, ทั้ง latch และ shift operations ถูกกำหนดด้วย rising edge of the SCLK, แต่มันดูเหมือนการทำงานที่ mode 0 ที่ the SPI mode. ดังนั้น the SPI mode 0 (CPHA=0, CPOL=0) จึงเป็นการตั้งค่าที่เหมาะสมเพื่อควบคุม MMC/SDC, แต่ mode 3 (CPHA=1, CPOL=1) ก็ทำงานได้เช่นกันในหลายกรณี. A pull-up บน the DO ไม่สามารถถูกละเว้น, มิฉะนั้นบาง cards จะล้มเหลว initialization process.

(https://i.imgur.com/MJaeq9f.png)
Title: Re: How to Use MMC/SDC
Post by: tha on May 30, 2022, 08:07:20 AM
Command and Response

ใน SPI mode, the data direction บน the signal lines ถูกคงที่และ the data ถูกส่งถ่ายใน byte oriented serial communication. The command frame จาก host ไปยัง card เป็น a fixed length packet ที่แสดงข้างล่าง. The card พร้อมที่จะรับ a command frame เมื่อมันขับ DO high. หลังจาก a command frame ถูกส่งไปยัง the card, a response ต่อ the command (R1, R2, R3 or R7) ถูกส่งกลับจาก the card. เนื่องจาก the data transfer ถูกขับโดย serial clock ที่สร้างขึ้นโดย host controller, the host controller ต้องต่อเนื่องการอ่าน data, ส่ง a 0xFF และรับ received byte, จนกระทั่ง a valid response ถูกตรวจพบ. The DI signal ต้องอยู่ในระดับ high ในระหว่าง read transfer (ส่ง a 0xFF และ the received data). The response ถูกส่งกลับภายใน command response time (NCR), 0 ถึง 8 bytes สำหรับ SDC, 1 ถึง 8 bytes สำหรับ MMC. The CS signal ต้องถูกขับจาก high เป็น low ก่อนการส่ง a command frame และยึดมัน low ในระหว่าง the transaction (command, response and data transfer ถ้ามีอยู่). The CRC feature เป็นตัวเลือกใน SPI mode. CRC field ใน the command frame จะไม่ถูกเช็คโดย the card.

(https://i.imgur.com/n9yTN5n.png)
Title: Re: How to Use MMC/SDC
Post by: tha on May 30, 2022, 08:47:58 AM
SPI Command Set

แต่ละ command ถูกแสดงเป็นตัวย่ออย่าง GO_IDLE_STATE หรือ CMD<n>, <n> คือ the number of the command index และd the value สามารถเป็น 0 ถึง 63. Following table อธิบายเฉพาะ commands ที่มักจะถูกใช้สำหรับ generic read/write และ card initialization. สำหรับรายละเอียดเกี่ยวกับทุก commands, โปรดดูที่ spec sheets จาก MMCA and SDA.

(https://i.imgur.com/9Fz28oG.png)
Title: Re: How to Use MMC/SDC
Post by: tha on May 30, 2022, 09:22:01 AM
SPI Response

มีบาง command response formats, R1, R2, R3 and R7, ขึ้นอยู่กับ the command index. A byte of response, R1, ถูกส่งคืนกลับสำหรับ commands ส่วนใหญ่. The bit field of the R1 response ถูหแสดงในรูปด้านขวา, the value 0x00 หมายถึงสำเร็จลง. เมื่อ any error เกิดขึ้น, corresponding status bit ใน the response จะถูกเซ็ต. The R3/R7 response (R1 + ต่อท้าย 32-bit data) สำหรับเฉพาะ CMD58 and CMD8.

บาง commands ใช้เวลานานกว่า NCR และมันตอบสนอง R1b. มันคือ an R1 response ตามด้วย busy flag (DO ถูกขับเป็น low ตราบเท่าที่ internal process กำลังดำเนินการอยู่). The host controller ควรรอสำหรับ end of the process จนกว่า DO เป็น high (a 0xFF ถูกรับ).

(https://i.imgur.com/tfQvHcv.png)
Title: Re: How to Use MMC/SDC
Post by: tha on May 31, 2022, 06:58:51 AM
Initialization Procedure for SPI Mode

หลังจาก a power-up sequence, MMC/SDC เข้าสู่ native operating mode ของมัน. เพื่อกำหนดมันให้เป็น SPI mode, ขบวนการต่อไปนี้ต้องถูกดำเนินการตาม flow นี้.

Power ON or card insersion

หลังจาก supply voltage ขึ้นถึงเกิน 2.2 volts, รอเป็นเวลา one millisecond เป็นอย่างน้อย. เซ็ต SPI clock rate ระหว่าง 100 kHz and 400 kHz. เซ็ต DI and CS เป็น high และใช้พัลส์นาฬิกา 74 พัลส์ขึ้นไปให้กับ SCLK. The card จะเข้าสู่ native operating mode ของมันและพร้อมที่จะยอมรับ native command.
Title: Re: How to Use MMC/SDC
Post by: tha on May 31, 2022, 08:01:15 AM
Software reset

ส่ง a CMD0 โดยที่ CS เป็น low เพื่อรีเซ็ต the card. The card สุ่มตรวจ CS signal ตอนที่ a CMD0 ถูกรับเรียบร้อยแล้ว. ถ้า the CS signal เป็น low, the card เข้าสู่ SPI mode และ responds R1 ที่มี In Idle State bit set (0x01). เนื่องจาก the CMD0 ต้องถูกส่งเป็น a native command, the CRC field ต้องมี a valid value. เมื่อทันทีที่ the card เข้าสู่ SPI mode, the CRC feature ถูกปิดใช้งานและ the command CRC และ data CRC ไม่ถูกเช็คโดย the card, ดังนั้น command transmission routine สามารถถูกเขียนด้วย the hardcorded CRC value ที่ใช้ได้สำหรับเฉพาะ CMD0 and CMD8 ที่ใช้ใน the initialization process. The CRC feature สามารถถูกสลับ on/off ด้วย CMD59 ได้ด้วย.
Title: Re: How to Use MMC/SDC
Post by: tha on May 31, 2022, 09:02:24 AM
Initialization

In idle state, the card ยอมรับเฉพาะ CMD0, CMD1, CMD8, ACMD41, CMD58 and CMD59. Any other commands จะถูกปฏิเสธ. ในเวลานี้, OCR register ควรถูกอ่านด้วย CMD58 เพื่อเช็ค the working voltage range of the card. ในกรณีที่ the system sypply voltage อยู่นอกช่วง working voltage range, the card ต้องถูกปฏิเสธ. โปรดทราบว่า all cards ทำงานที่ supply voltage ในช่วง 2.7 ถึง 3.6 volts เป็นอย่างน้อย, ดังนั้น the host contoller ไม่จำเป็นต้องเช็ค the OCR ถ้า supply voltage อยู่ในช่วงนี้. The card เริ่มต้น the initialization process เมื่อ a CMD1 ถูกรับ. เพื่อตรวจหา end of the initialization process, the host controller จำเป็นต้องส่ง CMD1 และเช็ค the response จนกระทั่ง end of the initialization. เมื่อ the card ถูกเริ่มต้นเรียบร้อยแล้ว, In Idle State bit ใน the R1 response จะถูกเคลียร์ (R1 resp เปลี่ยน 0x01 เป็น 0x00). The initialization process อาจใช้เวลาหลายร้อยมิลลิวินาที (การ์ดขนาดใหญ่มักจะนานกว่านั้น) ดังนั้นนี่คือการพิจารณาเพื่อกำหนด the time out value. หลังจาก the In Idle State bit ถูกเคลียร์, the card ก็พร้อมที่จะยอมรับ the generic read/write commands.

เนื่องจาก ACMD41 แทน CMD1 ถูกแนะนำสำหรับ SDC, ให้ลองใช้ ACMD41 ก่อนและลองอีกครั้งด้วย CMD1 หากถูกปฏิเสธ เหมาะอย่างยิ่งที่จะรองรับการ์ดทั้งสองประเภท.

The SCLK frequency ควรถูกเปลี่ยนให้เร็วที่สุดเท่าที่เป็นได้เพื่อให้สูงสุด the read/write performance. The TRAN_SPEED field ใน the CSD register แสดงให้เห็น the maximum clock frequency of the card. มันเป็น 20MHz สำหรับ MMC, 25MHz สำหรับ SDC ในกรณีส่วนใหญ่. โปรดทราบว่า the clock freqency จะสามารถที่จะถูกคงที่เป็น 20/25MHz ใน SPI mode เนื่องจากไม่มี open-drain condition ที่จำกัด the clock frequency.

The initial read/write block length อาจถูกเซ็ต 1024 บน 2 GB cards, ดังนั้น the block size ควรถูกเริ่มต้นใหม่เป็น 512 ด้วย CMD16 เพื่อทำงานกับ FAT file system.
Title: Re: How to Use MMC/SDC
Post by: tha on May 31, 2022, 10:09:44 AM
High-capacity SDC and Initialization

SDSC card รองรับ 8MB ถึง 2GB. นี้คือจาก the maximum capacity of regular file system, FAT. (FAT รองรับสูงถึง 4GB ตามทฤษฎี แต่ MS-DOS รองรับสูงถึง 2GB.)

SDHC card รองรับ 4GB ถึง 32GB. นี้คือจาก the maximum capacity of regular file system, FAT32. (FAT32 รองรับสูงถึง 2TB ตามทฤษฎี แต่ดูเหมือนว่าจะได้รับผลกระทบจากความต้องการของ Microsoft ที่พวกเขาแนะนำให้ใช้ FAT32 สำหรับไดรฟ์ข้อมูลขนาด 32GB หรือเล็กกว่า)

SDXC card รองรับ 64GB ถึง 2TB. นี้คือจาก the addressing mode ใน read/write commands, 32-bit LBA. (The regular file system, exFAT, รองรับมากกว่า 2TB.)

SDUC card รองรับ 4TB ถึง 128TB. The addressing mode ถูกขยายถึง 38-bit LBA. อย่างไรก็ตาม the SDUC card อาจไม่รองรับ SPI mode เนื่องจาก the 38-bit LBA เป็น a new feature ที่กำหนดหลังจาก SDC Ver.2.

ตอนนี้, the initialization process สำหรับ high-capacity SDCs แตกต่างจาก the process ที่อธิบายข้างบน. หลังจาก the card อยู่ใน idle state ด้วย a CMD0, host controller ส่ง a CMD8 ที่มี an argument 0x000001AA และ correct CRC ก่อนถึง initialization process. ถ้ามันถูกปฏิเสธด้วย illigal command error (0x05), the card คือ SDC Ver.1 หรือ MMC Ver.3. The card จะถูกเริ่มต้นตามที่อธิบายไว้ข้างบน. ถ้า the CMD8 ถูกยอมรับ, R7 response (R1(0x01) + 32-bit return value) จะถูกส่งคืนกลับ. The lower 12-bit ใน the return value 0x1AA หมายความว่า the card เป็น SDC Ver.2+ และมันสามารถทำงานที่ supply voltage ในช่วง 2.7 ถึง 3.6 volts. หากไม่เป็นเช่นนั้น, the card ควรถูกปฏิเสธ. และจากนั้นเริ่มต้น initialization ด้วย ACMD41 ที่มี HCS[bit30] flag ใน the argument. หลังจาก the initialization เสร็จสมบูรณ์, อ่าน OCR register ด้วย CMD58 และเช็ค CCS[bit30] flag. เมื่อมันถูกเซ็ต, the card คือ a high-capacity card ที่เรียกว่า SDHC/SDXC. The data read/write operations ที่อธิบายไว้ด้านล่างได้รับคำสั่งใน block addressing (LBA) แทน byte addressing. The size of data block ที่ block addressing mode ถูกคงที่เป็น 512 bytes.
Title: Re: How to Use MMC/SDC
Post by: tha on May 31, 2022, 10:38:13 AM
Data Transfer

Data Packet and Data Response

ใน a transaction ที่มี data transfer, อย่างน้อยหนึ่ง data blocks จะถูกส่ง/รับหลังจาก command response. The data block ถูกส่งถ่ายเป็น a data packet ที่ประกอบด้วย Token, Data Block and CRC. The format of the data packet ถูกแสดงในรูปทางด้านขวาและมี three data tokens. Stop Tran token คือการยุติ a multiple block write transaction, มันถูกใช้เป็น single byte packet โดยไม่มี data block และ CRC.

(https://i.imgur.com/hhjo4b7.png)
Title: Re: How to Use MMC/SDC
Post by: tha on May 31, 2022, 10:53:47 AM
Single Block Read

(https://i.imgur.com/rf5wZVv.png)

The argument ระบุ the address เพื่อเริ่มการอ่านในหน่วยของ BYTE หรือ BLOCK. The sector address ใน LBA ที่ระบุโดย upper layer จะต้องถูกปรับขนาดให้เหมาะสมขึ้นอยู่กับ the card's addressing mode. เมื่อ a CMD17 ถูกยอมรับ, a read operation ถูกเริ่มต้นและ the read data block จะถูกส่งไปยัง the host. หลังจาก a valid data token ถูกตรวจพบ, the host controller จะรับ data field and CRC ที่ตามมา. The CRC bytes ต้องถูกรับแม้ว่ามันไม่ถูกต้องการ. ถ้า any error เกิดขึ้นในระหว่าง the read operation, an error token จะถูกส่งคืนกลับแทน data packet.
Title: Re: How to Use MMC/SDC
Post by: tha on May 31, 2022, 01:34:50 PM
Multiple Block Read

(https://i.imgur.com/5qcZR4m.png)

The CMD18 คือการอ่าน data blocks ตามลำดับโดยเริ่มที่ the specified address. The read operation ต่อเนื่องเป็นแบบปลายเปิด. เพื่อยุติ the read transaciton, a CMD12 จำเป็นต้องถูกส่งไปยัง the card. The received byte ที่ตาม CMD12 ทันทีคือ a stuff byte, มันควรถูกทิ้งก่อนที่จะรับ the response of the CMD12. สำหรับ MMC, ถ้า number of transfer blocks ถูกระบุแล้วโดย a CMD23 ก่อน CMD18, the read transaction ถูกเริ่มต้นเป็น a pre-defined multiple block transfer และ the read operation ถูกยุติลงที่ last block transfer.
Title: Re: How to Use MMC/SDC
Post by: tha on May 31, 2022, 02:31:27 PM
Single Block Write

(https://i.imgur.com/XSwqgBc.png)

The Single Block Write เขียน a block ไปยัง the card. หลังจาก a CMD24 ถูกยอมรับ, the host controller ส่ง a data packet ไปยัง the card. The packet format เป็นเหมือนกันกับ block read operations. cards ส่วนใหญ่ไม่สามารถเปลี่ยน write block size และมันถูกคงที่เป็น 512. The CRC field สามารถมี any fixed value เว้นแต่ the CRC function ถูกเปิดใช้งาน. The card ตอบสนอง a Data Response ตามติด the data packet จาก the host ทันที. The Data Response พ่วง a busy flag และ host controller ต้องค้าง the next command หรือ data transmission จนกว่า the card จะพร้อม.

ตามหลักการของ the SPI mode, the CS signal ต้องถูกยืนยันในระหว่าง a transaction. อย่างไรก็ตาม มีข้อยกเว้นสำหรับกฎนี้. เมื่อ the card ยุ่งอยู่, the host controller สามารถถอนการยืนยัน CS เพื่อปลดปล่อย SPI bus สำหรับ data transfer ไปยัง SPI devices อื่นบน the bus. The card จะขับ DO low อีกครั้งเมื่อถูกเลือกซ้ำในระหว่าง internal process ยังคงอยู่ในระหว่างดำเนินการ. ดังนั้น a preceding busy check, เช็คว่า card ยุ่งอยู่หรือไม่ก่อนแต่ละ command and data packet, แทน post wait สามารถขจัด the busy wait time. นอกจากนี้, the internal write process ถูกเริ่มต้น a byte หลังจาก the data response, นี้หมายถึง 8 SCLK clocks ถูกต้องการเพื่อเริ่มต้น internal write operation. The state of CS signal ในระหว่าง the post clocks สามารถเป็นอย่างใดอย่างหนึ่ง low หรือ high, ดังนั้นมันสามารถถูกทำด้วย bus release process ตามที่อธิบายไว้ข้างล่าง.
Title: Re: How to Use MMC/SDC
Post by: tha on May 31, 2022, 03:20:18 PM
Multiple Block Write

(https://i.imgur.com/6Gjshwd.png)

The Multiple Block Write command เขียน data blocks ตามลำดับโดยเริ่มที่ the specified address. หลังจาก a CMD25 ถูกยอมรับ, the host controller ส่งอย่างน้อยหนึ่ง data packets ไปยัง the card. The packet format เป็นเหมือนกันกับ block read operations ยกเว้นสำหรับ Data Token. The write transaction ต่อเนื่องจนกระทั่งมันถูกยุติลงด้วย a Stop Tran token. The busy flag จะถูก output หลังจากทุกๆ data block และ Stop Tran token. สำหรับ MMC, the number of blocks ที่จะเขียนสามารถถูกกำหนดไว้ล่วงหน้าโดย CMD23 ก่อน CMD25 และ the write transaction จะถูกยุติที่ last data block. สำหรับ SDC, a Stop Tran token ถูกต้องการเสมอเพื่อยุติ the multiple block write transaction.  จำนวนของ sectors ที่จะลบล่วงหน้าเมื่อเริ่ม the write transaction สามารถถูกระบุโดย an ACMD23 ก่อน CMD25. มันอาจสามารถปรับกลยุทธ์การเขียนใน the card ให้เหมาะสมและมันสามารถถูกยุติไม่ใช่ที่ the pre-erased blocks แต่ the content of the pre-erased area ที่ไม่ได้เขียนไว้จะไม่ได้กำหนดไว้.

Reading CSD and CID

สิ่งเหล่านี้เป็นเหมือนกันกับ Single Block Read ยกเว้น the data block length. The CSD and CID จะถูกส่งถึง the host เป็น 16 byte data block. สำหรับรายละเอียดของ the CMD, CID and OCR, โปรดดูที่ the MMC/SDC specs.
Title: Re: How to Use MMC/SDC
Post by: tha on June 01, 2022, 07:30:41 AM
Cosideration to Bus Floating and Hot Insertion

SPI signals ที่สามารถถูกลอยได้ควรถูกดึง low หรือ high อย่างเหมาะสมโดยทาง a resister. สิ่งนี้เป็น a generic design rule เกี่ยวกับ CMOS device. เนื่องจาก DI and DO ปกติเป็น high, พวกมันควรถูก pulled-up. เป็นไปตาม SDC/MMC specs, จาก 50k ถึง 100k ohms ถูกแนะนำเป็นค่าของ pull-up registers. อย่างไรก็ตาม the clock signal ไม่ได้ถูกกล่าวใน the SDC/MMC specs เนื่องจากมันถูกขับโดย host controller เสมอ. เมื่อมีความเป็นไปได้ของการลอย, มันควรถูกดึงเป็น the normal state, low.

The MMC/SDC สามารถ hot insertion/removal. แต่บางการพิจารณาถึง the host circuit ถูกจำเป็นเพื่อหลีกเลี่ยงการทำงานที่ไม่ถูกต้อง. ตัวอย่างเช่น, ถ้า the system power supply (Vcc) ถูกผูกติดกับ the card socket โดยตรง, the Vcc จะ dip ทันทีที่ใส่การ์ดเนื่องจาก a charge current ไปยัง the built-in capacitor ของ the card.  'A' ในรูปขวาเป็น the scope view และมันแสดงถึงการเกิดขึ้น a voltage dip ประมาณ 600 mV. นี้เป็นระดับที่เพียงพอที่จะทริก a brown out detector. 'B' ในรูปขวาแสดงว่า an inductor ถูกใส่เพื่อบล็อก the surge current, the voltage dip ถูกลดลงเหลือ 200 mV. A low ESR capacitor, อย่างเช่น OS-CON, สามารถขจัด the voltage dip ได้อย่างมากดังที่แสดงใน 'C'. อย่างไรก็ตาม the low ESR capacitor อาจเป็นเหตุทำให้เกิดการสั่นของ LDO regulator.

(https://i.imgur.com/czjH5rY.png)
Title: Re: How to Use MMC/SDC
Post by: tha on June 01, 2022, 02:48:23 PM
Cosideration on Multi-slave Configuration

ใน the SPI bus, แต่ละ slave device ถูกเลือกด้วย CS signals ที่แยกกัน, และ devices มากมายสามารถถูกแนบติดกับ an SPI bus. Generic SPI slave device เปิดใช้งาน/ปิดใช้งาน DO output ของมันโดย CS signal แบบอะซิงโครนัสเพื่อแชร์ an SPI bus. อย่างไรก็ตาม MMC/SDC เปิดใช้งาน/ปิดใช้งาน the DO output ในแบบประสานเวลากับ the SCLK. นี้หมายความว่ามีความเป็นไปได้ของ bus conflict กับ MMC/SDC และ SPI slave อื่นที่แชร์ an SPI bus. รูปขวาแสดง the MISO line drive/release timing ของ the MMC/SDC (the DO signal ถูกดึงเท่ากับ 1/2 vcc เพื่อดู the bus state). ดังนั้นเพื่อทำให้ MMC/SDC ปลดปล่อย the MISO line, the master device จำเป็นต้องส่ง a byte หลังจาก the CS signal ถูกถอนการยืนยัน.

มี an important thing จำเป็นต้องถูกพิจารณาว่า the MMC/SDC ไม่ใช่ the SPI device ดดยเริ่มต้น. บาง bus activity เพื่อเข้าถึง SPI device อื่นอาจเป็นเหตุให้ a bus conflict เนื่องจาก an accidental response of the MMC/SDC. ดังนั้น the MMC/SDC ควรถูกเริ่มต้นเพื่อกำหนดมันลงใน the SPI mode ก่อนการเข้าถึง device อื่นใดๆที่แนบติดกับ the same SPI bus.

(https://i.imgur.com/YKYuh4S.png)
Title: Re: How to Use MMC/SDC
Post by: tha on June 01, 2022, 03:21:02 PM
Maximum SPI Clock Frequency

MMC/SDC สามารถทำงานที่ the clock frequency สูงถึง 20/25 MHz. แน่นอนทุก native interfaces รับประกันการทำงานที่ the maximum clock frequency. อย่างไรก็ตาม generic SPI interface ที่รวมไว้ใน the microcontrollers อาจไม่ทำงานที่ high clock frequency เนื่องจาก a timing issue. รูกขวาแสดง the timing diagram of the SPI interface. ใน SPI mode 0/3, the data ถูกเรื่อยออกโดย falling edge of the SCLK และแลทช์ค้างไว้โดย rising edge ที่ตามมา. td เป็น the SCLK ถึง DO propagation หน่วงเวลาที่ the SDC, 14ns maximum. tsu คือ the minimum setup time of the MISO input บน the SPI interface. ดังนั้น the maximum allowable SCLK frequency สามารถถูกคำนวณดังนี้:

FSCLK(max) = 0.5 / (td + tsu)

บาง microcontrollers ที่ผมเคยใช้ถูกจำกัด the allowable clock frequency ประมาณ 10 MHz เป็นไปตาม the timing specs.

(https://i.imgur.com/glY8rOR.png)
Title: Re: How to Use MMC/SDC
Post by: tha on June 01, 2022, 03:46:21 PM
File System

The file system ที่ใช้บน the MMC/SDC คือ FAT. The MMC/SDC specifications กำหนด the FAT type อย่าง: FAT12 สำหรับ 64MB และน้อยกว่า, FAT16 สำหรับ 128MB ถึง 2GB, FAT32 สำหรับ 4GB ถึง 32GB และ exFAT สำหรับ 64GB ถึง 2TB. เฉพาะ an FAT volume สามารถมีอยู่บน the card ที่มี FDISK partitioning และไม่มี patition table อย่าง floppy disk ไม่ถูกอนุญาต. แน่นอน the MMC/SDC ที่มี any file system และ partitioning นอกเหนือจาก the MMC/SDC specifications define สามารถถูกใช้เป็น generic storage media สำหรับ PCs. อย่างไรก็ตาม the card ดังกล่าวที่มี illigal format จะไม่ถูกยอมรับโดย DSCs, camcorders and TVs.
Title: Re: How to Use MMC/SDC
Post by: tha on June 02, 2022, 07:15:19 AM
Optimization of Write Performance

MMC/SDC ใช้ NAND Flash Memory เป็น a memory array. The NAND flash memory คุ้มค่าและมันสามารถอ่าน/เขียน large chunk of data อยางรวดเร็ว, แต่ในทางกลับกัน มีข้อเสียคือการเขียนส่วนเล็ก ๆ น้อย ๆ ของ data ใหม่จะไม่มีประสิทธิภาพ. โดยทั่วไป the flash memory ต้องการลบ existing data ก่อนที่จะเขียนใหม่ a new data, และ minimum unit of erase operation, ที่เรียกว่า erase block, จะใหญ่กว่า write block size. The typical NAND flash memory มี a block size of 512/16K bytes สำหรับ write/erase operation, และการ์ดล่าสุดที่มีขนาดเกิน 128MB จะใช้ large block chip (2K/128K). ซึ่งหมายความว่าจะเขียนข้อมูลทั้งหมดใน the erase block ใหม่ ถูกทำในการ์ดแม้ว่าจะเขียนเพียงเซกเตอร์ (512 ไบต์).
Title: Re: How to Use MMC/SDC
Post by: tha on June 02, 2022, 08:02:48 AM
Benchmark

ฉันตรวจสอบประสิทธิภาพการอ่าน/เขียนของ MMC/SDC บางตัวด้วย MCU 8 บิตราคาถูก (ATmega64 @9.2MHz) บนสมมติฐานว่าระบบฝังตัวที่มีขนาดหน่วยความจำจำกัด ด้วยเหตุผลของขนาดหน่วยความจำ เขียน () และ read() ถูกดำเนินการครั้งละ 2048 ไบต์ ผลลัพธ์คือ: เขียน: 77kB/วินาที อ่าน: 328kB/วินาที บน 128MB SDC เขียน: 28kB/วินาที อ่าน: 234kB/วินาที บน SDC 512MB และเขียน: 182kB/วินาที อ่าน: 312kB/วินาทีบน 128MB MMC

จากการเปรียบเทียบในภายหลัง ฉันเดาว่า MMC มีแนวโน้มที่จะเร็วกว่า SDC ในปริมาณงานการเขียน.

ดังนั้นประสิทธิภาพการเขียนของ SDC 512MB นั้นแย่มากที่ค่าหนึ่งในสามของ 128MB SDC โดยทั่วไปแล้วประสิทธิภาพการอ่าน/เขียนของอุปกรณ์จัดเก็บข้อมูลขนาดใหญ่จะเพิ่มขึ้นตามสัดส่วนของความหนาแน่นในการบันทึก สำหรับ MMC ดูเหมือนว่าจะเร็วกว่า SDC หลายเท่า แต่ก็ไม่ได้แย่นัก หลังจากนั้น ฉันได้ตรวจสอบ SDC บางตัวที่จัดหามาจากผู้ผลิตหลายราย และพบว่า SDC ของ PQI นั้นเร็วเท่ากับ MMC ของฮิตาชิ แต่ของพานาโซนิคและโตชิบานั้นประสิทธิภาพแย่มาก
Title: Re: How to Use MMC/SDC
Post by: tha on June 02, 2022, 11:03:34 AM
Erase Block Size

เพื่อวิเคราะห์รายละเอียดของ write operation, busy time (จำนวนของ polling cycles) หลังจากส่ง a write data ถูกพิมพ์ออกไปยัง console ใน the low level disk write function. หลาบตัวเลขบน a line แสดงให้เห็น data blocks และ a Stop Tran token ที่ปล่อยออกโดย a multiple block write transaction.

จากผลการวิเคราะห์พบว่ามีความแตกต่างกันของ internal process ระหว่าง 128MB SDC and 512MB SDC. The 128MB SDC เขียนใหม่ erase block ที่ end of the mutiple block write transaction. The 512MB SDC ดูเหมือนมี 4K bytes data buffer และมันเขียนใหม่ erase block ทุกๆ 4K bytes boundary. ดังนั้นจึงไม่สามารถเปรียบเทียบได้โดยตรงแต่ the processing time ของการเขียนใหม่ an erase block สามารถถูกอ่าน 3800 สำหรับ 128MB SDC และ the 512MB SDC ใช้ 30000 ที่ 8 เท่านานกว่า 128MB SDC. พิจารณาจากผลลัพธ์นี้ ดูเหมือนว่า the 128MB SDC ใช้ a small block chip และ the 512MB SDC ใช้ a large block หรือ MLC chip. แน่นอน the larger block size ลด the performance บน pertial block rewriting. ใน 512MB SDC, เฉพาะพื้นที่ที่ 512K bytes จากด้านบนของหน่วยความจำค่อนข้างเร็ว. นี้สามารถถูกอ่านจาก write time ใน close(). อาจมีการประมวลผลพิเศษใดๆ ถูกนำมาใช้ในพื้นที่นี้เพื่อการเข้าถึง FAT อย่างรวดเร็ว.
Title: Re: How to Use MMC/SDC
Post by: tha on June 02, 2022, 12:03:09 PM
Improving Write Performance

เพื่อหลีกเลี่ยงปัญหาคอขวดนี้และเพิ่ม the write performance, จำนวนของ blocks ต่อ write transaction ต้องใหญ่สุดเท่าที่เป็นได้. แน่นอน all layers ระหว่าง the application and the media ต้องรองรับ multiple sector write feature. สำหรับ low level SDC/MMC write function, มันควรแจ้งจำนวนของ write sectors ถึง the card ก่อน the write transaction เพื่อ efficient internal write process. วิธีนี้เรียกว่า `pre-defined multiple block write'. The pre-definition command ไม่เหมือนกันระหว่าง MMC (CMD23) and SDC (ACMD23).

The memory cards ถูกแบ่งพาร์ติชั่นและถูกฟอร์แมตโดยเริ่มต้นเพื่อวางแนว the allocation unit ให้กับ the erase block boundary. เมื่อแบ่งพาร์ติชั่นใหม่หรือฟอร์แมตใหม่ the memory card ด้วย a device ที่ไม่เป็นไปตาม MMC/SDC (นี่เป็นเพียง a PC เท่านั้น) โดยไม่สนใจ, การเพิ่มประสิทธิภาพจะใช้งานไม่ได้และประสิทธิภาพการเขียนอาจหายไป. ผมพยายามฟอร์แมตใหม่ a 512MB SDC ใน FAT32 ด้วย a generic format function of the PC, the write performance ที่วัดใน file copy ถูกลดลงมามาก. ดังนั้นการฟอร์แมตใหม่ the card ควรถูกทำด้วย SD format utility หรือ SDC/MMC compliant equipments.

(https://i.imgur.com/9Lb5haT.png)
Title: Re: How to Use MMC/SDC
Post by: tha on June 02, 2022, 01:42:22 PM
License

MMC specification ถูกจัดให้มีโดย MMCA (Multimedia Card Association) และจากนั้นมันถูกโอนไปยัง JEDEC. Any license ไม่ถูกต้องการในการพัฒนาและขาย the MMC products. อย่างไรก็ตาม the MMC specification ไม่ถูกเปิดเผยต่อสาธารณะคุณจำเป็นต้องเข้าร่วม JEDEC เพื่อรับ the techinical documentations.

SD specification เป็นผลิตภัณฑ์ที่ได้รับการพัฒนาและให้บริการโดย SDA (SD Card Association) and SD-3C, LLC. ทุกองค์กรหรือบุคคลที่ขายผลิตภัณฑ์ใดๆ ที่มีข้อกำหนด SD จะต้องเป็นสมาชิก SDA และ HALA (โฮสต์และส่วนเสริมข้อตกลงสิทธิ์ใช้งานผลิตภัณฑ์) กับ SD-3C LLC จำเป็นสำหรับการขายผลิตภัณฑ์โฮสต์ SD ใดๆ ที่ระบุว่ารองรับการ์ด SD ไม่ว่าจะใช้อินเทอร์เฟซ โหมด SD หรือโหมด SPI ใดก็ตาม. สำหรับผลิตภัณฑ์ขั้นกลาง เช่น embedded module, จำเป็นต้องมีใบอนุญาตสำหรับอย่างใดอย่างหนึ่ง ผู้ขายโมดูลหรือผลิตภัณฑ์ขั้นสุดท้าย เฉพาะผู้ได้รับอนุญาตเท่านั้นที่สามารถใส่โลโก้ SD บนผลิตภัณฑ์ แพ็คเกจ และคู่มือได้ ค่าธรรมเนียมรายปีสำหรับสมาชิกทั่วไป SDA คือ 2,500 USD และใบอนุญาต ค่าธรรมเนียมสำหรับ HALA คือ 3,000 USD ต่อปี.

ทุกสถานะผลิตภัณฑ์รองรับการ์ด SD จำเป็นต้องได้รับใบอนุญาต กล่าวคือ ผลิตภัณฑ์ไม่ได้ระบุถึงการรองรับการ์ด SD ว่าไม่จำเป็นต้องได้รับอนุญาต แม้ว่าจะรองรับการ์ด SD จริงๆ ก็ตาม เพื่อหลีกเลี่ยงปัญหาใบอนุญาต ผู้ผลิตอุปกรณ์ที่ตระหนี่บางราย รวมถึงบริษัทใหญ่ๆ ที่ระบุว่า "รองรับ MMC", "รองรับ MMC และการ์ดที่รองรับ" หรือ "รองรับการ์ด TF" ไร้สาระ!

Links

  •  e.MMC | JEDEC
  •  SDA - SD Card Association
  •  SD Physical Layer Spec. by SDA
  •  About SPI
  •  Generic FAT file system module with sample code to control MMC/SDC