Изменение портов SPI на Arduino

Моя конечная цель — прочитать информацию из модуля nRF24l01, подключенного к моему Arduino UNO R3, и генерировать прерывание всякий раз, когда сообщение отправляется на Arduino.

Я прочитал, что для аппаратных прерываний для генерации прерываний можно использовать только контакты D2 и D3. Однако при подключении линии MISO я увидел, что здесь упоминалось, что р>

На некоторых платах Arduino (см. таблицу выше) контакты MOSI, MISO и SCK совпадают с цифровыми контактами 11, 12 и 13 соответственно. Вот почему во многих руководствах вам предлагается подключить цель к этим контактам.

На всех веб-сайтах, которые я искал, MISO всегда подключен к номеру 12. Есть ли способ изменить строку MISO с 12 на 3, или мне придется прибегнуть к использованию прерываний смены PIN-кода? Я могу придумать еще один способ обойти это — соединить D12 с D3, но боюсь, что это может вызвать осложнения в схеме.

, 👍2

Обсуждение

SPI (и все периферийные устройства без GPIO) имеют собственное прерывание, которое вы можете включить, установив бит SPE в регистре управления SPI, и при получении данных будет срабатывать прерывание. Найдите пример ведомого устройства SPI или прочитайте мой [блог](https://www.e-tinkers.com/2020/03/do-you-know-arduino-spi-and-arduino-spi-library/), чтобы найти этот раздел. подчиненного устройства SPI., @hcheung

Если вы используете Arduino Uno (на базе чипа ATMega328), он не поддерживает альтернативный контакт для порта SPI. Если вы предполагаете, что «MISO всегда подключен к 12», это справедливо только для платы Arduino на основе [ATMega328](https://github.com/arduino/ArduinoCore-avr/blob/master/variants/standard/pins_arduino. h#L43-L46). Для другого ядра Arduino (например, ESP или STM32) или даже другого микроконтроллера (например, Arduino Leonardo, основанного на ATMega32U4), использующего то же ядро Arduino AVR, это будет [не так](https://github.com/arduino /ArduinoCore-avr/blob/master/variants/leonardo/pins_arduino.h#L111-L114)., @hcheung

Спасибо! Это работает для меня, @insipidintegrator

Сам NRF24L01 может дополнительно генерировать прерывание при получении сообщения. Вывод на NRF24L01 имеет маркировку IRQ там, где он выломан на большинстве модулей. Вы можете подключить его к выводу внешнего прерывания на Uno или использовать любой вывод, настроенный для прерывания смены вывода. Я не уверен, насколько далеко вы зайдете, пытаясь использовать MISO для той же цели. Пример см. здесь: https://howtomechatronics.com/tutorials/arduino/arduino-wireless-communication-nrf24l01-tutorial/, @6v6gt

@6v6gt линия IRQ в состоянии ожидания имеет ВЫСОКИЙ или НИЗКИЙ уровень? Я спрашиваю, потому что хочу правильно заполнить последний параметр AttachInterrupt(digitalPintoInterrupt(3), func_name, ________)., @insipidintegrator

На выводе IRQ активен НИЗКИЙ уровень согласно этому: https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf. Я бы использовал подтягивающий резистор входного контакта и искал спадающий фронт. Контакты должны быть устойчивы к 5 В. Возможно, вам придется явно включить вывод IRQ, используя библиотеку NRF24L01: https://nrf24.github.io/RF24/classRF24.html#abf68b9b0c9cd17179e9e144c3e7f9c45, @6v6gt

Спасибо @6v6gt за помощь, @insipidintegrator

Если это работает так, как вы хотите, добавьте в ветку дополнительный ответ о том, что вы сделали. Это может помочь кому-то другому., @6v6gt

@6v6gt Послушайте, именно поэтому ответы должны помещаться в поля для ответов. Гррр. Я просмотрел ответы, чтобы узнать, ответил ли кто-нибудь на вопрос о контакте IRQ, и не увидел такого ответа. Поэтому я напечатал свой собственный. Затем я вижу ваш комментарий выше, в котором вы отвечаете на вопрос и упоминаете контакт IRQ. И теперь у нас, как на форуме, появилось больше комментариев с вопросом, как работает ваш «ответ». Пожалуйста, используйте функцию ответа, чтобы отвечать на вопросы. Тогда комментарии под ответом имеют смысл. **Это не форум**., @Nick Gammon

@nickgammon Да. Извини. Это был особый случай. Как вы видели, вопрос ФП не имел ничего общего с тем, чего он хотел достичь, поэтому ответ не соответствовал бы вопросу. Я пытался заставить его разобраться во всем, добавив свой ответ, основанный на его собственном опыте использования предложенного метода IRQ, но, увы, этого не произошло., @6v6gt


2 ответа


Лучший ответ:

1

Я читал, что для аппаратных прерываний для генерации прерываний можно использовать только контакты D2 и D3

Прерывания по смене контактов, доступные на всех контактах Arduino Uno, почти так же хороши. Я говорю «почти»; потому что единственное, что вам нужно сделать, это выяснить, какой контакт вызвал прерывание, что может быть тривиально, если вы настроите только один контакт для генерации прерываний.

Есть ли способ изменить строку MISO с 12 на 3,

Нет, если вы использовали аппаратный SPI на чипе. Если вы используете битовый SPI, вы можете использовать любые контакты.

Я разработал проект датчика температуры и влажности, который записывает данные на SD-карту ( с использованием SPI), а также выводится на 8-разрядный дисплей (с использованием SPI). В последнем случае я использовал побитовый SPI, как описано там.

У меня есть страница о SPI, а также похожая один на Stack Exchange.

Мой битовый код SPI доступен здесь.


Мне непонятно, почему вы просто не используете аппаратные контакты SPI. Вам нужно прерывание при поступлении сообщения SPI? Для этого существует аппаратное прерывание. Подробнее об этом читайте в моих сообщениях об SPI.

,

«Вы хотите прерывания при поступлении сообщения SPI?» Моя конечная цель — прочитать информацию из модуля nRF24l01, подключенного к моему Arduino UNO R3, и генерировать прерывание всякий раз, когда сообщение отправляется на Arduino. Так что да, это именно то, что я ищу., @insipidintegrator

На самом деле я никогда раньше не использовал бит-бэнгинг, поэтому я просто углублюсь в эту тему. Спасибо за ресурсы., @insipidintegrator

Прерывание SPI, похоже, соответствует вашим требованиям, не нужно возиться, пытаясь сгенерировать прерывание другого типа., @Nick Gammon

Спасибо, Ник, за помощь., @insipidintegrator

Ник, ведомое устройство SPI может отправлять данные только по запросу ведущего. поэтому, если опрос SPI на ведущем устройстве недостаточно хорош, должен быть какой-то другой способ, чтобы ведомое устройство сигнализировало ведущему, что оно должно выполнить запрос., @Juraj

@Юрай, ОК, но в этом случае ведомое устройство не будет выполнять нежелательную отправку. Таким образом, ведомое устройство будет отправлять сигнал, используя какой-либо другой вывод (например, «данные готовы»?), который может быть подключен к контакту 2 или контакту 3 для прерывания., @Nick Gammon

В примере на связанной странице получатель просто запрашивает появление сообщения., @Nick Gammon

@Юрай Юрай Ах, я вижу, у нас здесь проблема с XY. Я дал еще один ответ. Этот ответ по-прежнему «хорош» в том смысле, что он отвечает на вопрос, выделенный жирным шрифтом, заданный ФП. Другой мой ответ касается Y-части проблемы., @Nick Gammon


1

Мой второй ответ...

Ваш вопрос, выделенный жирным шрифтом, является хорошим примером проблемы XY. Вы спросили:

Можно ли как-нибудь изменить строку MISO с 12 на 3, или мне придется прибегнуть к использованию прерываний смены контакта?

Это вопрос X. Однако вашей целью является вопрос Y:

Моя конечная цель — прочитать информацию из модуля nRF24l01, подключенного к моему Arduino UNO...

В другом ответе я ответил сначала об изменении линии MISO с контакта 12, а также указал, что транзакции SPI могут генерировать прерывания.

Однако, как отметил Юрай в комментарии, Arduino в этом случае является главным, а nRF24l01 - ведомым (с точки зрения SPI).

Не существует возможности, чтобы ведомое устройство ожило и сгенерировало сообщение и, следовательно, вызвало прерывание. Это работа мастера.

Когда я прочитал на этой странице о модуле, у него есть вывод IRQ, описанный следующим образом:

IRQ — это вывод прерывания, который может уведомлять ведущее устройство о появлении новых данных для обработки.

Итак, ваша работа действительно упрощается. Вам не нужно определять, когда начинается транзакция SPI (Arduino начнет транзакцию), вам нужно подключить вывод IRQ к выводу Arduino и определить, что данные готовы. Простой! Затем вы можете легко использовать контакт 2 или контакт 3, если хотите использовать «аппаратное обеспечение». прерывания, а не прерывания по смене контактов. (Однако прерывания по смене контактов также являются аппаратными прерываниями).

,

Я бы сказал, что Y — это псевдопроблема, которая не требует решения (переместите MISO на контакт прерывания). настоящая проблема X — правильное использование вывода IRQ., @Juraj