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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
forfrends
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина
Контактная информация:

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

Сообщение forfrends »

Всем привет!
Я в основном работаю с ардуино, с 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)
Сделать своими руками всегда интересней чем просто купить и пользоваться
Реклама
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

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

Сообщение afz »

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

Добавлено after 4 minutes 48 seconds:
В тоже время на stm32f103c8t6 есть еще один порт SPI, тоже под номером "1" (???)
Это, как раз, получится, если отремапить SPI1 на альтернативные ноги.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

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

Сообщение afz »

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

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

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

Вернуться в «ARM»