[ZLG-ARM] 请教周工及各位大侠关于SMART2200读写CF卡问题

[复制链接]
3184|15
 楼主| xkleee 发表于 2008-8-15 17:17 | 显示全部楼层 |阅读模式
请教周工及各位大侠关于SMART2200读写CF卡问题<br />用周工提供的ZLG_CF驱动接口函数实验源程序,当查找ATA设备时写设备磁头寄存器不成功,查收了一下论坛的帖子将SetDeviceHead(0xfa);改成SetDeviceHead(0xea);还是出错。请周工及各位大侠指点,谢谢!
armecos 发表于 2008-8-15 19:24 | 显示全部楼层

检查初始化,跳线,引脚配置等,

你可以用www.armecos.com上的CF卡测试程序检验硬件是否正确。
 楼主| xkleee 发表于 2008-8-15 19:32 | 显示全部楼层

re

谢谢杨大侠的指点,希望周立功公司能给点意见
zLgArM 发表于 2008-8-18 11:26 | 显示全部楼层

re

您好!<br />函数SetDeviceHead(C_D_H)的参数C_D_H只能是设备磁头寄存器,以下是IDE.H中定义的设备磁头寄存器。<br /><br />/*设备磁头寄存器*/<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ATA_DevReg_DEV0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*设备为主盘&nbsp;&nbsp;&nbsp;&nbsp;*/<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ATA_DevReg_DEV1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*设备为从盘&nbsp;&nbsp;&nbsp;&nbsp;*/<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ATA_DevReg_b5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*保留位,为1&nbsp;&nbsp;&nbsp;&nbsp;*/<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ATA_DevReg_LBA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*模式选择位&nbsp;&nbsp;&nbsp;&nbsp;*/<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ATA_DevReg_b7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*保留位,为1&nbsp;&nbsp;&nbsp;&nbsp;*/<br />
 楼主| xkleee 发表于 2008-9-6 18:01 | 显示全部楼层

re

谢谢楼上的回复,现在终于调通了,可以正常读写CF卡了,程序放在片外SRAM中运行,总线速度配置成最快,主频和外设频率都是60M的情况下,读一个扇区时间为10。24MS,速度竟然如此之慢,难道是周立功的CF卡驱动问题?不知道周工或哪位朋友有没有做过这方面的测试?
 楼主| xkleee 发表于 2008-9-12 21:44 | 显示全部楼层

RE

