LH79520与多媒体存储卡接口应用
LH79520与多媒体存储卡接口应用
本文描述了如何完成LH79520与MMC硬件、软件上的连接,也将讨论通过将MMC与LH79520内建的SPI控制器连接实现LH79520在MMC中的应用,以及如何读取MMC中FAT16主引导模块
1 LH79520处理器带宽
LH79520是一款32位通用微控制器,使用ARM720T内核,176-pin QFP封装。ARM内核处理速度达到77.4 MHz,总线达到51.6 MHz。它集成了很多外设,包括MMU、CACHE、SSP、UART、 SDRAM 控制器、PWM、VIC、GPIO和一个65千色的LCD控制器。LH79520中的SPI控制器运行速度达到总线时钟速度的一半(接近25 Mbit/s),因此,SPI控制器驱动MMC时可获得最高处理速度为20 Mbit/s。
2 连接MMC和SHARP LH79520控制器
MMC基于先进的7-pin串行总线模式,一般称为“多媒体存储卡模式”。多数MMC的通信电压为2.0 V~3.6 V,存储器存取电压范围为2.7 V~3.6 V,容量在4MB到十亿字节。
表1所示,SPI模式下MMC引脚的分配。图1为LH79520与MMC在SPI模式下的一种连接方法。注意,如果在系统中只有1个MMC卡,那么MMC的引脚1必须接地。如果在系统中有多个MMC卡,需要使用一个GPIO来控制每个卡的引脚1。当引脚1为“低”时,相应的MMC卡开始工作。
引脚DataIn和DataOut的上拉电阻很重要,因为MMC卡在“Open Drain”模式下驱动引脚。地线与电源之间的空隙对于减少MMC中时钟与数据线之间的噪音也很重要。
表1:SPI模式下MMC引脚分配
图1:LH79520与MMC卡的连接
3 SPI命令
微控制器与MMC之间的通信时通过由微控制器向MMC传达不同的命令进行的。最常见的命令罗列在表2中,完整的命令集需要参考MMC的规格。
表2:SPI命令
命令传送
所有的命令都是6字节长,并且先传输MSB。
表3:命令传输
3.1 CRC计算
CRC计算如下:
7-bit CRC Calculation: G(x) = x7 + x3 + 1
M(x) = (start bit) × x39 + (second bit) × x38+…+(last bit
before CRC) × x0
CRC[6…0] = Remainder[(M(x) × x7)/G(x)]
3.2 响应格式R1
MMC卡在每个命令之后送出响应令牌,SEND_STATUS命令除外。
响应令牌为1字节长,MSB通常设置为0,其它为错误提示。一个“1”就以为着1个错误。表4和表5为R1格式。
表4:R1格式的字节结构
表5:R1格式的字节定义
3.3 响应格式R1B
这个响应令牌与R1格式的是一致的,增加了可选择的BUSY信号。MMC卡保持DataIn线低,得到BUSY信号。这个信号可以一直持续到MMC卡完成处理目前的程序。一旦卡解除了这条数据线,就可以执行下一个命令。
3.4 响应格式R2
这个响应SEND_STATUS命令的令牌有2个字节长。R2数据格式见表6和表7。
表6:响应格式R2
表7:响应R2格式定义
3.5数据响应
卡中写入的每个数据块都由一个数据响应令牌确认。这个响应有1字节长,格式见表8。
表8:数据响应字节结构
数据位为下列两种状态之一:
3.6数据令牌
读取和写入命令自身都有数据的传输。通过数据令牌来传送或接收数据。所有的数据字节都是先传送MSB。
数据令牌为4~512字节长,格式见表9。
表9:数据令牌开始字节结构
数据令牌最后两个字节为16-bit CRC
3.7 数据错误令牌
如果读取操作失败,卡不能提供响应的数据,那么就会产生一个数据错误令牌。这个令牌有1个字节长,格式见表10
表10:数据错误令牌结构
4 软件实现
4.1 SHARP SPI驱动
LH79520同步串行端口(SSP)外设支持Motorola SPI、National Semiconductor Mircrowire或者Texas Instruments的Synchronous Serial interfaces。
SSP实现数据写入内部传送FIFO从并行到串行的转换,接着以串行的形式将数据传送到外部的附属外设。SSP也从外部的附属外设中接收串行数据,执行接收数据从串行到并行的转换,再将接收数据缓传送到内部接收FIFO中。两个FIFO存储地址为16 bits wide × 8。数据帧长度为4~16 bits。
LH79520 DMAC(DMA控制器)将数据送入/送出片上SSP。
LH79520 SSP的驱动为lh79520_ssp_driver.c。MMC接口的驱动为lh79520_mmc_driver.c。
4.2 时钟控制
SPI主机使用SPI总线时钟信号将卡设置为节能模式,或者控制总线的数据流(避免under-run 或over-run的状态)。主机可以改变时钟频率或者将之完全停止。
以下是几个SPI主机必须遵守的原则:
•主机频率可以随时改变,但是由MMC定义的最大的数据传送频率除外。
•时钟必须为MMC输出数据或者响应令牌工作。在完成最后的SPI总线程序之后,主机还需要提供8个时钟周期,使卡可以在关闭时钟前完成操作。
在这8个时钟周期中,CS信号的状态是不相关的。
4.3 SPI总线程序
以下是不同SPI总线程序的例子
•一个命令/响应程序。在卡响应最后位之后必须输出8个时钟。
•一个读取数据程序。在最后数据块的尾位必须输出8个时钟。
•一个写入数据程序。在最后一个数据块的尾位必须输出8个时钟。
•一个写入数据程序。在CRC状态令牌后必须输出8个时钟。
•主机可以停止处于“BUSY”状态下卡的时钟。在没有主机时钟的条件下,MMC也可以完成编程操作,但是主机必须提供一个时钟边沿,是卡切断BUSY信号。如果没有这个时钟边沿,MMC将使DataOut线位低,且一直保持下去。
4.4 模式选择
在本文中,我们使用的使MMC的SPI模式。在本文中描述的所有程序都是基于这个SPI模式的。
在MultiMedia-Card模式下,MMC被唤醒。在接收Reset命令中,如果CS信号(MMC的引脚1)被断言为“低”,那么将进入SPI模式。如果卡是处于MultiMediaCard模式,那么它不会对以SPI为基础的命令做出响应。
如果要求进入SPI模式,那么卡将响应SPI模式。
重启卡回复到MultiMediaCard模式。在SPI模式下,不使用MultiMediaCard协议状态。SPI模式支持下的MultiMediaCard命令也可以执行。
当一个电源回路后卡没有回到MultiMediaCard模式,引脚1(CS)必须为“低”,CMD0(CRC随后)将送到CMD(DataIn,引脚2),知道卡进入SPI模式。
在SPI模式下,不能进行CRC检测。但是,因为卡经常在MultiMediaCard模式下启动,所以CMD0必须跟一个空CRC字节(即使命令使用SPI结构传送也是如此)。一旦卡进入SPI模式,CRC可能无法使用。
这个CMD0命令(0x40 0x00 0x00 0x00 0x00 0x95)和将MMC从MultiMediaCard模式转换到SPI模式的命令是一样的。在传送出这个命令之后,CRC检查无法使用,除非你强制进行。当CRC检测重视,6字节命令的最后以为将被视为读取/写入命令。
4.5 命令和响应
在MMC命令格式中,一个命令由6字节组成,先传送MSB。一旦SPI模式设置为8-bit数据宽度,那么6字节的命令将持续的传送。
命令响应会有点复杂。响应的开始位不会紧随字节的第一个时钟,而是在时钟流的任何一个地方产生,主要视MMC和时钟的速度决定。因此需要进行软件的人工安排。
4.6 复位程序
初始化命令如下:
1. Send 80 clocks to start bus communication
2. Assert nCS LOW
3. Send CMD0
4. Send 8 clocks for delay
5. Wait for a valid response
6. If there is no response, back to step 4
7. Send 8 clocks of delay
8. Send CMD1
9. Send 8 clocks of delay
10. Wait for valid response
12. Repeat from step 9 until the response shows READY.
CMD1会花费大量周期完成这个程序。在每个电源回路之后,MC都会进入闲置状态(不活跃)。如果使用CMD13(SEND_STATUS)检查状态的话,响应中的闲置位为1。只有当MMC从闲置模式转为活跃时,卡才能进行读取和写入操作。
4.7 数据读取
SPI模式支持单个区块读取操作。一句一个有效读取命令的接收,卡将发出一个响应令牌,长度由之前的SET_BLOCK_LENGTH命令决定。开始地址可以是卡中有效地址中的任意一个。。但是每个区块必须保存在单个物理扇区里。在微控制器将数据读取的命令传送到卡后,微控制器监督数据流的输入,等待数据令牌0xFE。当响应开始位0在时钟流中任意一个时间产生,我们必须使用软件来安排字节读取的顺序。
4.8 数据写入
数据写入操与数据读取一样。在SPI模式下,MMC支持单个区块的写入。
卡在接受到有效的写入命令之后,会产生一个响应令牌,等到数据区块从主机传送过来。但是唯一有效的区块长度位512字节。在接收一个数据区块后,卡将产生数据响应令牌。如果数据区块接收没有问题,那么马上将进行编程。
微控制器必须发出第一个写入命令。在所有的字节都被送出之后,微控制器等待响应。收到响应之后,微控制器会检查响应中是否有错误。在响应被送回到卡之后,卡将DataOut设置为“低”,开始写入操作。
4.9 数据擦除
数据擦除与数据读取和写入的程序相似。
4.10 读取FAT16文件系统
虽然MMC撮弄初期空间可进通过0到最后一个字节的地址范围对字节进行编码,但是这并不是一个简单的排列,而是应该分成若干个分支。
存储字节粉为512字节的区块,称为扇区。每个区块可以独立读取、写入和擦除。
扇区根据卡的容量分为16或32个扇区。任何分组扇区或者擦除扇区的组合都可以由一个单独的擦除命令进行擦除。一个写入命令在写入新的数据之前都将存储器先擦除。对未进行擦除的存储器先进行擦除可以加速紧接着的写入操作。
FAT16文件系统通常在PC上使用,也很容易找到读卡器对Multi- MediaCard进行格式化。在MMC被格式化为FAT16后,字节0到字节0x200都会被用作为FAT16格式,在扇区0中的512字节也被成为Master Boot Record (MBR),具体格式见表13。
在MBR中,每个分区项目见表14。
表14:FAT分区项目
结论:使用LH79520的SPI接口对MMC卡进行读取和写入是很实用的一种应用。本文为你提供一种使用LH79520进行MMC设计的基础。"
本文可能所用到的IC型号: AN5862S BLM31A700SPTM00-03 MC74LVX240DT HA17741GS MAX3040CSE TA7678AP BAS40-04LT1
本文描述了如何完成LH79520与MMC硬件、软件上的连接,也将讨论通过将MMC与LH79520内建的SPI控制器连接实现LH79520在MMC中的应用,以及如何读取MMC中FAT16主引导模块
1 LH79520处理器带宽
LH79520是一款32位通用微控制器,使用ARM720T内核,176-pin QFP封装。ARM内核处理速度达到77.4 MHz,总线达到51.6 MHz。它集成了很多外设,包括MMU、CACHE、SSP、UART、 SDRAM 控制器、PWM、VIC、GPIO和一个65千色的LCD控制器。LH79520中的SPI控制器运行速度达到总线时钟速度的一半(接近25 Mbit/s),因此,SPI控制器驱动MMC时可获得最高处理速度为20 Mbit/s。
2 连接MMC和SHARP LH79520控制器
MMC基于先进的7-pin串行总线模式,一般称为“多媒体存储卡模式”。多数MMC的通信电压为2.0 V~3.6 V,存储器存取电压范围为2.7 V~3.6 V,容量在4MB到十亿字节。
表1所示,SPI模式下MMC引脚的分配。图1为LH79520与MMC在SPI模式下的一种连接方法。注意,如果在系统中只有1个MMC卡,那么MMC的引脚1必须接地。如果在系统中有多个MMC卡,需要使用一个GPIO来控制每个卡的引脚1。当引脚1为“低”时,相应的MMC卡开始工作。
引脚DataIn和DataOut的上拉电阻很重要,因为MMC卡在“Open Drain”模式下驱动引脚。地线与电源之间的空隙对于减少MMC中时钟与数据线之间的噪音也很重要。
表1:SPI模式下MMC引脚分配
图1:LH79520与MMC卡的连接
3 SPI命令
微控制器与MMC之间的通信时通过由微控制器向MMC传达不同的命令进行的。最常见的命令罗列在表2中,完整的命令集需要参考MMC的规格。
表2:SPI命令
命令传送
所有的命令都是6字节长,并且先传输MSB。
表3:命令传输
3.1 CRC计算
CRC计算如下:
7-bit CRC Calculation: G(x) = x7 + x3 + 1
M(x) = (start bit) × x39 + (second bit) × x38+…+(last bit
before CRC) × x0
CRC[6…0] = Remainder[(M(x) × x7)/G(x)]
3.2 响应格式R1
MMC卡在每个命令之后送出响应令牌,SEND_STATUS命令除外。
响应令牌为1字节长,MSB通常设置为0,其它为错误提示。一个“1”就以为着1个错误。表4和表5为R1格式。
表4:R1格式的字节结构
表5:R1格式的字节定义
3.3 响应格式R1B
这个响应令牌与R1格式的是一致的,增加了可选择的BUSY信号。MMC卡保持DataIn线低,得到BUSY信号。这个信号可以一直持续到MMC卡完成处理目前的程序。一旦卡解除了这条数据线,就可以执行下一个命令。
3.4 响应格式R2
这个响应SEND_STATUS命令的令牌有2个字节长。R2数据格式见表6和表7。
表6:响应格式R2
表7:响应R2格式定义
3.5数据响应
卡中写入的每个数据块都由一个数据响应令牌确认。这个响应有1字节长,格式见表8。
表8:数据响应字节结构
数据位为下列两种状态之一:
3.6数据令牌
读取和写入命令自身都有数据的传输。通过数据令牌来传送或接收数据。所有的数据字节都是先传送MSB。
数据令牌为4~512字节长,格式见表9。
表9:数据令牌开始字节结构
数据令牌最后两个字节为16-bit CRC
3.7 数据错误令牌
如果读取操作失败,卡不能提供响应的数据,那么就会产生一个数据错误令牌。这个令牌有1个字节长,格式见表10
表10:数据错误令牌结构
4 软件实现
4.1 SHARP SPI驱动
LH79520同步串行端口(SSP)外设支持Motorola SPI、National Semiconductor Mircrowire或者Texas Instruments的Synchronous Serial interfaces。
SSP实现数据写入内部传送FIFO从并行到串行的转换,接着以串行的形式将数据传送到外部的附属外设。SSP也从外部的附属外设中接收串行数据,执行接收数据从串行到并行的转换,再将接收数据缓传送到内部接收FIFO中。两个FIFO存储地址为16 bits wide × 8。数据帧长度为4~16 bits。
LH79520 DMAC(DMA控制器)将数据送入/送出片上SSP。
LH79520 SSP的驱动为lh79520_ssp_driver.c。MMC接口的驱动为lh79520_mmc_driver.c。
4.2 时钟控制
SPI主机使用SPI总线时钟信号将卡设置为节能模式,或者控制总线的数据流(避免under-run 或over-run的状态)。主机可以改变时钟频率或者将之完全停止。
以下是几个SPI主机必须遵守的原则:
•主机频率可以随时改变,但是由MMC定义的最大的数据传送频率除外。
•时钟必须为MMC输出数据或者响应令牌工作。在完成最后的SPI总线程序之后,主机还需要提供8个时钟周期,使卡可以在关闭时钟前完成操作。
在这8个时钟周期中,CS信号的状态是不相关的。
4.3 SPI总线程序
以下是不同SPI总线程序的例子
•一个命令/响应程序。在卡响应最后位之后必须输出8个时钟。
•一个读取数据程序。在最后数据块的尾位必须输出8个时钟。
•一个写入数据程序。在最后一个数据块的尾位必须输出8个时钟。
•一个写入数据程序。在CRC状态令牌后必须输出8个时钟。
•主机可以停止处于“BUSY”状态下卡的时钟。在没有主机时钟的条件下,MMC也可以完成编程操作,但是主机必须提供一个时钟边沿,是卡切断BUSY信号。如果没有这个时钟边沿,MMC将使DataOut线位低,且一直保持下去。
4.4 模式选择
在本文中,我们使用的使MMC的SPI模式。在本文中描述的所有程序都是基于这个SPI模式的。
在MultiMedia-Card模式下,MMC被唤醒。在接收Reset命令中,如果CS信号(MMC的引脚1)被断言为“低”,那么将进入SPI模式。如果卡是处于MultiMediaCard模式,那么它不会对以SPI为基础的命令做出响应。
如果要求进入SPI模式,那么卡将响应SPI模式。
重启卡回复到MultiMediaCard模式。在SPI模式下,不使用MultiMediaCard协议状态。SPI模式支持下的MultiMediaCard命令也可以执行。
当一个电源回路后卡没有回到MultiMediaCard模式,引脚1(CS)必须为“低”,CMD0(CRC随后)将送到CMD(DataIn,引脚2),知道卡进入SPI模式。
在SPI模式下,不能进行CRC检测。但是,因为卡经常在MultiMediaCard模式下启动,所以CMD0必须跟一个空CRC字节(即使命令使用SPI结构传送也是如此)。一旦卡进入SPI模式,CRC可能无法使用。
这个CMD0命令(0x40 0x00 0x00 0x00 0x00 0x95)和将MMC从MultiMediaCard模式转换到SPI模式的命令是一样的。在传送出这个命令之后,CRC检查无法使用,除非你强制进行。当CRC检测重视,6字节命令的最后以为将被视为读取/写入命令。
4.5 命令和响应
在MMC命令格式中,一个命令由6字节组成,先传送MSB。一旦SPI模式设置为8-bit数据宽度,那么6字节的命令将持续的传送。
命令响应会有点复杂。响应的开始位不会紧随字节的第一个时钟,而是在时钟流的任何一个地方产生,主要视MMC和时钟的速度决定。因此需要进行软件的人工安排。
4.6 复位程序
初始化命令如下:
1. Send 80 clocks to start bus communication
2. Assert nCS LOW
3. Send CMD0
4. Send 8 clocks for delay
5. Wait for a valid response
6. If there is no response, back to step 4
7. Send 8 clocks of delay
8. Send CMD1
9. Send 8 clocks of delay
10. Wait for valid response
12. Repeat from step 9 until the response shows READY.
CMD1会花费大量周期完成这个程序。在每个电源回路之后,MC都会进入闲置状态(不活跃)。如果使用CMD13(SEND_STATUS)检查状态的话,响应中的闲置位为1。只有当MMC从闲置模式转为活跃时,卡才能进行读取和写入操作。
4.7 数据读取
SPI模式支持单个区块读取操作。一句一个有效读取命令的接收,卡将发出一个响应令牌,长度由之前的SET_BLOCK_LENGTH命令决定。开始地址可以是卡中有效地址中的任意一个。。但是每个区块必须保存在单个物理扇区里。在微控制器将数据读取的命令传送到卡后,微控制器监督数据流的输入,等待数据令牌0xFE。当响应开始位0在时钟流中任意一个时间产生,我们必须使用软件来安排字节读取的顺序。
4.8 数据写入
数据写入操与数据读取一样。在SPI模式下,MMC支持单个区块的写入。
卡在接受到有效的写入命令之后,会产生一个响应令牌,等到数据区块从主机传送过来。但是唯一有效的区块长度位512字节。在接收一个数据区块后,卡将产生数据响应令牌。如果数据区块接收没有问题,那么马上将进行编程。
微控制器必须发出第一个写入命令。在所有的字节都被送出之后,微控制器等待响应。收到响应之后,微控制器会检查响应中是否有错误。在响应被送回到卡之后,卡将DataOut设置为“低”,开始写入操作。
4.9 数据擦除
数据擦除与数据读取和写入的程序相似。
4.10 读取FAT16文件系统
虽然MMC撮弄初期空间可进通过0到最后一个字节的地址范围对字节进行编码,但是这并不是一个简单的排列,而是应该分成若干个分支。
存储字节粉为512字节的区块,称为扇区。每个区块可以独立读取、写入和擦除。
扇区根据卡的容量分为16或32个扇区。任何分组扇区或者擦除扇区的组合都可以由一个单独的擦除命令进行擦除。一个写入命令在写入新的数据之前都将存储器先擦除。对未进行擦除的存储器先进行擦除可以加速紧接着的写入操作。
FAT16文件系统通常在PC上使用,也很容易找到读卡器对Multi- MediaCard进行格式化。在MMC被格式化为FAT16后,字节0到字节0x200都会被用作为FAT16格式,在扇区0中的512字节也被成为Master Boot Record (MBR),具体格式见表13。
在MBR中,每个分区项目见表14。
表14:FAT分区项目
结论:使用LH79520的SPI接口对MMC卡进行读取和写入是很实用的一种应用。本文为你提供一种使用LH79520进行MMC设计的基础。"
本文可能所用到的IC型号: AN5862S BLM31A700SPTM00-03 MC74LVX240DT HA17741GS MAX3040CSE TA7678AP BAS40-04LT1
TAG:
