U盘SoC的设计与实现
控制传输的实现:
SETUP阶段:从图4中可看出,当token_valid_i、Pid_setup、ep0_sel有效时,表明收到一个有效的令牌包,udc_as_o被拉高,表示开始数据传送,转入ctrl_setup_stage状态,此时cpu把device_bufok_i信号拉高,随后开始接收数据,在setup阶段8个字节的标准请求数据接收完成后,send_hdsk_pkt_o信号变高,表示数据接收正确,要求发送一个ACK的握手包。本文引用地址:http://www.amcfsurvey.com/article/159369.htm
DATA阶段:数据阶段是可选的,并且数据阶段的传送方向可以是IN或OUT。以IN为例来介绍,当Pid_in、token_valid_i、ep0_sel有效时,udc_as_o被拉高,表示开始数据传送,转入ctrl_in_stage_empty,接着转入ctrl_in_stage状态,CPU将device_bufok_i拉高,表示开始接收数据,等待数据传完后,send_hdsk_pkt_o信号变高,表示数据接收正确,并将toggle机制翻转,要求打包模块发送一个ACK的握手包。
STATUS阶段:STATUS阶段也分为STATUS IN和STATUS OUT两种情况。在STATUS OUT阶段,接受到HOST发送过来的空数据包后,状态机会将send_hdsk_pkt_o信号拉高,发送ACK包给HOST。其状态机同SETUP状态机类似。
中断、批量、同步传输的IN实现:在硬件设计上,中断、批量和同步3种传输方式的处理都是一样的,只是在系统配置时,各传输方式对应的端点不同。下面以3种传输方式的IN传输来介绍。图5为3种传输方式的IN传输的状态机。
从上图可看出,在收到IN令牌后,状态机将tide_as_o拉高,表示开始传送数据,转入In_transfer_empty状态,再转入In_transfer状态,cpu若能传送数据,则把device_buf_ok_i信号置高,开始接收数据,等待数据传送完毕时,状态机会将send_data_pkt_o拉高,将此信号送至打包模块,从而将所需要的数据发送给HOST。
2.1.5 打包模块
本模块接收从SIE传来的控制信号,根据USB协议,产生所需要的包传送给发送模块。
2.1.6 tx模块
tx模块是总线发送模块。它将打包模块发送过来的包信息,进行并串转换,位填充,NRZI编码后,将数据发送给主机。此模块同rx模块类似,不再赘述。
2.2 8051CPU
此设计中的CPU为一个验证过的IP核。它包含:1个8位中央处理器、1个片内振荡器及时钟电路、4 KB ROM程序存储器、128B RAM数据存储器、可寻址64 KB外部数据存储器和64 KB外部程序存储器的控制电路、32条可编程的I/O线(4个8位并行I/O接口)、2个16位的定时,计数器、1个可编程全双工串行接口、5个中断源、2个优先级嵌套中断结构。将USB的通信请求接入到CPU的一个外部中断接口上,当USB的通信请求到来时,系统会产生一个中断,转入中断服务程序。
此外,还需要设计一个CPU的固件firmware,实现USBCORE的上电初始化过程(向UDC_Control中的控制寄存器和状态寄存器写入初始数据)、USB CORE中断处理并完成USB传输事务、使设备摆脱异常状态等功能。
2.3 UDC_Control
UDC_Control模块位于CPU和USB CORE之间,它完成CPU对USB通信的控制和数据的读写操作。UDC_CTRL模块中设有22个特殊功能寄存器,来完成USB通信。
USB_INT1和USB_INT2为中断寄存器,其各个位分别表示USB通信的9种中断请求(剩下的位为保留位),但USBCORE一次只能向CPU提供一个中断信号,这两个USB_INT寄存器供软件在进入中断后查询是USB的何种中断。EP0_CTRL、EP0_INFIFO_DATA、EPO_INFIFO_CNT、EP0_OUTFIFO_ DATA、EP0_OUTFIFO_CNT这5个寄存器都是与Endpoint0相关的,Endpoint0是由一个输入端点和一个输出端点组成,用来实现控制传输。所有支持USB标准请求和Class定义的请求都通过这个端点来处理。其中EP0_CTRL用来对Endpoint0的传输进行控制,当CPU要向USB主机传送数据时,就会将数据写入EP0_INFIFO_DATA,EP0_INFIFO_CNT是CPU向EP0_INFIFO_DATA中写入数据的字节数。EP0_OUT,Endpoint1,Endpoint2,Endpoint3,Endpoint4的寄存器情况类似,在此不再多做介绍。UDC_STATUS和DEVICE_CTRL是接口状态和控制寄存器,对CPU和USB CORE的通信进行监控。
2.4 NandFlash
针对NandFlash读写的特点,特别是其可随机读,但无法随机写的问题,需要通过设置缓冲区来解决。在与USB Host进行数据交换的过程中,最小的单位是扇区:512字节。由于NandFlash在写之前必须先擦除,而一擦又必须擦一个Block,因此在擦除某Block之前必须保存同一个Block中有关扇区的数据。因此,如果每收到一个扇区的内容就进行一次擦、保存、写的操作,系统任务将十分繁重,无法及时响应USB Host端的请求。因此,在系统中设置32K的缓冲区,每完一次数据传输后,记下本次要写的开始扇区和总扇区数,将本次要写的数据涉及的扇区以外的数据从NandFlash中读出来,存放在缓冲区中对应位置,然后擦除一个Block,再将缓冲区中内容一次全部重新写入NandFlash。
评论