5263|7

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STR912的DMA机制存在Bug? [复制链接]

    
经过反复试验发现,好像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的专家或高手帮忙核实一下!
 
此帖出自stm32/stm8论坛

最新回复

                                 测试楼主的程序,发现郁闷的问题: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位写数总无效。   详情 回复 发表于 2007-4-6 16:40
点赞 关注
 

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

遇到了同样的问题

                                  
此帖出自stm32/stm8论坛
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

类似的问题

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

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 

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

                                 另一个问题是,在你尝试清空接受FIFO时,为什么不用状态寄存器判断FIFO是否为空?
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 

解释一下我的试验

试验思路如下:

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

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


谢谢 斑竹的关注!
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 

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

怀疑你的初始化有问题。

如果真像你所说的Bug,这个SSP根本没法用,那为什么早没有人报告?
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 

:)

                                 斑竹说得对。
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 

往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位写数总无效。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表