实现TMS320C5509对MMC存储卡的访问

本文作者:admin       点击: 2006-03-07 00:00
前言:
TMS320C5509是TI公司推出的定点DSP芯片,具有功耗低,在片外围器件多等特点,适用于便携式超低功率场合,且自带有MMC控制器。MMC卡的全称为MultiMediaCard,是目前使用最为广泛的数码存储卡之一,广泛应用于数码相机、MP3、手机、掌上电脑等等各种便携式设备中。由于MMC卡独特的特性,其容量由128M到4G不等。实现TMS320C5509对MMC存储卡的读写有相当大的实用价值。

TMS320C5509和MMC控制器简介

TMS320C5509 DSP是目前集成度最高的通用DSP ,可实现因特网媒体娱乐终端、个人医疗、个人识别、保密技术、数码相机、个人摄像机等应用。 C5509 DSP 支持最广泛的DSP板上外围器件,包括用于直接连接PC机或其它USB主机设备的USB 1.1端口,支持移动设备普遍使用的多媒体卡(MultiMedia Card,简称MMC)和数字存储卡(Secure Digital Memory Card,简称SD卡)等便携式存储卡。其无与伦比的功能集成可使设计者在设计电池供电产品和连接PC机产品时,将主板空间和功率降低3倍,且支持大多数流行的可移动存储标准和多媒体格式。
多媒体卡控制器可以读写多媒体卡(MultiMedia Card,简称MMC)和数字存储卡(Secure Digital Memory Card,简称SD卡)上的存储器,该控制器有如下特点:支持MMC/SD协议和SPI协议;软件支持未来的扩展升级;MMC控制器的运行频率可以通过程序设置;MMC控制器与存储卡之间控制传输速率的时钟可以通过编程设置。

MMC控制器与MMC卡的硬件结构

MMC控制器可以在存储卡和CPU或DMA控制器之间传输数据,也可以在存储卡之间传输数据。CPU和DMA控制器可以读写MMC控制器的控制寄存器和状态寄存器。在必要时CPU和DMA控制器可以将数据存储在DSP存储器中或外设的寄存器中,也可从DSP存储器中或外设的寄存器中获得数据。CPU可以通过读写状态寄存器来监视数据的传输情况,并响应中断。DMA控制器可以通过两个DMA事件来改变接受和发送的状态。MMC控制器主要有MMCCTL,MMCFCLK,MMCCLK寄存器来控制。其功能如表1~表3所述。
MMC控制器和存储卡之间传输数据可采用MMC传输模式和SD传输模式。当连接多个卡时MMC控制器使用MMC/SD控制器来发送命令来选择一个卡,每次只与一个卡进行通信。
MMC控制器的接口:MMC控制器共有7个引脚。
CLK引脚提供给其它引脚的传输的时钟。
CMD引脚用于存储卡和接口之间的双向通信。
DAT0用于传输数据.
DATA1-DATA3仅用于SD卡的传输。
MMC控制器与MMC的硬件连接相当简单,其连接方法如下图1所示。

软件接口

DSP对MMC卡的读写过程包括初始化,读写。

初始化的过程分为控制器初始化和MMC卡的初始化过程。

控制器的初始化

控制器的初始化的流程如图2所示,其初始化过程分为:
(1) 使MMC控制器寄存器MMCCTL中的CMDRST和DATRST位复位,通过DMAEN位来使能或禁止DMA事件,设置SPIEN位禁止SPI模式,清零DATAEG位来禁止DAT3脚的边缘检测。
(2) 通过MMCFCLK的FDIV域,MMCCLK寄存器的CDIV域设置分频系数。
(3) 设置MMC控制器的使能/禁止idle的能力,由MMCFLCK寄存器的IDLEEN位来控制。在MMCTOR和MMCTOD寄存器中设置写超时和读超时。
(4) 清除MMCCTL的CMDRST位和DATRST位,使控制器脱离复位状态。使能CLK引脚,向MMC卡送出时钟信号。
b) MMC卡的初始化操作过程如下:
(1) 让所有的MMC卡进入静止状态。
(2) 检查所有卡的电压状态,将电压不在认定范围内的卡设为不可用状态。
(3) 向所有的卡发送卡识别号。
(4) 通过得到的卡的惟一标识号分配相对地址。

● MMC卡的读写
MMC的读写只能以块的形式进行读写。TI已提供了专门针对MMC的操作的CSL库函数,其头文件为csl_mmc.h。其读写函数原型为:
CSLAPI int  MMC_read(MMC_Handle mmc, Uint32 cardAddr, void *buffer, Uint32 length);
CSLAPI int  MMC_write(MMC_Handle mmc, Uint32 cardAddr, void *buffer, Uint32 bufLen)
参数说明:MMC_Handle mmc 操作MMC卡的句柄。
Uint32 cardAddr 读写的起始地址
void *buffer 缓冲区的起始地址
Uint32 length 读缓冲区的长度
Uint32 bufLen 写缓冲区的长度
   
示例代码

以下程序实现对MMC卡进行写操作的完整的过程,读的过程与此类似。
#include   /* 包含CSL 库 */
MMC_Handle mmc1;
MMC_CardIdObj *cardid;
MMC_CardObj *card;
int temp,i;
MMC_NativeInitObj Init = {
0, /* 禁止DMA访问                 */
0, /* Determines if MMC goes IDLE during IDLE instr   */
3, /* CPU时钟到MMC控制器的时钟分频系数        */
2, /* MMC控制器到存储单元的时钟分频系数       */
0, /* No. memory clks to wait before response timeout */
0, /* No. memory clks to wait before data timeout     */
512, /* 块的大小 */
};
Uint16 data[512];
Uint16 datareceive[512];
Uint16 *dataptr = data;
Uint16 *datarcv = datareceive;
main()
{
CSL_init();
for (i=0;i<512;i++) {    data[i] = i;    }
mmc1 = MMC_open(1);  //打开MMC端口1
temp = MMC_initNative(mmc1,&Init); //初始化MMC控制器
MMC_sendGoIdle(mmc1); //向所有卡发送SEND_GO_IDLE命令
for(temp=0;temp<101b;temp++) { asm(“NOP “); } //延迟等待完成卡的初始化
temp=MMC_sendOpCond(mmc1,0x00100000); //向所有卡发出操作条件
temp = MMC_sendAllCID(mmc1,cardid); //获得所有卡的ID号
temp = MMC_setRca(mmc1,card,2); //分配相对地址
temp = MMC_selectCard(mmc1,card); //选择要操作的卡
temp = MMC_write(mmc1,0,dataptr,512); //向卡写一块数据
MMC_close(mmc1); //关闭MMC控制器
}

小 结
本文以TMS320C5509的DSP芯片操作MMC卡为例,阐明了通过MMC控制器操作MMC储存卡的过程和方法。