stm32f103c8t6 переключение портов SPI (работа с nrf24l01+)

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет!

Хочу подключить nrf24l01 к stm32f103c8t6. Стандартно подключается к пинам PA5 (SCK1), PA6(MOSO1), PA7(MOSI1). У меня эти пины заняты, уже печатка разведена, по этому их использовать не получится. В тоже время на stm32f103c8t6 есть еще один порт SPI, тоже под номером "1" (???):
PB3 (SCK1), PB4 (MISO1), PB5 (MOSI1)

Вопрос: как в коде указать что именно эти пины будут использоваться для SPI?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ищите stm32 pin remapping.

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

Всем привет!

Хочу подключить nrf24l01 к stm32f103c8t6. Стандартно подключается к пинам PA5 (SCK1), PA6(MOSO1), PA7(MOSI1). У меня эти пины заняты, уже печатка разведена, по этому их использовать не получится. В тоже время на stm32f103c8t6 есть еще один порт SPI, тоже под номером "1" (???):
PB3 (SCK1), PB4 (MISO1), PB5 (MOSI1)

чем ремапить первый SPI - проще использовать второй, тот что на пинах B12 - B15

forfrends
Offline
Зарегистрирован: 24.02.2015

Решилось все установкой "нормальной" поддержки STM в среде Ардуино ИДЕ. 
Ядро для STM брал здесь: https://github.com/stm32duino/Arduino_Core_STM32

Порт переназначается слюдующей командой:

SPIClass SPI_3(PB5, PB4, PB3, PA15);
...
SPI_3.begin();

Столкнулся с другой проблемой. Заливаю тестовый скетч для проверки 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 порт перестает работать... 
Библиотеку использую эту: https://github.com/nRF24/RF24

Может нужно какую-то специальную библиотеку использовать? Хотя во многих примерах (для STM) я видел именно эту библиотеку...

b707
Offline
Зарегистрирован: 26.05.2017

почитайте описание к этой библиотеке SPI - могу ошибаться. но если вы задаете CS пин в классе - как у вас написано - он будет управляться SPI либой, а не библиотекой NRF и тут может быть конфликт.

forfrends
Offline
Зарегистрирован: 24.02.2015

Тут даже не в CS пине дело. Даже если библиотека его неправильно переназначит (даже если неправильно определит весь порт) все равно какой-то порт должен работать и слать данные (если не ошибаюсь).  Но в моем случае на всей плате не дергается ни одна ножка кроме PA15. На ней присутствуют импульсы.

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(PA8, PA15);

//             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);
   
  radio.begin();
}

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. Попробую ее поковырять...

b707
Offline
Зарегистрирован: 26.05.2017

Многие библиотеки рассчитаны под работу только с первым SPI на дефолтных пинах и ни СПИ2, ни ремаппинг не поддерживают

еще посмотрите, под какое ядро СТМ рассчитана библиотека NRF - под старый аддон Роджера Кларка или под новый. что поставили Вы

forfrends
Offline
Зарегистрирован: 24.02.2015

А где это посмотреть можно?

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

А где это посмотреть можно?

Под какой аддон? - обычно в комментариях и описании к библиотеке

forfrends
Offline
Зарегистрирован: 24.02.2015

В описании к библиотеке есть много всего, но STM не присутствует: http://tmrh20.github.io/RF24/pages.html

Перепробовал много вариантов, но все без толку. Библиотека сама инициализирует SPI, из-за этого ничего не работает :(

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

В описании к библиотеке есть много всего, но STM не присутствует: http://tmrh20.github.io/RF24/pages.html

Перепробовал много вариантов, но все без толку. Библиотека сама инициализирует SPI, из-за этого ничего не работает :(

ну значит надо открыть библиотеку и подправить под СТМ. Обычно требуется изменить немного, только инициализацию.Я так три или четыре библиотеки адаптировал к СТМ32

 

forfrends
Offline
Зарегистрирован: 24.02.2015

Я попробовал - не мой уровень. Просто не смог разобраться. Может вы сможете помочь?

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

Я попробовал - не мой уровень. Просто не смог разобраться. Может вы сможете помочь?

попробую посмотреть, но проблема в том, что с новым аддоном я пока не работал