我尝试使主从stm32f103(bluepill)进行通信。但是我在接收时遇到了麻烦。当我将主机连接到逻辑分析仪时,我可以看到MOSI,如图所示>
在图片中,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,如图中的逻辑分析仪...
首先,您的HCLK和APB2总线频率是多少?如果我没记错的话,您似乎使用(fPLCK / 32)作为SPI时钟,并且逻辑分析仪显示〜2或3 MHz时钟。如果您的APB2频率高于72 MHz的限制,则可能会遇到时钟问题。