OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7062|回复: 6

STM32F205 SPI从机 SPI_I2S_GetFlagStatus(SPIx1, SPI_I2S_FLAG_RXNE) == RESET始终不正确

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-10-15
在线时间
0 小时
发表于 2015-10-15 16:51:59 | 显示全部楼层 |阅读模式
5金钱
求大牛帮助啊,停滞3天了SPI_I2S_GetFlagStatus(SPIx1, SPI_I2S_FLAG_RXNE)一直为零,找不出原因。

从机端初始化如下
static void SPI_Config_slave(void)
{
SPI_InitTypeDef  SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

  /* Enable GPIO clocks */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOA, ENABLE);
 
/* Configure SPI1 pins: NSS, SCK, MISO and MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_Init(GPIOB, &GPIO_InitStructure);
/*SPI1 NSS*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI2?è?????????????¤
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;                   //?è??SPI1????????
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI·???????8?????á??
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;               //?®???±????????×÷?±???±??????????
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;               //???????±???????????ù????
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;               //NSS???????????¨????SSI???©???í
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //?¨???¨?????¤·???????:?¨?????¤·???????8
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;   //??????????MSB??????
SPI_InitStructure.SPI_CRCPolynomial = 7;   //CRC?????????à????
SPI_Init(SPI1, &SPI_InitStructure);
/* Enable SPI1  */
SPI_Cmd(SPI1, ENABLE);
SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);
}
接收代码如下
u8 SPI_ReadByte(SPI_TypeDef* SPIx1)
{
u8 retry=0;

  while (SPI_I2S_GetFlagStatus(SPIx1, SPI_I2S_FLAG_RXNE) == RESET)//?ì?é???¨??SPI±ê?????è????·?:????????·???±ê????
{
retry++;
if(retry>200)return 1;
}  

return SPI_I2S_ReceiveData(SPIx1); //·????¨??SPIx×??ü??????????    
}

调用SPI_ReadByte()函数时一只返回1,说明陷入循环,SPI_I2S_GetFlagStatus(SPIx1, SPI_I2S_FLAG_RXNE)一直为零,寄存器中没有数据。求大牛帮助啊

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-10-15 17:18:46 | 显示全部楼层
SPI_Direction_2Lines_FullDuplex你不是定义的全双工吗,那这个函数应该是
u8 SPI_Flash_SendWriteByte(u8 byte)
{
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){};
    SPI_I2S_SendData(SPI1, byte);
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){}; 
    return SPI_I2S_ReceiveData(SPI1);
}
还不清楚,就去查下全双工的含义
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11577
金钱
11577
注册时间
2014-4-1
在线时间
1321 小时
发表于 2015-10-15 17:29:23 | 显示全部楼层
主机发了没有?
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2015-10-15 17:39:24 | 显示全部楼层
用示波器检测一下吧。可能是硬件问题呢。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-10-15
在线时间
0 小时
 楼主| 发表于 2015-10-19 10:11:15 | 显示全部楼层
