我尝试使主服务器和从属服务器stm32f103(bluepills)进行通信。但是我在接收时遇到了麻烦。当我将主机连接到逻辑分析仪时,我可以看到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));
答案 0 :(得分:1)
首先,您的HCLK和APB2总线频率是多少?如果我没记错的话,您似乎使用(fPLCK / 32)作为SPI时钟,并且逻辑分析仪显示〜2或3 MHz时钟。如果您的APB2频率高于72 MHz的限制,则可能会遇到时钟问题。
在从站中,您使用SSM(软件从站管理)并激活SSI(内部从站选择)。 SSI位的名称具有误导性:它模仿物理NSS引脚。因此,当SSI = 1时,未选择从站。这可能是从站忽略传入字节的原因。