STM32F103 SPI不同引脚不工作

STM32F103 SPI different pins does not work

我目前正在使用 STM32F103C8T6 微控制器进行 LoRaWAN 技术项目。对于 LoRa,我在全双工主模式(特别是 spi1)和 CubeIDE 中使用 SPI,当您激活 SPI1 时,自动激活引脚 PA5、PA6 和 PA7(ver1):

然而,PCB已经设计和印刷,不幸的是那些管脚很忙。因为,之前计划使用其他 SPI1 引脚(PB3、PB4、PB5)(ver2):

所以,当我使用 ver1 时,一切都很好,LoRa 连接到服务器并毫无问题地发送数据。但是,当我使用 ver2 时,它根本不起作用。调试了一下发现是哪里出了问题,SPI读取失败(读取LoRa版本时,returns0)。因此,ASSERT 触发并且代码陷入无限循环。我在互联网上找不到任何关于 SPI 引脚差异的参考资料。

谁能解释一下这些引脚的区别?是否可以使用 ver2?提前致谢。

P.S。我正在使用 HAL 库 + LMIC 库(用于 LoRa)并且 SPI 的配置对于 ver1 和 ver2 都是相同的。如果需要,这里是配置代码:

void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}

P.S.S: 我也在electronics stackexchange上提过这个问题,但是那里没有答案,所以我决定在这里也分享这个问题。

经过多次尝试,我发现重新映射的 SPI1 不能与 I2C1 一起工作,因为 I2C1-SMBA 引脚与 SP1 MOSI 引脚 (PB5) 重叠,即使您没有使用 SMBA。您可以在这里找到相关信息:STM32F103x8 errata 第 2.8.7 章

所以,我想,我会使用 I2C2 来避免冲突。我应该在 PCB 上做的唯一改变是将 I2C1 引脚重定向到 I2C2(2 个引脚),这比重定向 SPI1 引脚(3 个引脚)和占用 ver1(也是 3 个)引脚的其他元素要好得多。