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

Вопрос: как в коде указать что именно эти пины будут использоваться для SPI?
Ищите stm32 pin remapping.
Всем привет!
Хочу подключить nrf24l01 к stm32f103c8t6. Стандартно подключается к пинам PA5 (SCK1), PA6(MOSO1), PA7(MOSI1). У меня эти пины заняты, уже печатка разведена, по этому их использовать не получится. В тоже время на stm32f103c8t6 есть еще один порт SPI, тоже под номером "1" (???):
PB3 (SCK1), PB4 (MISO1), PB5 (MOSI1)
чем ремапить первый SPI - проще использовать второй, тот что на пинах B12 - B15
Решилось все установкой "нормальной" поддержки 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) я видел именно эту библиотеку...
почитайте описание к этой библиотеке SPI - могу ошибаться. но если вы задаете CS пин в классе - как у вас написано - он будет управляться SPI либой, а не библиотекой NRF и тут может быть конфликт.
Тут даже не в 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. Попробую ее поковырять...
Многие библиотеки рассчитаны под работу только с первым SPI на дефолтных пинах и ни СПИ2, ни ремаппинг не поддерживают
еще посмотрите, под какое ядро СТМ рассчитана библиотека NRF - под старый аддон Роджера Кларка или под новый. что поставили Вы
А где это посмотреть можно?
А где это посмотреть можно?
Под какой аддон? - обычно в комментариях и описании к библиотеке
В описании к библиотеке есть много всего, но STM не присутствует: http://tmrh20.github.io/RF24/pages.html
Перепробовал много вариантов, но все без толку. Библиотека сама инициализирует SPI, из-за этого ничего не работает :(
В описании к библиотеке есть много всего, но STM не присутствует: http://tmrh20.github.io/RF24/pages.html
Перепробовал много вариантов, но все без толку. Библиотека сама инициализирует SPI, из-за этого ничего не работает :(
ну значит надо открыть библиотеку и подправить под СТМ. Обычно требуется изменить немного, только инициализацию.Я так три или четыре библиотеки адаптировал к СТМ32
Я попробовал - не мой уровень. Просто не смог разобраться. Может вы сможете помочь?
Я попробовал - не мой уровень. Просто не смог разобраться. Может вы сможете помочь?