#1楼主:PATA接口UDMA中止协议后的多余传输 [精华]
文章发表于:2008-07-05 10:03
dpf_eei 朋友在2008-7-4 18:52:52 问道:
好贴,我现在用FPGA控制硬盘遇到一个问题,希望能指教。在udam方式下datain时,运行不稳定,启动UDMA读后DSTROBE的边沿经常不能到256。手册上也没看得明白,我是用的主机中止模式,是不是主机的HSTROBE无效后还会一个还是两个DSTROBE的有效边沿?谢谢
为了鼓励大家到小组里交流,我把答复写在这里:
你说得对,中止协议发出之后还允许1到2次数据传输。造成这一现象的原因是存在一个握手导致的延迟,这一延迟使得Device不能立刻中止数据传输。
握手延迟在Device端会导致一次多余传输。这是因为Device看到中止操作时,可能来不及停止已经启动的当前传输。
握手延迟在Host端会导致最多两次多余传输。这是因为Host发出中止操作时,一次数据传输可能已经由Device发出了,再加上Device收到中止操作后来不及停止的一次传输,所以最多可能有两次多余传输。
由于你设计的是Host端,建议你把Device返回的握手应答作为DSTROBE是否有效的判据。这样就能解决多余传输的问题。
(修改一下,上面这句话错了,协议里不是用Device返回的握手信号作判据的,而是采用计时的方式,参考tRP时间参数。我太久不看协议,想当然的写了上面的话,哈哈)
#2
文章发表于:2008-07-06 17:12
谢谢riple的回复。您在回复中提到“由于你设计的是Host端,建议你把Device返回的握手应答作为DSTROBE是否有效的判据。”,在HOST端发了STOP信号后,除了DMARQ可用外,没有其它Device返回的握手应答信号了吧?
我现在的程序是这样做的,初始化UDMA datain后,发出HDMARDY-有效信号,然后对对DSTROBE边沿时行计数,(以读一个扇区为例)如果不做特殊处理,计到的边沿一般都没有256个,然后再计时,如果超过一定的时间边沿还没有满256(这个计时时间一般远大于应该的突发读时间),就把HDMARDY-置为无效,准备执行host中止UDMA读,HDMARDY-置为无效后边沿计数通常会是正常的256个。
现在的问题,这种作法感觉还不太稳定,比如改成一次读16 个扇区,则又会出错。不知道我上述作法可正确?
有点冗长,谢谢指教。
#3
文章发表于:2008-07-07 22:05
1. Device端确实是用DMARQ信号作为Host中止协议的握手返回信号的。
2. 采用超时的方法判断传输结束不太好,至少影响了传输速度。
3. 边沿计不到256,这里肯定有问题。我不知道你的边沿计数电路是如何设计的,至少我设计的Device不会让主机等到超时。我设计的是Device端的逻辑,支持Host中止和Device中止。我设计的Device在传输结束前不会启动中止协议,如果没数据了,只会启动暂停协议,只有在数据全部传输完毕后并且Host没有发起中止协议时,才会启动Device中止协议。不知道你用于实验的硬盘支持的最高模式是多少,如果太高,你的计数可能会有问题。
给你提几点调试的建议:
1. 确认你的边沿计数电路是稳定可靠的,跨时钟域处理电路有没有按照规范来做。
2. 降低UDMA传输模式看看,在低一些的模式下是否存在同样的问题。
3. 观察一下数据未传输完毕前有没有Host启动的中止协议,确认你的电路没有异常操作。
4. 观察一下数据未传输完毕前有没有Device启动的中止协议,确认你对这种情况下的Device中止协议处理是正确的。
5. 你的计数器应该以STOP信号作为一个使能条件,确认tRP时间足够长,是按照协议规定设置的。
6. 检查一下Device在传输结束后有没有在错误寄存器中返回CRC错误,我估计你的情况会有数据错误。
7. 能否作“写入-读出-校验”测试,确认你现在的处理方式没有数据错误。
#4
文章发表于:2008-07-09 08:29
感谢RIPLE的详细解答。在ATA-5的协议里,主机中止传UDMA传输有这么一段话(ATA-ATAPI-6.pdf)第411页9.13.4.2 Host terminating an Ultra DMA data-in burst:
d) When operating in Ultra DMA modes 2, 1, or 0 the host shall be prepared to receive zero, one or two
additional data words after negating HDMARDY-. While operating in Ultra DMA modes 5, 4 or 3 the host
shall be prepared to receive zero, one, two or three additional data words after negating HDMARDY-. The
additional data words are a result of cable round trip delay and tRFS timing for the device.
也就是说主机在启动HDMARDY-无效时,后面还会有0,1,2 ,3不等个有效的DDSTROBE边沿.如果真是这样,不等的边沿的话,就真不好处理了。
1. 确认你的边沿计数电路是稳定可靠的,跨时钟域处理电路有没有按照规范来做。
:我是用D触发器加异或门来检测边沿的,使能条件为STOP信号。"跨时钟域处理"我就不太明白了,我的系统只用了一个同步时钟。
2. 降低UDMA传输模式看看,在低一些的模式下是否存在同样的问题。
:同样有这个问题。
3. 观察一下数据未传输完毕前有没有Host启动的中止协议,确认你的电路没有异常操作。
:如果等数据传完才启动中止协议,往往是等不到数据接收完。电路的异常操作就不好判断了。
4. 观察一下数据未传输完毕前有没有Device启动的中止协议,确认你对这种情况下的Device中止协议处理是正确的。
5. 你的计数器应该以STOP信号作为一个使能条件,确认tRP时间足够长,是按照协议规定设置的。
:我用的是UDMA-5,tRP我是按130ns做的,大于85ns
6. 检查一下Device在传输结束后有没有在错误寄存器中返回CRC错误,我估计你的情况会有数据错误。
:数据少了,CRC自然也就错了。最痛苦的是:它是不是第次都错,我持续读若干个后才会出错。
#5
文章发表于:2008-07-09 09:50
PATA协议是很成熟的,虽然有不如人意的地方,但是协议里一定会保证稳定的。
多余的1-3个传输是由于信号的传输延时和PATA总线异步操作的特性造成的。协议里充分考虑了这个问题,所以设置了tRP时间。只要tRP实践足够长,就不会有问题。
从你上面的回答,我想我可能找到了计数不到256的问题:没有做跨时钟域处理。
你可能没有意识到在这个接口电路中存在跨时钟域的问题。DSTROBE与FPGA内部的时钟是异步的:DSTROBE的边沿何时出现,与FPGA内部时钟完全无关,二者的相位关系是随机的。这样一来,边沿计数电路中的D触发器的建立保持时间有可能得不到满足,会有很大的可能性进入亚稳态。一旦进入亚稳态,你的计数结果异常(少计数)就再正常不过了。
正因为你采用了D触发器,所以一定会有跨时钟域问题。不采用D触发器,你的功能又无法实现。所以你一定要考虑一下跨时钟域问题。
在所有的异步接口电路中都存在跨时钟域问题,必须妥善处理,否则一定会出问题。建议你到网上搜索“跨时钟域”“亚稳态”看看。在FPGA讨论小组里也有这样的讨论,其中一篇与CPU接口的,你可以参考一下。
#6
文章发表于:2008-07-09 17:09
感谢您的回复,经过您的提醒,我也觉得是没有做跨时钟域处理造成的,所以现在要考虑如何来处理。既能检测到双面沿,双不会产生亚稳态,按网上介绍的资料处理效果都不太好。我再想想。谢谢。
#7
文章发表于:2008-07-10 09:16
这篇文章里有你要的内容:
跨越鸿沟——异步信号的跨时钟域处理
#8
文章发表于:2008-07-11 21:55
感谢RIPLE,把您的文章仔细读了一遍,然后再对照了一个ATA-6协议,经过跨时钟处理,问题已经得到解决。再次感谢。认识您这么热心的朋友是我的幸运,我机会到武汉来,我请你吃饭,哈哈。
#9
文章发表于:2008-07-12 15:53
别客气,吃饭一定要找你的。问题得到解决是我们这些硬件工程师的最大乐趣。
我感觉做ATA接口的人不多,做到UDMA的更少,能遇到你这样的朋友不容易,这也是我的幸运啊。
大家常联系,多交流!
#10
文章发表于:2008-08-10 10:20
楼主做过ATA DEVICE? 我现在想用FPGA做ATA DEVICE的控制器,楼主有资料可以分享一下吗?
#11
文章发表于:2008-08-22 10:17
楼主好,请问一下硬盘的UDMA通道建立过程是怎样的呢?是不是当检测到往命令寄存器里面写C8或CA,就表示UDMA通道已经建立了呢?