关于STM32F4 SPI1与SPI2通信问题

2019-07-14 16:05发布

这几天在调试STM32F4的SPI,通过自发自收测试代码,发现一个问题,就是当SPI1主发送时,波特率必须设为二分频,SPI2才能收到数据,若设为4分频或8分频,程序开在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 循环里,不知为什么?
以下是全部代码
#include"stm32F4xx.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void SPI_Configuration(void);
void Delay(int nCount);
int main(void)
{  RCC_Configuration();
  GPIO_Configuration();
  SPI_Configuration();
while(1)
{ int data=0;
  SPI_SendData(SPI1,0x55);
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
  data=SPI_ReceiveData(SPI2);
  if(data==0x55)
     {  while(1)
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
                Delay(0xfffff);
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
                Delay(0xfffff);
   
             };
     }
     else while(1)
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
               //Delay(0xfffff);
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
               //Delay(0xfffff);
   
            };
}
}
void RCC_Configuration()
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   
}
void GPIO_Configuration()
{  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  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_NOPULL;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void SPI_Configuration()
{  SPI_InitTypeDef SPI_InitStructure;
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  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_LSB;
  SPI_Init(SPI1, &SPI_InitStructure);
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
   SPI_Init(SPI2, &SPI_InitStructure);
   SPI_Cmd(SPI1,ENABLE);
   SPI_Cmd(SPI2,ENABLE);
}
void Delay(int nCount)
{ int c1=nCount;
int c2=nCount;
for(;c1>0;c1--)
  {
  for(;c2>0;c2--);
};
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
lingbingdie
1楼-- · 2019-07-14 21:41
回复第 2 楼 于2014-01-23 10:43:31发表:
The slave clock does not need to be set.初始化SPI2的时候,用2分频默认初
哦,好的~~
哈哈神神
2楼-- · 2019-07-15 01:04
楼主后来在同一块板子上SPI1与SPI2通信成功了吗?为什么我的程序只要先用SPI1发送就会卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);没办法读到SPI2的值?
SPI_SendData(SPI1,0x55);
while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
data=SPI_ReceiveData(SPI2);
szoldman
3楼-- · 2019-07-15 05:41
哈哈神神 发表于 2018-11-13 18:03
楼主后来在同一块板子上SPI1与SPI2通信成功了吗?为什么我的程序只要先用SPI1发送就会卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);没办法读到SPI2的值?
SPI_SendData(SPI1,0x55);
while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);

解决了么?  同问
60user85
4楼-- · 2019-07-15 07:41
 精彩回答 2  元偷偷看……
lee_st
5楼-- · 2019-07-15 10:25
没有响应

一周热门 更多>