Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

stm32f103c8t6, nrf24l01+ и переключение портов SPI

Вт янв 21, 2020 19:29:01

Всем привет!
Я в основном работаю с ардуино, с STM32 почти никогда не сталкивался. Но вот решил сделать один проект. Нужно много пинов (управление различной электроникой) и скорость по-больше чем 16 Мгц. Выбор пал на stm32f103c8t6 (Blue Pil). Плата хорошая.
Вникать в среду разработки под STM не целесообразно для единичного проекта. По этому решил сделать поддержку STM32 в среде Ардуино ИДЕ.
Ядро брал здесь: https://github.com/stm32duino/Arduino_Core_STM32
Прошиваю через ST Link V2. Все работает. Светодиодом помигал. SPI проверил и переназначил. Распиновка платки:
Изображение
Хочу подключить nrf24l01 к stm32f103c8t6. Стандартно подключается к пинам PA5 (SCK1), PA6(MOSO1), PA7(MOSI1). У меня эти пины заняты, уже печатка разведена, по этому их использовать не получится. В тоже время на stm32f103c8t6 есть еще один порт SPI, тоже под номером "1" (???): PB3 (SCK1), PB4 (MISO1), PB5 (MOSI1)
В скетче переназначил так:
Код:
SPIClass SPI_2(PB5,  PB4,  PB3, SPI2_NSS_PIN);

Прошиваю тестовый скетч ( для проверки SPI):
Спойлер
Код:
#include <SPI.h>

#define SPI2_NSS_PIN PA15   //SPI_2 Chip Select pin is PB12. You can change it to the STM32 pin you want.
//             mosi, miso, sclk, ssel
SPIClass SPI_2(PB5,  PB4,  PB3, SPI2_NSS_PIN); //Create an instance of the SPI Class called SPI_2 that uses the 2nd SPI Port

byte data;

void setup() {

  // Setup SPI 2
  SPI_2.begin(); //Initialize the SPI_2 port.
  SPI_2.setBitOrder(MSBFIRST); // Set the SPI_2 bit order
  SPI_2.setDataMode(SPI_MODE0); //Set the  SPI_2 data mode 0
  SPI_2.setClockDivider(SPI_CLOCK_DIV16);  // Use a different speed to SPI 1
  pinMode(SPI2_NSS_PIN, OUTPUT);
   
   
}

void loop() {
  sendSPI2();
  delayMicroseconds(10);    //Delay 10 micro seconds.
}

void sendSPI2()
{
  digitalWrite(SPI2_NSS_PIN, LOW); // manually take CSN low for SPI_2 transmission
  data = SPI_2.transfer(0x55); //Send the HEX data 0x55 over SPI-2 port and store the received byte to the <data> variable.
  digitalWrite(SPI2_NSS_PIN, HIGH); // manually take CSN high between spi transmissions
}

Проверил осциллографом. Данные через порт бегут. Но стоит подключить библиотеку nrf24l01 и SPI перестает работать. Библиотеку nrf24l01 брал здесь: https://github.com/nRF24/RF24
Может нужно какую-то специальную библиотеку использовать? Хотя во многих примерах (для STM) я видел именно эту библиотеку...
Попробовал поковырять эту библиотеку, но это оказалось для меня слишком сложным :(
Может вы посоветуете что мне делать? Нужно заставить работать nrf24l01 на пинах PB3 (SCK1), PB4 (MISO1), PB5 (MOSI1)

Re: stm32f103c8t6, nrf24l01+ и переключение портов SPI

Ср янв 22, 2020 19:27:06

Вообще-то, для того, чтобы воспользоваться SPI1 на PB3-4-5 необходимо отремапить этот SPI1 через регистр(ы) альтернативных функций. Подробностей, увы, не знаю - не надо было, не вникал. Но, кроме того, у F103C8T6, стоящего на Голубой Пилюле, есть SPI2. Может воспользоваться им будет проще?

Добавлено after 4 minutes 48 seconds:
В тоже время на stm32f103c8t6 есть еще один порт SPI, тоже под номером "1" (???)
Это, как раз, получится, если отремапить SPI1 на альтернативные ноги.

Re: stm32f103c8t6, nrf24l01+ и переключение портов SPI

Чт янв 23, 2020 07:09:57

С утреца, на свежую голову, поразглядывал RM0008 на предмет переназначения ног, и в частности, ног SPI1. Оказывается, ничего сложного. Надо сначала настроить должным образом те биты GPIO, которые станут ногами SPI1, а затем взвести в регистре AFIO_MAPR бит 0х01 (SPI1_REMAP). И, если SPI1 работает на альтернативных ногах без библиотеки nrf24l01, а при ее подключении отваливается, значит в этой библиотеке тоже что-то ремапится и при этом сбрасывается ремап SPI1.

Мне трудно что-либо сказать об Ардуино IDE - ни разу не имел с ней дела. Но, ничего об этом не зная, я бы, по-простому, поискал в этой библиотеке, где там заносится что-то в этот регистр альтернативных функций (прямым поиском по "AFIO->MAPR" и добавил по "ИЛИ" к заносимому туда коду бит AFIO_MAPR_SPI1_REMAP, т.е. 0х00000001). Может поможет...

Кстати, почему в тестовом скетче в тексте употребляется "SPI2"? Это же SPI1 на альтернативных ногах. Может из-за этого?
Ответить