关于蓝牙设备利用串口传输被中断的问题

来源:互联网 发布:阿里云企业邮箱 免费 编辑:程序博客网 时间:2024/04/28 17:02

这个问题感觉是被fix了,困扰了一段时间。

首先说说之前存在的问题, 蓝牙在传输文件的时候,无论大小文件,当点击触摸屏,或者有USB detect中断,Wi-Fi寻找AP使能其内部中断,都会出现蓝牙传输被中断(终止传输)的现象。两个同样的设备进行传输时只有接受方才会受到这种影响,而发送方不会!接受方接受失败之后,蓝牙就不再占用串口。利用函数就可以打开给蓝牙用的串口。出现Bluetooth hardware error 10050 (controller not present)。

 

蓝牙传输硬件用的是CSR BC4 H4的,协议栈是Microsoft Windows CE提供的,传输的时候会利用BSP提供的Serial驱动。平台是SMDK2450的。

看了Samsung的串口驱动,有一段代码没有完全理解:

 

    m_pDTRPort = (volatile ULONG *)&(m_pIOPregs->GPCDAT);

            m_pDSRPort = (volatile ULONG *)&(m_pIOPregs->GPCDAT);

            m_dwDTRPortNum = 6;

            m_dwDSRPortNum = 5;

 

并且它的串口1上也设置了DTR流控。我觉得他上面的代码写的有问题。但是又不清楚该怎么做,如果有路过的高人,希望能指点一下。

对于这个问题我有三种想法:

1.有可能中断处理机制出了问题,当点击触摸屏等中断时,将UART的中断给屏蔽了。(还真的发现SUB Mask寄存器的值被改,但是后来觉得是串口传输出错之后,自己将自己干掉的!)也怀疑给蓝牙用的串口有缺陷,然后就把蓝牙飞线到不同的串口上,然后又调Debug口,这样才能看到信息。

 

2.RX FiFo不够大,FiFo有64B,这个没有办法改了,所以我设置了不同的RX触发值,但是发现也没有什么起色。

 

3.中断优先级的问题,然后就设置中断控制器的优先级,将串口的优先级设置成最高,但是发现这样设置似乎没有起作用。

 

整天看datasheet和驱动代码,但是发现驱动代码也没有问题,因为三星的驱动也是链接的Microsoft的SERPDDCM和COM_MDD2,并且BSP下的驱动也就是现实SERPDDCM所需要提供的函数。未果。。。郁闷了几天。之所以郁闷主要是因为我连打印信息也不能打,如果放开打印信息的话,蓝牙就不能正常工作,也就是说其他的串口也会影响给蓝牙用的串口。

 

一边想问题,一边利用强大的搜索引擎,发现一篇外文的文章,和我的想法基本一致,但是这样还是没有用,解决不了问题。http://zone.ni.com/devzone/cda/tut/p/id/4052

 

然后就想办法放开一些打印信息也不至于蓝牙不能工作,后来发现RX出现Overrun Error,所以就否定了之前其他中断mask掉串口中断的想法。出现这种问题,其实应该是CPU没有及时的处理,将FiFo的数据取走,当有更高优先级的中断到来时,RX的FiFo已经满了。然后串口就自己disable掉自己的中断。对于现在的发现,之前也尝试过调整中断优先级,但是没有取得进展,所以也是一筹莫展,但是无意中,我想调整一下串口的线程优先级是否能解决这个问题呢?由于USB detect中断对UART也有影响,所以根据USB的线程优先级设置了UART的优先级,结果发现问题似乎被我解决了。先暗暗的高兴一把。不过还需要进一步测试!

 

这应该属于系统调度的问题,之前一直在设置底层寄存器方面下功夫。

现在仅仅是解决了这个问题,但是对蓝牙的理解还很肤浅,这部分东西有时间一定研究研究。

 

希望路过的高人不吝指教。啰哩叭唆了这么多。。。

原创粉丝点击