Конфликт радиомодуля nRF24 + сдвиговый регистр SN74HC165N
- Войдите на сайт для отправки комментариев
Добрый день, товарищи.
Изначально отладил работу сдвиговых регистров и теперь успешно получаю с них два байта данных по SPI. Регистры висят на аппаратном SPI Arduino Mini Pro (10 — SS, 11 — MOSI, 12 — MISO, 13 — SCK).
Код выглядит так:
#include <SPI.h>
const int SN74_Pin = 10;
uint8_t reg_data[1];
uint8_t size = 1;
void setup() {
Serial.begin(9600);
SPI.begin();
pinMode (SN74_Pin, OUTPUT);
digitalWrite (SN74_Pin, HIGH);
}
void loop() {
// ОБЩЕНИЕ СОБЩЕНИЕ С SN74HC165N
digitalWrite(SN74_Pin, LOW); // в низком состоянии регистр получает параллельно биты
digitalWrite(SN74_Pin, HIGH); // в высоком состоянии регистр отдаёт последовательно биты
for (int i=0; i<2; i++) {
SPI.transfer(®_data[i], size);
Serial.print(reg_data[i], BIN);
}
Serial.print("\r\n");
delay (1000);
}
В мониторе стабильное:
1000111110101111 1000111110101111 1000111110101111 1000111110101111 1000111110101111 1000111110101111
каждую секунду. Так и должно быть — два регистра каскадно выдают мне в MISO последовательно эти биты. Но стоит мне подключить nRF24 с помощью библиотеки, как в монитор начинает приходить лажа. nRF подключен к SPI Arduino Mini Pro (8 — CSN, 9 — CE, 11 — MOSI, 12 — MISO, 13 — SCK)
Теперь код выглядит так:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 8); // CE, CSN
const int SN74_Pin = 10;
uint8_t reg_data[1];
uint8_t size = 1;
void setup() {
Serial.begin(9600);
SPI.begin();
radio.begin();
pinMode (SN74_Pin, OUTPUT);
digitalWrite (SN74_Pin, HIGH);
}
void loop() {
// ОБЩЕНИЕ С SN74HC165N
digitalWrite(SN74_Pin, LOW);
digitalWrite(SN74_Pin, HIGH);
for (int i=0; i<2; i++) {
SPI.transfer(®_data[i], size);
Serial.print(reg_data[i], BIN);
}
Serial.print("\r\n");
delay (1000);
}
В мониторе с дикой скоростью бесконечно идет
101010101010101010101010101010101010101010101010101010101010101010101010
в одну строку (без перевода строки), хотя в цикле есть перевод строки. Получается что игнорируется всё, что после завершения FOR. И скорее всего FOR даже не заканчивается.
Не понимаю. Ведь я разделил два устройства на шине — каждому дал свои управляющие пины. Я даже не начинал использовать модуль, а просто его инициализировал его в setup().
Пробовал отключать nRF от шины SPI, пробовал отключать и питание nRF'а, Стабильный "10101010...." в цикле. Мои мысли — несовместимость программная (вернее библиотечная) и нужно переписывать всю программу на низком уровне, т.е. на каждом этапе знать что и как у нас в конфигурационных регистрах, работать с данными напрямую через регистр данных процессора.
Но меня не покидает мысль, что на такой простой задаче можно словить несовместимость какую-то. Может я чего-то не понимаю? Помогите. Спасибо!
Ребят, ну, что, никто не сможет мне помочь?
Не так делается.
Ложится SS на землю.
Затем защёлка тоже на землю и сразу обратно, чтобы считалось.
spi.transfer();
поднять SS обратно.
читайте
А с чего Вы взяли что в паралель регистрам можна NRF цеплять? Разве у регистров выход с 3-я состояниями?
Не так делается.
Ложится SS на землю.
Затем защёлка тоже на землю и сразу обратно, чтобы считалось.
spi.transfer();
поднять SS обратно.
читайте
Прочитал, вроде бы у меня так и сделано. SS нога на выход с положением — лог.единица. А уже в самом цикле дергаю вниз-верх и потом считываю через SPI.transfer().
А с чего Вы взяли что в паралель регистрам можна NRF цеплять? Разве у регистров выход с 3-я состояниями?
Намёка не понял. Можно по подробнее? А у nRF на MISO может быть три состояния? Или за третьее считается инвертированное по фазе?
Мне больше интересно что такого делает библиотека, что всё перестаёт работать. А в частности эти 010101010 начинают идти после
Если закомментировать radio.begin() то в мониторе напишутся два одиноких игрека через пробел :))) :
А с чего Вы взяли что в паралель регистрам можна NRF цеплять? Разве у регистров выход с 3-я состояниями?
Поразмышлял на эту тему. Если они по отдельности оба работают, то теоретически и вместе должны. Хочу подключить в схему вот эту микросхему-ключ К561КТ3, чтобы намертво изолировать их в нужный момент. Но всё больше я склоняюсь в сторону низкоуровневого программирования, чтобы иметь контроль над каждым конфигурационным битом и статус-регистрами. При таком подходе, возможно, и К561КТ3 не понадобится. Чёрт его знает что там библиотеки делают. В офф. описании классов тоже ничего особо не раскрыто, а исходники классов читать не охото ))
Ребят, ну, что, никто не сможет мне помочь?
У SPI 4 режима работы,
- полярность синхроимпульса
- считывание по переднему или заднему фронту синхроимпульса
http://s-engineer.ru/interfejs-spi/
У nRF и сдвигового регистра эта настройка может просто не совпадать
Тогда теряется передний или задний бит из байта.
И еще nRF в максимальном режиме HIGH много потребляет, мощности USB не хватает, из за просадки питания куча глюков, надо запитывать от отдельного блока.
Ребят, ну, что, никто не сможет мне помочь?
У SPI 4 режима работы,
- полярность синхроимпульса
- считывание по переднему или заднему фронту синхроимпульса
http://s-engineer.ru/interfejs-spi/
У nRF и сдвигового регистра эта настройка может просто не совпадать
Тогда теряется передний или задний бит из байта.
И еще nRF в максимальном режиме HIGH много потребляет, мощности USB не хватает, из за просадки питания куча глюков, надо запитывать от отдельного блока.
если вы про режимы, которые конфигурируются строкой
, то я их все перепробовал. Менял скорости, менял порядок битов, менял режимы. Ничего не помогает.
Стоит только закомментировать строки:
как сразу всё начинает работать.
А по поводу потребления, то он из подозрения уходит, т.к. отключен и лежит в сторонке.
Буду ковырять библиотеку.
//Намёка не понял. Можно по подробнее?
Ни вапрос!! Здесь - http://www.ti.com/lit/ds/symlink/sn74hc165.pdf все очень подробно. Я лично с sn74hc165 не имел счастья работать, в отличии от их 595 братьев. Но помнится мне был интересный диспут по вариантам построения spi где какраз проблема в отсутствии третего состояня. По ссылке выше бегло глянул - тоже вроде нет.
//А у nRF на MISO может быть три состояния?
А ХЗ. Но вобщем и не важно. Если хоть у одного нет - проблема. Ну представте что на выходе регистра 0, а на выходе nRF 1. Или наоборот. Что бедному контролеру вводить? 0,5? Объединять выходы микросхем вобщем можна только при выполнении условия что не более одной находятся в активном состоянии (0 или 1) в любой момент времени, а остальные в 3-м состоянии. Всякие ОК и монтажные или - отдельная тема.
//Или за третьее считается инвертированное по фазе?
Не. Не годится.
//Хочу подключить в схему вот эту микросхему-ключ К561КТ3, чтобы намертво изолировать их в нужный момент.
Оно конечно можна и так, но проще на аппаратном spi оставить nRF, с его либой покрытой мраком. Работает - не трогай ;) А регистры поцепить на свободные пины и устроить им програмный spi. Там делов на 5 минут. Тогда эти 2 темы реально независимыми будут.
561КТ3 слишком круто для такого.
Если мусор не исчезнет, то таким же способом, MISO передатора не прямо в D12 а через NAND и инвертор, и второй вход также разрешать с SS (D8 или D9, хер их знает в каком они порядке там перечисляются), так же через инвертор. Учтите, сии патчи и апдейты отсрочивают поступление сигнала, в каждом куске 7400 сигнал остаётся на 20 наносекунд, покурить, на диване отдохнуть. Тут их два итого 40.
Оно конечно можна и так, но проще на аппаратном spi оставить nRF, с его либой покрытой мраком. Работает - не трогай ;) А регистры поцепить на свободные пины и устроить им програмный spi. Там делов на 5 минут. Тогда эти 2 темы реально независимыми будут.
Крутое решение. Почему я сразу не догадался так сделать. Ох, мой перфикционизм говорит "не надо так делать, есть специальный порт для этого, вот туда и подключай". Но с другой стороны понимаю, что эти регистры совсем не SPI-ные, а просто очень похожи на SPI.
Спасибо большое, буду пробовать. Как появятся результаты, сразу отпишусь.
561КТ3 слишком круто для такого.
Если мусор не исчезнет, то таким же способом, MISO передатора не прямо в D12 а через NAND и инвертор, и второй вход также разрешать с SS (D8 или D9, хер их знает в каком они порядке там перечисляются), так же через инвертор. Учтите, сии патчи и апдейты отсрочивают поступление сигнала, в каждом куске 7400 сигнал остаётся на 20 наносекунд, покурить, на диване отдохнуть. Тут их два итого 40.
Ох, я новичёк в этом деле, такие схемы и некоторые термины для меня пока еще не очень понятны, но обещаю изучить и попробовать реализовать.
А J3 в данной схеме это кто? С остальными вроде бы понятно: J2 — SPI порт контроллера, RF24 — понятно, 74165 — понятно.
Это выводы ардуины же. Видно что 8 и 9 идут к трансиверу.
УУуиииихууу! Заработало.
Рассадил на разные ноги устройства. Радио на аппаратный SPI, регистры на программный SPI. Нашел библиотеку https://github.com/MajenkoLibraries/SoftSPI
Спасибо за наводку уважаемому @Logik.
Также спасибо @Voodoo Doll за еще один вариант решения.
Реально получил удовольствие по-общаться с умными людьми!
n_angelo, не торопитесь переносить регистры на программный SPI, для начала добавьте с выхода регистра последовательно резистор 1-2 кОм.
а последовательно чему соединять ? у меня такая же проблемка нарисовалась
Странный вопрос. Вам же ясно написали "последовательно с выхода регистра".
одна фигня непомогает, нашел как сделать, сегодня подключил miso через буфер 74hc125 все работает, только одно но, нужна доп ножка для ss включения передачи, но на меге их очень много, а на уно и нано можно теми же сдвиговиками рулить на 595 например :))
Так где проблема. Вопрос ведь был только в совместном использовании неско входов и одного выхода, вам и посоветовали. Способы есть, например через логику с двумя входами и одним выходом. Рисуете таблицу истинности - и вот вам счастье.
у меня сдвиговик 165 и nrf ка, по отдельности работали вместе контроллер залипает при опросе нрфки, реистор не помог на 165 выход, поэтому сделал через буфер 125тый, теперь проблемы нету, 595 работает в любых вариациях (возможно я название перепутал моси с мисо)
Названия фиг с ними. Согласовывайте входные и выходные сопротивления - и воздастся вам.