2440裸机学习心得(下)
器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命令寄存器中,
第四个周期为真正地把要写入的数
2440v裸机学 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)