NOTICE: The Processors Wiki will End-of-Life in December of 2020. It is recommended to download any files or other content you may need that are hosted on processors.wiki.ti.com. The site is now set to read only.
SD-MMC Usage Notes on OMAP35x and AM37x
The MMC interfaces are the generally the same between the OMAP35x processors and AM37x processors. The only difference is that AM37x only supports up to 4-bit on MMC/SD1. OMAP35x supports up to 8-bit on MMC/SD1. Please refer to the AM35x SD-MMC Usage Notes wiki if you want information for that device.
Allowable Voltages on the MMC interfaces
MMC1 has built-in voltage translation to support 1.8V/3.0V
MMC2 is a 1.8V interface though it can support other voltages using external translation logic
MMC3 operates ONLY at 1.8V and cannot support external voltage translation
MMC1 can support either 1.8V or 3.0V I/Os. This is controlled using VDDS_MMC1 and VDDS_MMC1a (sometimes called VDDS_SIM on some schematics). VDDS_MMC1 powers MMC_DAT[3:0] and VDDS_MMC1a powers MMC_DAT[4:7]. So if you only need 4-bit MMC/SD, you can just power VDDS_MMC1.
The ROM code supports booting from MMC1, but only at 3.0V. If using a TPS659xx power companion chip, the ROM will command this chip to output 3.0V on VMMC1 when attempting to boot from MMC1. If you are not using a TPS659xx, you must ensure 3.0V is present when the ROM attempts to boot from MMC1.
When using MMC1, ensure that all PADCONF registers associated with MMC1 signals have INPUTENABLE=1. Even MMC1_CLK need input enabled, as this clock is reused from the pin by the module to retime incoming data.
When using MMC1, also ensure that you take care of PBIAS. Most of the details can be found in the TRM. The section on "Extended-Drain I/O Pin and PBIAS Cell" describes the need for these cells for the dual voltage nature of the MMC1 I/Os. The register CONTROL_PBIAS_LITE must be programmed properly to accomodate either 1.8V or 3.0V. Failure to do so can result in damage to the I/Os. Ensure you follow the guidelines in "Extended-Drain I/Os and PBIAS Cells Programming Guide" section of the System Control Module chapter of the TRM. This will show you how to change between 1.8V and 3.0V (and vice versa) safely.
Using a 3.0V card on MMC2
If want to use a 3.0V card with MMC2 you will need level shifting logic such as the SN74AVCA406L. Since the level shifting will cause some delay in the signaling, mmc2_clkin is used to account for this delay. So you take mmc2_clk, run it through the level shifter (e.g. to 3.0V), take that output and run it back through the level shifter (back to 1.8V) and input that signal to mmc2_clkin. The SN74AVCA406L actually has a pin dedicated to that purpose. You simply connect the CLK-f pin of the SN74AVCA406L to the mmc2_clkin pin of OMAP. The MMC2 peripheral can now accurately account for the delay that occurs (both in the MMC card getting the 3.0V clock and in the peripheral getting back the delayed data from the MMC card). By default MMC2 is configured to utilize the mmc2_clkin input (CONTROL_DEVCONF1.MMCSDIO2ADPCLKISEL=0), however, please make sure that this bit is set correctly. Note that when you use MMC2 with the direction signals, you are limited to 4-bit data (since some of the direction signals are muxed with the upper data bits).
Auto direction sensing tranceivers, such as the TXS0206 or TXS0108, are popular devices used for MMC voltage translation and do not require direction signals. These have been used successfully by customers on MMC2. In these cases, the MMC2_CLKIN signal was not used, and you must make sure the following are configured:
- CONTROL_DEVCONF1.MMCSDIO2ADPCLKISEL = 1 (ie, internal loopback)
- CONTROL_PADCONF_MMC2_CLK[INPUTENABLE] = 1
It is recommended that you only use this configuration if you are able to place the processor, transeiver, and MMC/SD device close together with short trace lengths. Long trace lengths can introduce large capacitive loading and affect functionality.
Note that booting from MMC2 precludes the use of MMC2_CLKIN (the boot ROM uses CONTROL_DEVCONF.MMCSDIO2ADPCLKISEL=1). Thus, you cannot boot from MMC2 if you use a tranceiver that feeds back the clock with MMC2_CLKIN. You must use MMC2 at 1.8V with no transceiver, or one of the auto direction sensing transceivers with the above mentioned restrictions (ideally, you should use MMC1 if you need to boot from a 3.0V MMC/SD source).
Also note that mmc2_dir_dat1 signal is meant for the direction signal of dat1 and dat3. This means some glue logic (or external GPIO) might be necessary if you need both "dir_dat1" and "dir_dat3" signal being sent to the level shifter. Note you can "double" the driven current (buffer strength) on "mmc2_dir_dat1" signal from the default 4mA to 8mA.
In this respect mmc2_dir_dat0 only control the direction signal for dat0. Same for mmc2_dir_dat2 which only control the direction signal for dat2.
Using a 1.8V card on MMC2
The default register settings "expect" external translation logic to be present. If you were to use MMC2 at 1.8V without the level shifters then the bit CONTROL_DEVCONF1.MMCSDIO2ADPCLKISEL needs to be set in the System Control module. By default MMC2 is configured to utilize the mmc2_clkin input (CONTROL_DEVCONF1.MMCSDIO2ADPCLKISEL=0). If not using external translation logic then you should set CONTROL_DEVCONF1.MMCSDIO2ADPCLKISEL=1 in order to internally loop back the output clock, and that the MMC2_CLK pin is muxed in the PADCONF registers as an input (INPUTENABLE bit) as well.
It is recommended that MMC3 be only used for 1.8V connectivity devices. It does not have an internal transceiver like MMC1 and does not have external direction signals like MMC2. It is possible to put auto direction sensing transceivers as described with MMC1, however, the buffer strength and loading constraints are restricted with MMC3. Typical buffer strengths for MMC3 is 4mA vs. 8mA for MMC1. Also, MMC1 can handle up to a 30pF load, whereas MMC3 can only handle up to 14pF load.
- Since MMC1 supports multiple voltages there are some additional configuration registers. These requirements are discussed in the article Additional Configuration for GPIO120-129 on OMAP35x.
- The I/O pads have very strong drive strength. It's recommended to use series resistors (start around 30 ohms and tune to your board design) to dampen over/undershoots. At a minimum you should be sure to include the resistor on the clock pin as it has the potential to create the most issues. The resistor should be placed close to the OMAP.
- In order to do boundary scan on the SD/MMC pins there is some special configuration that needs to be done. Please see Boundary Scan on OMAP35x for more info.