STM32F103 SPI主从接收问题

问题描述 投票:0回答:1

我尝试使主从stm32f103(bluepill)进行通信。但是我在接收时遇到了麻烦。当我将主机连接到逻辑分析仪时,我可以看到MOSI,如图所示>

Logic Analyser

在图片中,MOSI正在发送“ Y”字母。但是并非所有时钟脉冲都相同。(我不知道这是否是通信失败的原因)

这是我的原理图和我的代码,我已尽可能简化。

主代码:

    int i;


RCC ->APB2ENR |= 0x00001004; //SPI1,GPIOA clock en

GPIOA ->CRL &= 0x00000000;
GPIOA ->CRL |= 0xb0b33333;


SPI1->CR1  = SPI_CR1_SSM| SPI_CR1_SSI| SPI_CR1_MSTR|SPI_CR1_BR_2;  

SPI1->CR1  |= SPI_CR1_SPE;  // enable SPI

    while(1){

SPI1 -> DR  = 'A';

for(int i = 0 ;i<400000;i++);

while( !(SPI1->SR & SPI_SR_TXE) );  // wait until transmit buffer empty

    }

和从属

    int i;
RCC ->APB2ENR |= 0x0000100c; //SPI1,GPIOA,GPIOB clock en

GPIOB ->CRH &= 0x00000000;
GPIOB ->CRH |= 0x33333333;
GPIOA ->CRL &= 0x00000000;
GPIOA ->CRL |= 0x4b443333;
GPIOA ->CRH &= 0x00000000;
GPIOA ->CRH |= 0x33333333;


SPI1->CR1  = SPI_CR1_SSM| SPI_CR1_SSI| SPI_CR1_BR_2;
SPI1->CR1  |= SPI_CR1_SPE;  // enable SPI
SPI1->CR1 &=~SPI_CR1_MSTR;  //disable master

 for(int c=0;c<5;c++){
LCD_INIT(cmd[c]);
}

while(1){




     while( !(SPI1->SR & SPI_SR_RXNE));

        char a = SPI1 ->DR;

 for (i=0;i<400000;i++);

 LCD_DATA(a);


 for (i=0;i<400000;i++);

 }
 }

我的示意图:Schematic

问题是从站未接收任何数据。卡在循环中while( !(SPI1->SR & SPI_SR_RXNE));

我尝试使主从stm32f103(bluepill)进行通信。但是我在接收时遇到了麻烦。当我将主设备连接到逻辑分析仪时,可以看到MOSI,如图中的逻辑分析仪...

stm32 spi
1个回答
1
投票

首先,您的HCLK和APB2总线频率是多少?如果我没记错的话,您似乎使用(fPLCK / 32)作为SPI时钟,并且逻辑分析仪显示〜2或3 MHz时钟。如果您的APB2频率高于72 MHz的限制,则可能会遇到时钟问题。

© www.soinside.com 2019 - 2024. All rights reserved.