把周工的程序仔细看了一下,进行了修改,目前用JTAG在片外SRAM中调试,读一个扇区速度可以达到842KBIT/S,速度还是很慢,周工的代码有几处我不大理解,还请指点。<br />/*********************************************************************************************************<br />**&nbsp;函数名称:&nbsp;SYS_PortIn<br />**&nbsp;功能描述:&nbsp;从ATA设备指定的寄存器中读出一个字的数据,有些寄存器只有一个字节数有效。<br />**&nbsp;输 &nbsp;&nbsp;入:&nbsp;reg&nbsp;寄存器名称<br />**&nbsp;输 &nbsp;&nbsp;出:&nbsp;读出的数据<br />**&nbsp;全局变量:<br />**&nbsp;调用模块:&nbsp;<br />********************************************************************************************************/<br />uint16&nbsp;SYS_PortIn(uint32&nbsp;reg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;res&nbsp;;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*(uint16*&nbsp;)(ATA_EN|ATA_ALE|reg)&nbsp;=&nbsp;0;&nbsp;//为何此处要写0?<br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;=&nbsp;*(uint16*&nbsp;)(ATA_EN|ATA_RW)&nbsp;;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意,这时不能对该BLANK进行操作<br />&nbsp;&nbsp;&nbsp;&nbsp;*(uint16*&nbsp;)(ATA_EN|ATA_ALE|ATA_OUT|ATA_CS1|ATA_CS0)&nbsp;=&nbsp;0;//为何此处要写0?<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;res;<br />}<br /><br /><br />/*********************************************************************************************************<br />**&nbsp;函数名称:&nbsp;SYS_PortOut<br />**&nbsp;功能描述:&nbsp;向ATA设备指定的寄存器中写入一个字的数据,有些寄存器只有一个字节数有效。<br />**&nbsp;输 &nbsp;&nbsp;入:&nbsp;reg&nbsp;寄存器名称<br />**&nbsp;输 &nbsp;&nbsp;出:&nbsp;无<br />**&nbsp;全局变量:<br />**&nbsp;调用模块:&nbsp;<br />********************************************************************************************************/<br />void&nbsp;SYS_PortOut(uint32&nbsp;reg,&nbsp;uint16&nbsp;data)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*(uint16*&nbsp;)(ATA_EN|ATA_ALE|ATA_OUT|reg)&nbsp;=0;//为何此处要写0?<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*(uint16*&nbsp;)(ATA_EN|ATA_RW)&nbsp;=&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(uint16*&nbsp;)(ATA_EN|ATA_ALE|ATA_OUT|ATA_CS1|ATA_CS0)&nbsp;=&nbsp;0;//为何此处要写0?<br /><br /><br />}<br />
 楼主| xkleee 发表于 2008-9-13 09:12 | 显示全部楼层

TO

周工,发了邮件都快两个星期了一直没有回复,论坛上的贴子也没有回复,你们的技术支持近来是不是特别的忙啊
xdream 发表于 2008-9-13 18:11 | 显示全部楼层

把程序放在内部Flash或者内部RAM中运行,速度会快一些

  
 楼主| xkleee 发表于 2008-9-14 11:20 | 显示全部楼层

re

但快不了多少,我需要读写CF的速度很快才行,是做视频方面的
armecos 发表于 2008-9-15 18:44 | 显示全部楼层

高速的话需要高的I/O和CPU频率,

最好好要有DMA+中断,上层的文件系统需要设计好CACHE提高命中率,要有大的缓存。<br /><br />你的I/O操作还可以再优化,毕竟这个操作经常使用,能有限提高读写速度。<br /><br /><b>更多内容,详见:</b><br /><b>《培训系列“丛书”》</b><br /><b>www.armecos.com</b><br />-----------------------------------<br /><b>More&nbsp;details,&nbsp;see:</b><br /><b>《&quot;Series&nbsp;Books&quot;&nbsp;of&nbsp;Training》</b><br /><b>www.armecos.com</b>
zlgmcu 发表于 2008-9-16 16:46 | 显示全部楼层

RE:6楼:

uint16&nbsp;SYS_PortIn(uint32&nbsp;reg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;res&nbsp;;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*(uint16*&nbsp;)(ATA_EN|ATA_ALE|reg)&nbsp;=&nbsp;0;&nbsp;//为何此处要写0?<br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;=&nbsp;*(uint16*&nbsp;)(ATA_EN|ATA_RW)&nbsp;;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意,这时不能对该BLANK进行操作<br />&nbsp;&nbsp;&nbsp;&nbsp;*(uint16*&nbsp;)(ATA_EN|ATA_ALE|ATA_OUT|ATA_CS1|ATA_CS0)&nbsp;=&nbsp;0;//为何此处要写0?<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;res;<br />}<br /><br />以上是为了锁存地址,只需要对地址操作一下就可以了,读写都可以什么内容都没关系。<br />程序在内存FLASH或内部RAM运行会快很多,还有就是每次读一扇区要比每次读100个扇区速度要慢很多。。
 楼主| xkleee 发表于 2008-9-18 14:07 | 显示全部楼层

re

谢谢ZLGMCU的回复<br />
 楼主| xkleee 发表于 2008-10-7 08:10 | 显示全部楼层

re

周工,我已经将CF卡的读写程序进行了优化,程序在内部FLASH中运行时,读CF卡速度最快是1。2MB/S,好像已经无法再快了,CPU的主频,总线速度均已配置到最快。难道是电路中的一系列74IC对读卡速度影响这么大?
 楼主| xkleee 发表于 2008-10-7 08:22 | 显示全部楼层

RE

我用STC单片机的IO口模拟ATA总线,速度最快也能达到1MB/S,而用LPC2214速度才1。2MB/S,实在不些不解请各位支招
zlg_lly 发表于 2008-10-9 10:42 | 显示全部楼层

RE:xkleee

您好!<br />可以尝试通过以下方法要提高GPIO速度<br />1、使用LPC2214的快速GPIO功能;<br />2、提高LPC2214的系统时钟频率(LPC2214最高60MHz);<br />3、优化程序。
 楼主| xkleee 发表于 2008-10-10 11:07 | 显示全部楼层

谢谢

我已将部分代码用汇编来写,速度快了不少,基本达到了要求
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

62

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部