4802|13

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STR71x的BSPI传输结束判断问题 [复制链接]

    最近在用STR712与CC2420做Zibee的开发,利用BSPI通讯,出现一点问题,想请教一下各位。
     我之前用的飞利浦的SPI都有传输结束判断的标志位可读,传输结束后标志位置位,但我用STR712的BSPI函数BSPI_WordSend
      void BSPI_WordSend(BSPI_TypeDef *BSPIx, u16 Data)
{
  if ((BSPIx->CSR1 & 0x0400) == 0) Data <<= 8;
  BSPIx->TXR = Data;
}
似乎没有发现它判断传输结束与否,而我要频繁使用SPI与CC2420通讯,所以就出现了问题,有时我前一个SPI还没有传输完成,后一个SPI数据又传过来了。
  或者是前一个SPI还没有传输完成,CS_n已经变高了,CC2420不能接收到CS_n变高后数据。
   我想请问下,各位,这个问题怎么解决?谢谢
此帖出自stm32/stm8论坛

最新回复

                                    FIFO的深度设置为1个字  void SPIinit(void){     GPIO_Config(GPIO0, 0x0007, GPIO_AF_PP);        BSPI_BSPI0Conf(ENABLE);    BSPI_Init(BSPI0);                        BSPI_ClockDividerConfig(BSPI0, 0x06);            BSPI_Enable(BSPI0, ENABLE);                BSPI_MasterEnable(BSPI0, ENABLE);    BSPI_ClkActiveHigh(BSPI0, DISABLE);    BSPI_ClkFEdge(BSPI0, DISABLE);     BSPI_8bLEn(BSPI0, ENABLE);                    BSPI_TrFifoDepth(BSPI0, 1);                }请问BSPI设置有问题吗?   详情 回复 发表于 2009-3-7 10:35
点赞 关注
 

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

STR7的BSPI不需要判断发送是否结束,只需判断FIFO是否变空

只要FIFO有空余位置,就可以向TXR写数据。

TFE标志指示FIFO是否为空。
此帖出自stm32/stm8论坛
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

RE:STR7的BSPI不需要判断发送是否结束,只需判断FIFO是否变空

    我用过这个TFE标志没成功,问题在这(请看我程序)
  CSn_0;
 BSPI_WordSend(BSPI0, Data1);
  CSn_1;
如上程序,BSPI_WordSend(BSPI0, Data1)执行完后, CSn_1即片选信号变高,
处于从模式的芯片(如我用的CC2420),就会停止接收ARM发给他的数据,造成数据错误。我也是后来用示波器双通道检测时才发现的,后来只能认为加入延时如:
  CSn_0;
 BSPI_WordSend(BSPI0, Data1);
  delay(100);
  CSn_1;
 这虽然暂时解决了这个问题,但延时的时间不好控制,多了怕降低效率,少了怕不够,数据还没传输完成,不知除了延时还有其他办法吗?
  请赐教,谢谢
此帖出自stm32/stm8论坛
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 

不知除了延时还有其他办法吗?

能等待接受完成吗?

检查 CSR2.b3 RFNE == 1 ?

或者检查 TX FIFO 已经没有数据 ?

检查 CSR2.b9 TFNE == 0 ?

Bit 3 = RFNE: Receive FIFO Not Empty.

This status bit indicates that there is data in the Receive FIFO. It is set whenever there is at
least one block of data in the FIFO i.e. for 8-bit mode 8 bits and for 16-bit mode 16 bits. If the
RIE[1:0] bits are configured to ‘01’ then whenever this bit gets set an interrupt will be asserted
to the processor. This bit is cleared when all valid data has been read out of the FIFO.



Bit 9 = TFNE: Transmit FIFO Not Empty.

This bit is set whenever the FIFO contains at least one data word.
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 

你可以试试使用TUFL标志

                                 这个标志是在移位寄存器为空时,而FIFO又没有数据时产生。
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 

RE:不知除了延时还有其他办法吗?

在BSPI_WordSend中加了一句
inline void BSPI_WordSend(BSPI_TypeDef *BSPIx, u16 Data)
{
  if ((BSPIx->CSR1 & 0x0400) == 0) Data <<= 8;
  BSPIx->TXR = Data;
  while(0!=(BSPI0->CSR2&0x0200)); //等待TFNE==0?
}
然后再调用
 CSn_0;
BSPI_WordSend(BSPI0, Data1);
  CSn_1;
还是不行,不加延时,BSPI写到从模块寄存器进去的数值还是不对?
  另五楼的用TUFL标志也不行,会造成死循环,因为TUFL标志始终为0,等不到为1,会出现死循环,如何解决请指教?
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 

不理解为什么TUFL标志始终为0,等不到为1

                                 如果你不调用BSPI_WordSend,停止向发送寄存器写数据,TUFL标志不变化吗?
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 

RE:不理解为什么TUFL标志始终为0,等不到为1

TUFL为CSR2第7位,改动如下:
inline void SPIWRITE(u8 Data)
{
  BSPI0->TXR =(BSPI0->TXR&0x00FF) |((u16)Data<<8);
  while(0==(BSPI0->CSR2&0x0080));//等待TUFL==1?
}
然后用断点调试就出现死循环,即程序总呆在
while(0==(BSPI0->CSR2&0x0080));//等待TUFL==1?
等待,无限等待,就成死循环了
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 

请教各位达人

                                   请教各位达人,还有其他办法吗?
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

10
 

请不要使用断点调试

                                 至少不能在SPIWRITE()函数中放置断点,看看是否能够跳出这个函数。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

11
 

RE:请不要使用断点调试

                                   刚开始没有使用断点调试,而是在程序的最后面点亮灯,但情况是总也点不亮,后用断点调试,发现停在SPI写函数里面了,出不来
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

12
 

疑问:这会不会是这款芯片的一个BUG呢

                                    我想这会不会是这款芯片的一个BUG呢,想请ST技术支持来解答
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 

如果碰到问题就怀疑是芯片的Bug,我们就没有必要在此讨论

                                 请问你是否使能了FIFO?
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

14
 

RE:请问你是否使能了FIFO?

   FIFO的深度设置为1个字
  void SPIinit(void)

    GPIO_Config(GPIO0, 0x0007, GPIO_AF_PP);    
    BSPI_BSPI0Conf(ENABLE);
    BSPI_Init(BSPI0);                    
    BSPI_ClockDividerConfig(BSPI0, 0x06);        
    BSPI_Enable(BSPI0, ENABLE);            
    BSPI_MasterEnable(BSPI0, ENABLE);
    BSPI_ClkActiveHigh(BSPI0, DISABLE);
    BSPI_ClkFEdge(BSPI0, DISABLE); 
    BSPI_8bLEn(BSPI0, ENABLE);                
    BSPI_TrFifoDepth(BSPI0, 1);                
}
请问BSPI设置有问题吗?
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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