2440 扩展外部串口驱动问题

liqingwu123456   2009-4-20 17:32 楼主
majingxiong 老兄。你好,得知你也做过2440 的外部串口扩展驱动,现在我遇到了个郁闷问题。
请指教

我的2440 的外部扩展串口只能接受到PC串口调试助手发过来的第一个字节,后来我仔细分析了这个流程,发现一旦发送数据个外部串口,就会立即产生一个中断,我每发一次,就在接收到第一个字节后,就立即产生中断了,导致后面的数据都被忽略掉了。这个现象非常像是没有打开FIFO,但是我仔细发现初始化FIFO是打开的,并且外部串口发送数据是正常的,无论多少个也可以发送完,这就说明发送FIFO已经是打开的,按照手册上说明,这个FIFO是同时被打开了的。那怎么会出现接收FIFO没有打开的现象呢?

我的芯片是16C652和16C654 和16C550/16C2550 几乎都一致。

请问如何得知这个FIFO是否是使用正常呢?我感觉问题就在这里。

希望你指点一下,你的电路是怎么样的吗?
RXRDYA,
RXRDYB
这两个引脚你使用了吗?我是没有使用的。我只是用了INTA/B 然后去读LSR寄存器判断数据是否有效的。
搞了好几天都搞不定,请指点了。

回复评论 (33)

没折了。搞得郁闷死了。加班了也毫无进展。想到的都尝试了。
点赞  2009-4-20 20:29
做过的也帮忙一下哦。
点赞  2009-4-21 08:35

这个FIFO是16字节的,当接收FIFO不到中断触发点时是不会中断的,一半设置为14字节产生中断。
主要看一下你这3个寄存器配置是否正常:FCR IIR IER
点赞  2009-4-21 08:58
引用: 引用 3 楼 papapa123123 的回复:

这个FIFO是16字节的,当接收FIFO不到中断触发点时是不会中断的,一半设置为14字节产生中断。
主要看一下你这3个寄存器配置是否正常:FCR IIR IER


这个我已经设置好了。但是我搞了好几天都一样。现在我打算用优龙的16C2550 代码试试。但是我看了,几乎和我的一样的设置。

你的搞得怎么样了?你使用微软自带的那部分5.0下的代码?
点赞  2009-4-21 09:03
咋们隔壁的研发室也开始使用2440了,不过用2440来做工业设备,不知稳定性如何,借了块过来开始研究研究呵呵
点赞  2009-4-21 09:07
友情帮顶~
点赞  2009-4-21 09:07
我的上周通了。。发送接收正常。
你的肯定还是寄存器的问题。
点赞  2009-4-21 09:08
帮顶一下
点赞  2009-4-21 09:25
引用: 引用 7 楼 papapa123123 的回复:
我的上周通了。。发送接收正常。
你的肯定还是寄存器的问题。


我几乎修改了所有的寄存器设置,并且我和别人的对比,发现没有差异。

你的是4.2下的还是5.0的?

我现在现象是不断从PC发送一串数据过去,每次都只能接收到第一个字节,非常奇怪,好像FIFO不起作用一样。
点赞  2009-4-21 09:33
你把FCR 设置成0xc1试下。
点赞  2009-4-21 09:34
引用: 引用 10 楼 papapa123123 的回复:
你把FCR 设置成0xc1试下。


你是什么芯片?
我的是16C652

我现在把FCR设置成0xf7/0xff 结果都一个样。

如果是0xc1那么就是没有复位FIFO以及没有设置接收FIFO的大小了。

现在的现象无非是FCR的问题。

寄存器设置表
点赞  2009-4-21 09:52
Shaded bits are only accessible when EFR[4] is set

——我的问题可能出现在这里了,我一下子没有留意。

我有可能是非法设置造成这样的。
点赞  2009-4-21 10:11
引用: 引用 3 楼 papapa123123 的回复:

这个FIFO是16字节的,当接收FIFO不到中断触发点时是不会中断的,一半设置为14字节产生中断。
主要看一下你这3个寄存器配置是否正常:FCR IIR IER


