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

2440裸机学习心得(下)

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

器MWCMD或MRCMD赋予数据端口,这样就指定了SRAM中的某个地址,并且在传输完一个数据后,指针会指向SRAM中的下一个地址,从而完成了连续访问数据的目的。

基于ARP协议的DM9000编写步骤:

初始化EINT7中断,设置中断函数入口

因为DM9000的数据中断引脚INT是连接到s3c2440的外部中断7引脚上的

编写好读和写DM9000寄存器函数,用其配置DM9000的寄存器

并使其用中断方式接收网卡数据,查询方式发送数据

(这步挺难的,很多寄存器要配置,对照着Datasheet和别人的程序)

注:DM9000内的寄存器的地址宏定义时,不用管基址,直接按OFFSET定义

编写好DM9000发送和接受函数(位宽为16)

分别把DM9000寄存器MWCMD或MRCMD赋予数据端口

接受数据时要注意,按照规定的格式来编写

定义一个符合ARP协议格式的数组,用于数据传输

将该数组作为发送函数形参发给PC机请求包

编写中断函数,清屏蔽

将接收函数中的数组内容,用串口打印出控制台

SD卡驱动

SD(全名为Secure Digital Memory Card,安全数码卡)

s3c2440集成了SD控制器,可以方便地读写SD、MMC和对SDIO进行操作。

可以用SDIO控制器来编,也可用SPI总线来编

SDIO的应用是未来嵌入式系统最重要的接口技术之一,会取代目前GPIO式的SPI接口

具体的CMD命令和协议内容自己看回资料了。

我使用的SD卡为手机的内存卡(不是MMC),型号为SDHC_V20_CARD,支持PLV2.0协议

主要讲编写简单的SD读写步骤:

准备工作,编写要使用到一堆东西:

检查SDIO命令发送,接收是否结束函数Chk_CMD_End(int cmd, int be_resp)

使用到的CMD和ACMD函数(这部分要配置寄存器,要查值,比较难,参考别人的吧)

编写一个要用的结构体SD_STRUCT,用于记录cCardType和iCardRCA等

SD卡识别模式:

初始化:时钟400K,Type B, clk enable,SD卡模式,FIFO reset

CMD 0——》reset指令

CMD 8——》工作电压范围,初始化SDHC卡,看是否支持PLV2.0,返回类型

CMD 55——》RCA为0x0,使用ACMD41前必须使用

ACMD 41——》识别卡能否在给定的VDD下工作

CMD 2——》查卡的CID信息

CMD 3——》要求系统给SD卡发送一个新相对地址RCA

改时钟频率:25M,准备进入transfer状态

CMD 7——》进入transfer状态

ACMD 6——》设置总线宽度为4bit

数据传输模式:

若需要擦除:

{

CMD 32——》start address

CMD 33——》end address

CMD 38——》erase

}注意:擦除后必须要进行复位,即重新初始化前面步骤,不然不能进行读写

单块写或多块写

CMD 7——》transfer模式

单块读或多块读

拓展:

将摄像头捕捉的图像,写进SD卡中,然后再还原显示出来

注意一个点:

就是要将LCD_BUFFER[480][272]的二维数组转化为LCD_BUFFER_SD[480*272]一维

一个疑问?好像只需51200就可将整幅图像都显示出来,而不需要480*272那么多

附加部分(有空研究):

文件系统的构建:

12、NORFLASH操作

norflash为EN29LV160AB

对norflash的操作主要就是读、写、擦除和识别

EN29LV160AB的数据宽度可以是8位字节型,也可以是16位的字型,它由某一引脚配置实现的。在这里我们选择字型

BYTE#位置硬件接地,直接默认为Word Mode(16位)

写操作只能使“1”变为“0”,而只有擦除才能使“0”变为“1”。因此在写之前一定要先擦除

对norflash另一个比较常用的操作是读取芯片的ID

NorFlash启动,nGCS0接NorFlash,起始地址为0x0。0x0000 0000–0x0800 0000为NorFlash

注意几个地方:

1、#defineCMD_ADDR0*((volatile U16 *)(0x555<1+flash_base))

之所以又把norflash中的地址向左移一位(即乘以2),是因为我们是把s3c2440的ADDR1连接到了norflash的A0上的缘故,(自己看原理图),容易理解,等于本来最低位的数被推后没了,要左移拉回来。

2、check_toggle函数(校验函数)中

oldtoggle = *((volatile U16 *)0x0);newtoggle = *((volatile U16 *)0x0);

表示两次读值

if((oldtoggle & 0x40)==(newtoggle & 0x40)) //表示两次的DQ6是否相同

if(newtoggle & 0x20)//DQ5是否为1

几个常用的函数:

读函数: read_en29lv160ab(U32 addr)

return *((volatile U16 *)(addr));//数据要转为16位

写函数: en29lv160ab_program(U32 addr, U16 dat)

第一个周期是把命令0xAA写入地址为0x555的命令寄存器中,

第二个周期是把命令0x55写入地址为0x2AA命令寄存器中,

第三个周期是把命令0xA0再写入地址为0x555命令寄存器中,

第四个周期为真正地把要写入的数

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

网站地图

Top