您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF504F技术咨询
本帖共有830个阅读者
发表帖子 发表投票 回复主题
BF504F技术咨询
tzg74500(论坛游民)
tzg74500
头衔:社区公民
帮派:无帮无派
帖数:87
金钱:806
积分:110
注册时间:2011/7/31
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF504F技术咨询

问大家,我的bf504f串口0,电脑对他发送6个字节,为什么它只能接收5个字节???。另外,这个串口那个寄存器可以配置接收中断发生的字节数?

如题



「该帖子被 OpenADSP 在 2011-08-29 11:05:20 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2011/8/26 7:58:07
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

你的标题名称太长了,其他人无法回复,我把标题名称改了一下。

50x我还没用过,回答不了,期待其他有用过50x的兄弟能不能知道。


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2011/8/29 11:06:28
ppsca(论坛新手)
ppsca
头衔:社区公民
帮派:无帮无派
帖数:43
金钱:305
积分:41
注册时间:2011/6/8
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

收到的5个字节是丢了第几个字节?第一个吗?

串口只要有数据就会产生中断,他的FIFO非常小,没有办法存太多字节,所以一旦来数据,必须马上读取,如果不读当其他数据来时,会造成后来数据无法进入FIFO,在串口发送数据前,每次都要判断状态寄存器的传输BUFFER是否为空,为空再发送。


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2011/8/31 9:36:04
tzg74500(论坛游民)
tzg74500
头衔:社区公民
帮派:无帮无派
帖数:87
金钱:806
积分:110
注册时间:2011/7/31
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
问题是这样的,没有使用dma.当电脑对uart0发送5个字节后,uart0没产生接收中断,当再发送1个字节后,uart0产生了中断,这时读接收fifo.结果只能读出来5个字节,第6个字节读不出来。。这个问题烦了有半个月了,一直没搞定。。郁闷ing

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2011/9/2 13:41:40
毛毛(论坛新手)
毛毛
头衔:社区公民
帮派:无帮无派
帖数:5
金钱:125
积分:5
注册时间:2011/9/6
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你试着换一种接收方式,采用核中断方式接收,每来一个字节接受一个,然后放到一个buffer里面,需要的时候再从这个buffer里面去读,以前我在BF548一个项目上也是这么做的
EX_INTERRUPT_HANDLER(UART1_RX_ISR)
{
while(*pUART1_LSR&0x1)
{
unsigned char tmp = *pUART1_RBR;
fifoctl(&g_rs232_priv, &tmp, WR);
}
}
int fifoctl(rs232_fifo * priv, unsigned char *data , const unsigned char flag)
{
    if (flag == WR) {
priv->w_idx = (priv->w_idx + 1) % BUFSIZE;
        /* Save it to buffer */
        if (priv->w_idx == priv->r_idx){
            /* Adjust read index since buffer is full */
            /* Keep the latest one and drop the oldest one */
            priv->r_idx = (priv->r_idx + 1) % BUFSIZE;
//   printf("debug : write buffer, is full...\n");
        }
        
priv->buffer[priv->w_idx] = *data;
}
else{
        if ((priv->r_idx == priv->w_idx))
// printf("debug : read buffer, is empty...\n");
return 0;
        else{
priv->r_idx = (priv->r_idx + 1) % BUFSIZE;
            *data= priv->buffer[priv->r_idx];
}
}
return priv->w_idx-priv->r_idx + 1;
}

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2011/9/6 10:01:05
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

这个问题解决了吗?


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2011/9/7 14:46:52
tzg74500(论坛游民)
tzg74500
头衔:社区公民
帮派:无帮无派
帖数:87
金钱:806
积分:110
注册时间:2011/7/31
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
4楼的朋友,我现在的主要问题是进中断不是一个字节,而是6个字节才中断一次。给我你的串口初始化参考下好吗?

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2011/9/21 15:47:46
tzg74500(论坛游民)
tzg74500
头衔:社区公民
帮派:无帮无派
帖数:87
金钱:806
积分:110
注册时间:2011/7/31
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
问题查清楚了,bf504f这个片子uart0有严重缺陷,手册上的寄存器uart0_msr.在504f里面实际是没有的,所以只能设置为2个字节。用506f的朋友,看看有没有这个问题。。。。。。。

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2011/9/21 18:56:15
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
8信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

难道是芯片bug?你用的504F版本是多少?有X或者E的尾椎吗?


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2011/9/22 13:45:34
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154586 Call, 1 Queries, Processed in 0.031250 second(s),