打印
[其他ST产品]

STR71x的BSPI传输结束判断问题

[复制链接]
5578|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jason_sjtu|  楼主 | 2009-3-5 21:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近在用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变高后数据。
   我想请问下,各位,这个问题怎么解决?谢谢
沙发
香水城| | 2009-3-5 22:07 | 只看该作者

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

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

TFE标志指示FIFO是否为空。

使用特权

评论回复
板凳
jason_sjtu|  楼主 | 2009-3-5 22:25 | 只看该作者

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;
 这虽然暂时解决了这个问题,但延时的时间不好控制,多了怕降低效率,少了怕不够,数据还没传输完成,不知除了延时还有其他办法吗?
  请赐教,谢谢

使用特权

评论回复
地板
starm| | 2009-3-6 08:29 | 只看该作者

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

能等待接受完成吗?

检查 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.

使用特权

评论回复
5
香水城| | 2009-3-6 08:53 | 只看该作者

你可以试试使用TUFL标志

这个标志是在移位寄存器为空时,而FIFO又没有数据时产生。

使用特权

评论回复
6
jason_sjtu|  楼主 | 2009-3-6 13:18 | 只看该作者

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,会出现死循环,如何解决请指教?

使用特权

评论回复
7
香水城| | 2009-3-6 13:42 | 只看该作者

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

如果你不调用BSPI_WordSend,停止向发送寄存器写数据,TUFL标志不变化吗?

使用特权

评论回复
8
jason_sjtu|  楼主 | 2009-3-6 15:54 | 只看该作者

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?
等待,无限等待,就成死循环了

使用特权

评论回复
9
jason_sjtu|  楼主 | 2009-3-6 17:57 | 只看该作者

请教各位达人

  请教各位达人,还有其他办法吗?

使用特权

评论回复
10
香水城| | 2009-3-6 18:06 | 只看该作者

请不要使用断点调试

至少不能在SPIWRITE()函数中放置断点,看看是否能够跳出这个函数。

使用特权

评论回复
11
jason_sjtu|  楼主 | 2009-3-6 19:12 | 只看该作者

RE:请不要使用断点调试

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

使用特权

评论回复
12
jason_sjtu|  楼主 | 2009-3-6 20:36 | 只看该作者

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

   我想这会不会是这款芯片的一个BUG呢,想请ST技术支持来解答

使用特权

评论回复
13
香水城| | 2009-3-6 21:06 | 只看该作者

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

请问你是否使能了FIFO?

使用特权

评论回复
14
jason_sjtu|  楼主 | 2009-3-7 10:35 | 只看该作者

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设置有问题吗?

使用特权

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

本版积分规则

10

主题

20

帖子

1

粉丝