打印

STR912的DMA机制存在Bug?

[复制链接]
3478|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
seawwh|  楼主 | 2007-1-31 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DMA, ST, BUG, LED, AN
    
经过反复试验发现,好像STR912的DMA机制存在Bug;

1. 下面的程序段居然可以通过, LED3亮

  SSP0->DR=0;           //1 向SSP0端口发送一个数据
  Delay_us(100);        //2 等待发送完成
  for (i=0; i<8; i++)   //3 读空SSP0 的FIFO中的数据,FIFO的深度为8
      T0= SSP0->DR;     
   
  StartDMA_Rx(RxBu,1);  //4 启动读出SSP0的DMA
  DMA_Rx_WaitEnd;       //5 等待DMA的完成
  LED_ON(LED3);         //6

  如果去掉第1条语句,程序将会永远等待在语句5;
  看来一次对SSP0->DR的写动作会导致,dma 控制器永久的记住有1个数据需要被读出;
尽管该Rx FIFO 数据确实已经被读空了.

2.接下来的实验,增加对SSP0->DR的写动作,看看是否会导致增加新的数据?
  结果: 不会导致增加新的数据,永远只是多出1个数据;
  
3. 拜读了ST的文件<<STR91xF Errata sheet>>,是乎并不是这种现象的解释, 
 我是用的芯片标志是 KOR HP 631 应该是D 版.

  2.4 BSPI transmit DMA request
     Description of limitation in Rev B
     The DMA Requests signals are active at power-up and cleared only when the SPI block is
     enabled. This can cause spurious DMA requests if the BSPI DMA channels are configured
     before enabling the BSPI block.
     Fixed in Rev D. The DMA Transmit Requests from BSPI are cleared (de-activated) at reset.

4. 处理办法: 在直接访问 SSP0端口的时候,关闭 SSP0 的DMA Rx使能; 仅当需要进行DMA数据接收的时候才使能SSP0 的DMA Rx. 问题可以避免。下面的代码会在语句5永远等待。

  SSP_DMACmd(SSP0,SSP_DMA_Receive ,DISABLE);   
  SSP0->DR=0;           //1 向SSP0端口发送一个数据
  Delay_us(100);        //2 等待发送完成
  for (i=0; i<8; i++)   //3 读空SSP0 的FIFO中的数据,FIFO的深度为8
      T0= SSP0->DR;     
  SSP_DMACmd(SSP0,SSP_DMA_Receive,ENABLE);   
   
  StartDMA_Rx(RxBu,1);  //4 启动读出SSP0的DMA
  DMA_Rx_WaitEnd;       //5 等待DMA的完成
  LED_ON(LED3);         //6


   请熟悉ST ARM的专家或高手帮忙核实一下!
 
沙发
csuzsq| | 2007-2-1 11:13 | 只看该作者

遇到了同样的问题

使用特权

评论回复
板凳
csuzsq| | 2007-2-1 11:23 | 只看该作者

类似的问题

不过的觉得问题出在SSP, 让SSP1向SSP2发送数据, SSP2第一次接收到的数据总是0, 而接下来接收到的数据总是SSP1前一次发送的数据。

使用特权

评论回复
地板
香水城| | 2007-2-7 21:38 | 只看该作者

楼主是否用示波器看过引脚上的波形?

另一个问题是,在你尝试清空接受FIFO时,为什么不用状态寄存器判断FIFO是否为空?

使用特权

评论回复
5
seawwh|  楼主 | 2007-2-7 23:50 | 只看该作者

解释一下我的试验

试验思路如下:

1. 写一个数据到 SSP0;
2. 等待足够长的时间等待数据发送完成(100us),实际3us 就发送完成了;事实上我延时等待过数秒。
3. 将SSP0 Rx FIFO的数据读空,实际上FIFO中只有一个数据;我循环读了8次,即使数据是满的也会读空的。我也用循环100次读出过。
4. 启动DMA for SSP0 Rx 接收1个数据,发现居然收到1个数据。

  显然,用什么方法判断FIFO为空,并不能解释这个现象。


谢谢 斑竹的关注!

使用特权

评论回复
6
香水城| | 2007-2-8 10:56 | 只看该作者

请楼主把你的整个项目文件发上来,我们帮你看一下

怀疑你的初始化有问题。

如果真像你所说的Bug,这个SSP根本没法用,那为什么早没有人报告?

使用特权

评论回复
7
gyt| | 2007-2-8 12:25 | 只看该作者

:)

斑竹说得对。

使用特权

评论回复
8
zljun| | 2007-4-6 16:40 | 只看该作者

往DMA_Tx->CC的低12位写数无效

测试楼主的程序,发现郁闷的问题:

DMA_Rx_DISABLE; 
DMA_Rx_ClrEnd; 
DMA_Rx_ClrErr; 

DMA_Rx->DES=(u32)Bu; 
DMA_Rx->CC = DMA_SrcWidth_HalfWord | DMA_ChannelDESInc | 0x80000000 | 
DMA_DesWidth_HalfWord | (Count & 0x0FFF); 
UART_SendData(UART2, DMA_Tx->CC);
DMA_Rx_ENABLE;

无论Count为什么,从串口出得到的数总是0。
感觉往DMA_Tx->CC的低12位写数总无效。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

368

帖子

0

粉丝