STM32F103 SPI разные пины не работает

В настоящее время я работаю над проектом с технологией LoRaWAN с использованием микроконтроллера STM32F103C8T6. Для LoRa я использую SPI в режиме Full-Duplex Master (в частности, spi1) и в CubeIDE, когда вы активируете SPI1, автоматически активируются контакты PA5, PA6 и PA7 (ver1):  Конфигурация SPI1

Однако печатная плата спроектирована и напечатана, и эти контакты, к сожалению, заняты. Потому что раньше планировалось использовать другие выводы SPI1 (PB3, PB4, PB5) (ver2): Конфигурация SPI1 v2

Итак, когда я использую ver1, все в порядке, LoRa подключается к серверу и отправляет данные без проблем. Однако, когда я использую версию 2, она вообще не работает. Я отлаживал, чтобы найти, в чем проблема, и обнаружил, что чтение SPI не выполняется (при чтении версии LoRa возвращается 0). Таким образом, 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: Я тоже задавал этот вопрос в электронике stackexchange, но там не было ответа, поэтому я решил поделиться этим вопросом и здесь.


person Miradil Zeynalli    schedule 04.10.2019    source источник


Ответы (1)


После множества попыток я обнаружил, что переназначенный SPI1 не работает вместе с I2C1 из-за перекрытия вывода I2C1-SMBA с выводом MOSI SP1 (PB5), даже если вы не используете SMBA. Вы можете узнать об этом здесь: STM32F103x8 Errata, глава 2.8.7

Так что, думаю, я буду использовать I2C2, чтобы избежать столкновений. Единственное изменение, которое я должен сделать на печатной плате, - это перенаправление контактов I2C1 на I2C2 (2 контакта), что намного лучше, чем перенаправление контактов SPI1 (3 контакта) и других элементов, занимающих контакты ver1 (также 3).

person Miradil Zeynalli    schedule 05.10.2019