STM32 SPI问题

[复制链接]
4856|5
 楼主| ploto 发表于 2008-6-10 16:14 | 显示全部楼层 |阅读模式
我在使用SPI时,总是出现OVR标志。有谁碰到过这种情况吧,下面是部分代码:
//------------------SPI 初始化部分----------------
 /* 1st phase: SPI1 Master and SPI2 Slave */
  /* SPI1 Config -------------------------------------------------------------*/
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
 SPI_Init(SPI1, &SPI_InitStructure);
  /* Enable SPI1 */
  SPI_Cmd(SPI1, ENABLE);



//实际工作部分,我直接连接了SPI1的MISO和MOSI引脚,实现SPI1的自环测试

 
  GPIO_ResetBits(GPIOB,GPIO_Pin_15);  //对外的cs选择,暂时无效了

     /* Wait for SPI1 Tx buffer empty           */
    while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE)==RESET);
    //发送数据
    SPI_SendData(SPI1,0x81);
    //接收并丢弃收到的数据
    if(SPI_GetFlagStatus(SPI1,SPI_FLAG_RXNE) == SET)
        SPI_ReceiveData(SPI1);

    while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE)==RESET);
    SPI_SendData(SPI1,0x00);                   //一旦发送完毕,就出现SPI_FLAG_OVR标志,
    if(SPI_GetFlagStatus(SPI1,SPI_FLAG_RXNE) == SET)
        SPI_ReceiveData(SPI1);
    while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE)==RESET);
    SPI_SendData(SPI1,0x3C);
GPIO_SetBits(GPIOB,GPIO_Pin_15);
 楼主| ploto 发表于 2008-6-10 17:07 | 显示全部楼层

部分解决

参考例程,
  if(SPI_GetFlagStatus(SPI1,SPI_FLAG_RXNE) == SET)
应该改成
  while(SPI_GetFlagStatus(SPI1,SPI_FLAG_RXNE) == SET);
问题部分解决。
 楼主| ploto 发表于 2008-6-12 14:40 | 显示全部楼层

还有问题

每次SPI发送完一个字节后,总是需要读一下,否则会产生OVR错误,等到真正想读取的时候,读取的数据是错的。
 楼主| ploto 发表于 2008-6-12 14:56 | 显示全部楼层

对于双向SPI

修改了驱动库中的SPI_SendData函数,问题解决(对于双向SPI)。

void SPI_SendData(SPI_TypeDef* SPIx, INT16U Data)
{
 /* Write in the DR register the data to be sent */
   while(SPI_GetFlagStatus(SPIx,SPI_FLAG_TXE) == RESET);
   (void)SPIx->DR;
   SPIx->DR = Data;
   while(SPI_GetFlagStatus(SPIx,SPI_FLAG_RXNE) == RESET);
   (void)SPIx->DR;
}
云仔 发表于 2012-12-22 09:39 | 显示全部楼层
前辈你好,我现在初学STM32F407这款开发板,现在想找SPI的库函数:就是包含SPI_Int(  ),SPI_Cmd(    )等这些函数的详细定义,可否麻烦发我一份。邮箱:774379112@qq.com
杨爱林林 发表于 2012-12-22 09:41 | 显示全部楼层
其实一直不是很清楚
对于spi发送来说
为什么最后一句 需要加一句
return DR = Data;
这样的
测试过了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

99

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部