您看看:
主机初始化 
static void SPI_Config_master(void)
{
 SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Enable the SPI clock */
  SPIx_CLK_INIT(SPIx_CLK, ENABLE);

  /* Enable GPIO clocks */
  RCC_AHB1PeriphClockCmd(SPIx_SCK_GPIO_CLK | SPIx_MISO_GPIO_CLK | SPIx_MOSI_GPIO_CLK, ENABLE);

  /* Connect SPI pins to AF5 */  
  GPIO_PinAFConfig(SPIx_SCK_GPIO_PORT, SPIx_SCK_SOURCE, SPIx_SCK_AF);
  GPIO_PinAFConfig(SPIx_MOSI_GPIO_PORT, SPIx_MOSI_SOURCE, SPIx_MOSI_AF);
   GPIO_PinAFConfig(SPIx_MISO_GPIO_PORT, SPIx_MISO_SOURCE, SPIx_MISO_AF);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /* SPI SCK pin configuration */
  GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN;
  GPIO_Init(SPIx_SCK_GPIO_PORT, &GPIO_InitStructure);

  /* SPI  MOSI pin configuration */
  GPIO_InitStructure.GPIO_Pin =  SPIx_MOSI_PIN;
  GPIO_Init(SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure);

  /* SPI  MISO pin configuration */
  GPIO_InitStructure.GPIO_Pin =  SPIx_MISO_PIN;
  GPIO_Init(SPIx_MISO_GPIO_PORT, &GPIO_InitStructure);
 
 
  /* SPI configuration -------------------------------------------------------*/
  SPI_I2S_DeInit(SPIx);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_Init(SPIx, &SPI_InitStructure);
  SPI_Cmd(SPIx, ENABLE);
  /* Configure the riority Group to 1 bit */                
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* Configure the SPI interrupt priority */
  NVIC_InitStructure.NVIC_IRQChannel = SPIx_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

主机相关define
#define SPIx                           SPI2
#define SPIx_CLK                       RCC_APB1Periph_SPI2
#define SPIx_CLK_INIT                  RCC_APB1PeriphClockCmd
#define SPIx_IRQn                      SPI2_IRQn
#define SPIx_IRQHANDLER                SPI2_IRQHandler

#define SPIx_SCK_PIN                   GPIO_Pin_13
#define SPIx_SCK_GPIO_PORT             GPIOB
#define SPIx_SCK_GPIO_CLK              RCC_AHB1Periph_GPIOB
#define SPIx_SCK_SOURCE                GPIO_PinSource1
#define SPIx_SCK_AF                    GPIO_AF_SPI2

#define SPIx_MISO_PIN                  GPIO_Pin_14
#define SPIx_MISO_GPIO_PORT            GPIOB
#define SPIx_MISO_GPIO_CLK             RCC_AHB1Periph_GPIOB
#define SPIx_MISO_SOURCE               GPIO_PinSource2
#define SPIx_MISO_AF                   GPIO_AF_SPI2

#define SPIx_MOSI_PIN                  GPIO_Pin_15
#define SPIx_MOSI_GPIO_PORT            GPIOB
#define SPIx_MOSI_GPIO_CLK             RCC_AHB1Periph_GPIOB
#define SPIx_MOSI_SOURCE               GPIO_PinSource3
#define SPIx_MOSI_AF                   GPIO_AF_SPI2

main中测试函数 主机为spi2,从机为spi1
  while (1)
  {
 SPI_WriteByte(SPI2,DI);
        rdata=SPI_ReadByte(SPI1);
printf("\n\r slave***** rdata=%x \n\r",rdata);
DI++;
      delay_ms(10000);
  }



今天我用示波器看了一下主机spi2的时钟,一直没有时钟,是我设置不对还是什么原因呢?您帮我看看是初始化出了问题吗
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-10-15
在线时间
0 小时
 楼主| 发表于 2015-10-19 10:12:54 | 显示全部楼层
回复【3楼】xuande:
---------------------------------
您看看: 
主机初始化  
static void SPI_Config_master(void) 

 SPI_InitTypeDef  SPI_InitStructure; 
  GPIO_InitTypeDef GPIO_InitStructure; 
  NVIC_InitTypeDef NVIC_InitStructure; 

  /* Enable the SPI clock */ 
  SPIx_CLK_INIT(SPIx_CLK, ENABLE); 

  /* Enable GPIO clocks */ 
  RCC_AHB1PeriphClockCmd(SPIx_SCK_GPIO_CLK | SPIx_MISO_GPIO_CLK | SPIx_MOSI_GPIO_CLK, ENABLE); 

  /* Connect SPI pins to AF5 */   
  GPIO_PinAFConfig(SPIx_SCK_GPIO_PORT, SPIx_SCK_SOURCE, SPIx_SCK_AF); 
  GPIO_PinAFConfig(SPIx_MOSI_GPIO_PORT, SPIx_MOSI_SOURCE, SPIx_MOSI_AF); 
   GPIO_PinAFConfig(SPIx_MISO_GPIO_PORT, SPIx_MISO_SOURCE, SPIx_MISO_AF); 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN; 


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 
  GPIO_Init(GPIOB, &GPIO_InitStructure); 
  /* SPI SCK pin configuration */ 
  GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN; 
  GPIO_Init(SPIx_SCK_GPIO_PORT, &GPIO_InitStructure); 

  /* SPI  MOSI pin configuration */ 
  GPIO_InitStructure.GPIO_Pin =  SPIx_MOSI_PIN; 
  GPIO_Init(SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure); 

  /* SPI  MISO pin configuration */ 
  GPIO_InitStructure.GPIO_Pin =  SPIx_MISO_PIN; 
  GPIO_Init(SPIx_MISO_GPIO_PORT, &GPIO_InitStructure); 
  
  
  /* SPI configuration -------------------------------------------------------*/ 
  SPI_I2S_DeInit(SPIx); 
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; 
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; 
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; 
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 
  SPI_InitStructure.SPI_CRCPolynomial = 7; 
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 
  SPI_Init(SPIx, &SPI_InitStructure); 
  SPI_Cmd(SPIx, ENABLE); 
  /* Configure the riority Group to 1 bit */                 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
   
  /* Configure the SPI interrupt priority */ 
  NVIC_InitStructure.NVIC_IRQChannel = SPIx_IRQn; 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
  NVIC_Init(&NVIC_InitStructure); 


主机相关define 
#define SPIx                           SPI2 
#define SPIx_CLK                       RCC_APB1Periph_SPI2 
#define SPIx_CLK_INIT                  RCC_APB1PeriphClockCmd 
#define SPIx_IRQn                      SPI2_IRQn 
#define SPIx_IRQHANDLER                SPI2_IRQHandler 

#define SPIx_SCK_PIN                   GPIO_Pin_13 
#define SPIx_SCK_GPIO_PORT             GPIOB 
#define SPIx_SCK_GPIO_CLK              RCC_AHB1Periph_GPIOB 
#define SPIx_SCK_SOURCE                GPIO_PinSource1 
#define SPIx_SCK_AF                    GPIO_AF_SPI2 

#define SPIx_MISO_PIN                  GPIO_Pin_14 
#define SPIx_MISO_GPIO_PORT            GPIOB 
#define SPIx_MISO_GPIO_CLK             RCC_AHB1Periph_GPIOB 
#define SPIx_MISO_SOURCE               GPIO_PinSource2 
#define SPIx_MISO_AF                   GPIO_AF_SPI2 

#define SPIx_MOSI_PIN                  GPIO_Pin_15 
#define SPIx_MOSI_GPIO_PORT            GPIOB 
#define SPIx_MOSI_GPIO_CLK             RCC_AHB1Periph_GPIOB 
#define SPIx_MOSI_SOURCE               GPIO_PinSource3 
#define SPIx_MOSI_AF                   GPIO_AF_SPI2 

main中测试函数 主机为spi2,从机为spi1 
  while (1) 
  { 
 SPI_WriteByte(SPI2,DI); 
        rdata=SPI_ReadByte(SPI1); 
printf("\n\r slave***** rdata=%x \n\r",rdata); 
DI++; 
      delay_ms(10000); 
  } 



今天我用示波器看了一下主机spi2的时钟,一直没有时钟,是我设置不对还是什么原因呢?您帮我看看是初始化出了问题吗
回复【4楼】fanghuiopenedv:
---------------------------------
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11577
金钱
11577
注册时间
2014-4-1
在线时间
1321 小时
发表于 2015-10-19 10:31:56 | 显示全部楼层
没有时钟,就容易查,

先确保硬件没问题,
再查配置。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 20:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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