当接收FIFO不到中断触发点时是不会中断的,——这样我觉得不合理,万一我就发送一个字节过去,这样岂不是永远接收不到?必须要产生中断才合适。

我按照你的提示来设置,照样是一样的结果。真是被搞疯了。

点赞  2009-4-21 11:04
引用: 引用 14 楼 xumercury 的回复:
还是老问题?收一个还是发一个字节就停了?检查下RX的相关寄存器再看看?


不是停,而是PC不停的发送,2440 不停的接收,但是只能接收到第一个字节,不会停的。
点赞  2009-4-21 11:36
引用: 引用 13 楼 gooogleman 的回复:
引用 3 楼 papapa123123 的回复:

这个FIFO是16字节的,当接收FIFO不到中断触发点时是不会中断的,一半设置为14字节产生中断。
主要看一下你这3个寄存器配置是否正常:FCR IIR IER


,当接收FIFO不到中断触发点时是不会中断的,——这样我觉得不合理,万一我就发送一个字节过去,这样岂不是永远接收不到?必须要产生中断才合适。

我按照你的提示来设置,照样是一样的结果。真是被搞疯了。

这个有超时机制保证,如果连续收不到4个字节则认为超时 产生一次中断。
点赞  2009-4-21 11:51
如果收一个就产生中断 那芯片岂不是一直在中断么?
FCR 最低位 是个 0模式 或1模式选择的。 你要看看在模式0 或模式1下 FIFO怎么操作,根据你的手册。
FCR的最高位 这样子 你把FIFO Reset下,用0x87或0xc7
点赞  2009-4-21 12:01
270使用的16C654,专门对比了一下,没什么特殊的,启用FIFO,配置普通中断即可。
FIFO可以一个字节即触发中断,这个只要配置好应该没问题的。

感觉像是你的中断没处理结束,芯片就不接受下一个字节。

==再细看看。
点赞  2009-4-21 12:11
6.9 DMA operation
The SC16C652 FIFO trigger level provides additional ?exibility to the user for block
mode operation. The user can optionally operate the transmit and receive FIFOs in
the DMA mode (FCR[3]). The DMA mode affects the state of the RXRDY and TXRDY
output pins. Tables 7 and 8 show this.
Table 7: Effect of DMA mode on state of RXRDY pin
Non-DMA mode DMA mode
1 = FIFO empty 0-to-1 transition when FIFO empties
0 = at least 1 byte in FIFO 1-to-0 transition when FIFO reaches trigger level,
or time-out occurs

这个检查下Page12
点赞  2009-4-21 12:30
引用: 引用 17 楼 papapa123123 的回复:
如果收一个就产生中断 那芯片岂不是一直在中断么?
FCR 最低位 是个 0模式 或1模式选择的。 你要看看在模式0 或模式1下 FIFO怎么操作,根据你的手册。
FCR的最高位 这样子 你把FIFO Reset下,用0x87或0xc7


我已经在打开的时候reset了receive FIFO和send FIFO了。没有用的。

6.3 FIFO operation
The 32-byte transmit and receive data FIFOs are enabled by the FIFO Control
Register bit-0 (FCR[0]). With 16C2550 devices, the user can set the receive trigger
level, but not the transmit trigger level. The SC16C652 provides independent trigger
levels for both receiver and transmitter. To remain compatible with SC16C2550, the
transmit interrupt trigger level is set to 16 following a reset. It should be noted that the
user can set the transmit trigger levels by writing to the FCR register, but activation
will not take place until EFR[4] is set to a logic 1.
——这个EFR[4]我没有设置,发送照样没有问题,
The receiver FIFO section includes
a time-out function to ensure data is delivered to the external CPU. An interrupt is
generated whenever the Receive Holding Register (RHR) has not been read
following the loading of a character or the receive trigger level has not been reached
——我的问题就在这里?
点赞  2009-4-21 13:42
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复