STM32F103 SPI主从接收问题

时间:2020-02-11 23:26:16

标签: stm32 spi

我尝试使主服务器和从属服务器stm32f103(bluepills)进行通信。但是我在接收时遇到了麻烦。当我将主机连接到逻辑分析仪时,我可以看到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));

1 个答案:

答案 0 :(得分:1)

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

在从站中,您使用SSM(软件从站管理)并激活SSI(内部从站选择)。 SSI位的名称具有误导性:它模仿物理NSS引脚。因此,当SSI = 1时,未选择从站。这可能是从站忽略传入字节的原因。