纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 6977|回复: 2

STM32的SPI总是出现模式错误标志SPI_FLAG_MODF置位的问题

[复制链接]
发表于 2012-12-5 19:51:00 | 显示全部楼层 |阅读模式
问题描述:
今天在调试SPI程序,调试的时候程序总是死在while((SPIx->SR&SPI_I2S_FLAG_RXNE)==0);判断语句里,查看SPIx->SR发现值为0x0020,也就是SPI_FLAG_MODF被置位了,我的初始化程序如下:
  1. void SPI_Configuration(SPI_TypeDef* SPIx)
  2. {
  3.         SPI_InitTypeDef SPI_InitStruct;

  4.         SPI_RCC_Configuration(SPIx);

  5.         SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
  6.         SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;
  7.         SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
  8.         SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
  9.         SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
  10.         SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
  11.         SPI_InitStruct.SPI_NSS = SPI_NSS_Hard;
  12.         SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
  13.         SPI_InitStruct.SPI_CRCPolynomial = 7;
  14.         SPI_Init(SPIx, &SPI_InitStruct);
  15.        
  16.         SPI_GPIO_Configuration(SPIx);

  17.         SPI_Cmd(SPIx, ENABLE);
  18. }
复制代码
时钟和引脚都是配置正确的。
解决办法:
将SPI_InitStruct.SPI_NSS = SPI_NSS_Hard改为SPI_InitStruct.SPI_NSS = SPI_NSS_Soft。或者增加SPI_SSOutputCmd(SPIx, ENABLE)语句。
程序如下:
  1. void SPI_Configuration(SPI_TypeDef* SPIx)
  2. {
  3.         SPI_InitTypeDef SPI_InitStruct;

  4.         SPI_RCC_Configuration(SPIx);

  5.         SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
  6.         SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;
  7.         SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
  8.         SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
  9.         SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
  10.         SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
  11.         SPI_InitStruct.SPI_NSS = SPI_NSS_Hard;
  12.         SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
  13.         SPI_InitStruct.SPI_CRCPolynomial = 7;
  14.         SPI_Init(SPIx, &SPI_InitStruct);
  15.        
  16.         SPI_GPIO_Configuration(SPIx);

  17.         SPI_SSOutputCmd(SPIx, ENABLE);
  18.         SPI_Cmd(SPIx, ENABLE);
  19. }
复制代码
回复

使用道具 举报

发表于 2012-12-7 09:03:24 | 显示全部楼层
论坛里的东西都是精华。希望咱们论坛人气更旺盛点
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-7 09:41:46 | 显示全部楼层
dabegen 发表于 2012-12-7 09:03
论坛里的东西都是精华。希望咱们论坛人气更旺盛点

呵呵,其实这些都是平时在写程序的时候遇到的一些问题,然后我整理出来分享给大家,以免大家犯同样的错误。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-22 12:19 , Processed in 0.211216 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表