打印

STM32 SPI问题

[复制链接]
3824|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;
}

使用特权

评论回复
5
云仔| | 2012-12-22 09:39 | 只看该作者
前辈你好,我现在初学STM32F407这款开发板,现在想找SPI的库函数:就是包含SPI_Int(  ),SPI_Cmd(    )等这些函数的详细定义,可否麻烦发我一份。邮箱:774379112@qq.com

使用特权

评论回复
6
杨爱林林| | 2012-12-22 09:41 | 只看该作者
其实一直不是很清楚
对于spi发送来说
为什么最后一句 需要加一句
return DR = Data;
这样的
测试过了。。

使用特权

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

本版积分规则

7

主题

99

帖子

0

粉丝