微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 2440裸机学习心得(下)

2440裸机学习心得(下)

时间:11-29 来源:互联网 点击:

的数据复制到SRAM的程序

看看这函数,了解一下就行了

附加:nandflash、norflash、SDRAM的区别:

ROM在系统停止供电的时候仍然可以保持数据,

RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。

SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲

动态RAM(Dynamic RAM/DRAM),DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很多,计算机内存就是DRAM的。

RAM

SRAM

DRAM

SDRAM,DDR RAM等

ROM

EROM,E2PROM等

NANDFLASH、NORFALSH等

NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。

NOR比较好操作,因为集成了系统地址线和数据线在芯片内,而NAND只有8个I/O,要操作,还需要结合相应硬件,如2440里有的NAND控制器。

14、基于OHCI的USB主机(仅做了枚举)

发现了一个很好的博客讲这个的:http://lancelot.blog.51cto.com/393579/328233

部分经典内容摘要:

在OHCI规范中,最重要的几个概念是端点(EndPoint - ED)、传输描述符(Transport Descriptor - TD)、主机控制器通信区(HCCA)。其中ED负责确定传输类型(控制传输、批量传输、同步传输和中断传输)。TD确定传输参数。HCCA用于确定数据传输是否完毕。

OHCI(基本流程)

进行控制/批量传输的主要处理流程如下:

1、创建控制/批量传输的ED列表;

2、创建ED下的TD列表;

3、设置命令到相应寄存器开始数据传输;

4、在中断处理程序中判断数据传输是否结束;

在OHCI层,主要完成如下功能:

l通过控制端口读写数据(包含SETUP、DATA、STATUS等3个TD);

l通过控制端口发送设置命令(没有DATA的TD);

l通过批量端口读数据;

l通过批量端口写数据;

l中断处理程序;

在OHCI的体系下,判断数据是否传输完毕是需要通过中断程序来判断的,当USB主机设置了HcControl和HcCommandStatus寄存器开始传输数据后,AM9200自动开始数据传输,并且定期的检查HcDoneHead寄存器的内容,并且将其转移到HCCA.DoneHead。然后产生中断,触发中断处理程序。

在中断处理程序中需要判断当前结束的TD是否是当前命令的最后一个TD,这样才能确保整个ED处理完毕。

进行U盘的数据传输时需要通过批量传输端口收发数据,所使用的协议为Mass Storage协议

要学习的一种数据结构与结构体结合应用的模式:

声明时:

typedef struct _ED {

…………

} ED,*P_ED;

__inline void CreateEd(unsigned int EDAddr,………….)

{

P_ED pED = (P_ED) EDAddr;//这个在函数中创建结构体pED来初始化

pED->Control =…………………….

}

调用时,因16字节对齐:

__align(16) EDed;(声明)

CreateEd(

(unsigned int) &ed,// ED Address

………….

);

简单的USB设备枚举,读取描述符:(控制传输步骤)

搞好最重要的3个数据结构:

端点描述符ED,传输描述符TD和共享数据域HCCA

由于HCCA只是创建一个空间域,不需要初始化

而ED和TD在设备枚举时需要不同初始化,故还要创建两个

初始化结构体函数:CreateEd和CreateGenTd

初始化OCHI寄存器(仅限枚举部分,不涉及中断)

复位,设置帧间隔,初始化HcDoneHead,设置HC为运行状态

写HCCA(开拓一片域)

检测是否有USB设备

设一定的时间检测,如for(i=0;i<100000;i++)

设备枚举的5个过程:第一步,主机得到设备描述符

第二步为设备分配地址

第三步,主机用新的地址再次获取设备描述符

第四步,主机读取设备全部配置描述符

第五步,主机发送SETUP数据包,用以设置配置,允许所有端点进入工作状态。

注意:控制写传输需要3个TD:第一个发送Setup包,第二个用于接收握手或零长度的数据包,第三个用于发送状态;

控制读传输需要4个TD:第一个发送Setup包,第二个用于接收数据,第三个用于发送一个零长度的数据包,,第四个用于接收状态

具体有两种方法判断TD是否传送完成:

中断法

初始化好中断寄存器rHcInterruptEnable |= (1<1)|(1<31);

rHcInterruptStatus |= (1<1);

pISR_USBH = (int)USBH_interrupt;

rINTMSK = ~BIT_USBH;

当有TD完成时,便进入中断。

如何判断枚举过程中每一步是否最后一个TD完成呢?

可以通过TD创造函数中DelayInterrupt即DI变量设置来巧妙解决

当DI=0x7时,即使TD完成也不会进入中断的,故可以只在每一阶段最后的TD设为非0x7,其余的设为0x7

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top