一种以优盘为存储介质的MP3播放器设计
2 软件设计
2.1优盘读写软件的实现
USB组织定义了海量存储设备类(mass storage class)的规范。这个类规范包括4个独立的子类规范:USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport 、USB Mass Storage Class BulkOnly Transport、USB Mass Storage Class ATA Command Block、USB Mass Storage Class UFI Command Specification。其中优盘属于海量存储设备,遵循bulkonly传输协议,子类采用UFI命令集。本设计软件的总体结构如图3所示。其中两条点画线之间的部分为读/写优盘的软件结构。
2.1.1 USB物理层协议的实现
该部分实现S3C44B0X对SL811HS芯片的直接底层数据的读写,包括对SL811HS的初始化及读/写一个字节的函数。限于篇幅,此处只列出对SL811HS芯片的初始化程序:
/*********************************
函数名称:SL811_Init
函数功能:初始化SL811HS芯片
输入参数:无
返回值:无
*********************************/
void SL811_Init(void){
//初始化U盘为未插入状态
bFlags.bits.SLAVE_ONLINE = FALSE;
bFlags.bits.SLAVE_FOUND = FALSE;
bFlags.bits.SLAVE_REMOVED = FALSE;
bFlags.bits.SLAVE_ENUMERATED = FALSE;
bFlags.bits.SLAVE_IS_ATTACHED = FALSE;
//允许硬件产生SOF(Start of Frame)
SL811Write(CtrlReg,0x04);
DelayMs(100);
SL811Write(CtrlReg,0x01);
//设置SOF,1 ms中断
SL811Write(cDATASet,0xe0);
//设置为主机工作模式
SL811Write(cSOFcnt,0xae);
SL811Write(EP0Status,0x50);
//地址设为0
SL811Write(EP0Counter,0);
//允许数据发送
SL811Write(EP0Control,0x01);
SL811Write(IntEna,0x20);
//清中断
SL811Write(IntStatus,INT_CLEAR);
}
2.1.2 USB设备协议层的实现
该部分实现对优盘扇区的直接读写,其中两个很重要的函数为Bulkin和Bulkout。此处只列出Bulkin函数的实现:
/**********************************
函数名称:epB
ulkRcv
函数功能:实现bulkonly协议中的Bulkin函数
输入参数:pBuffer为数据的地址,len为数据的长度
返回值:TRUE为成功,FALSE为失败
**********************************/
unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len){
usbstack.usbaddr=0x1;
usbstack.endpoint=usbstack.epbulkin;
usbstack.pid=PID_IN;
//设置包长度为64
usbstack.wPayload=64;
usbstack.wLen=len;
usbstack.buffer=pBuffer;
if(usbstack.wLen){
if(!usbXfer())
return FALSE;
}
return TRUE;
}
评论