Конфликт радиомодуля nRF24 + сдвиговый регистр SN74HC165N

n_angelo
Offline
Зарегистрирован: 05.01.2018

Добрый день, товарищи.

Изначально отладил работу сдвиговых регистров и теперь успешно получаю с них два байта данных по 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(&reg_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(&reg_data[i], size);
    Serial.print(reg_data[i], BIN);
    }
  Serial.print("\r\n");
  delay (1000);
}

В мониторе с дикой скоростью бесконечно идет

101010101010101010101010101010101010101010101010101010101010101010101010

в одну строку (без перевода строки), хотя в цикле есть перевод строки. Получается что игнорируется всё, что после  завершения FOR. И скорее всего FOR даже не заканчивается.

Не понимаю. Ведь я разделил два устройства на шине — каждому дал свои управляющие пины. Я даже не начинал использовать модуль, а просто его инициализировал его в setup().

Пробовал отключать nRF от шины SPI, пробовал отключать и питание nRF'а, Стабильный "10101010...." в цикле. Мои мысли — несовместимость программная (вернее библиотечная) и нужно переписывать всю программу на низком уровне, т.е. на каждом этапе знать что и как у нас в конфигурационных регистрах, работать с данными напрямую через регистр данных процессора.

Но меня не покидает мысль, что на такой простой задаче можно словить несовместимость какую-то. Может я чего-то не понимаю? Помогите. Спасибо!

n_angelo
Offline
Зарегистрирован: 05.01.2018

Ребят, ну, что, никто не сможет мне помочь?

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Не так делается.

Ложится SS на землю.

Затем защёлка тоже на землю и сразу обратно, чтобы считалось.

spi.transfer();

поднять SS обратно.

читайте

Logik
Offline
Зарегистрирован: 05.08.2014

А с чего Вы взяли что в паралель регистрам можна NRF цеплять? Разве у регистров выход с 3-я состояниями?

n_angelo
Offline
Зарегистрирован: 05.01.2018

Voodoo Doll пишет:

Не так делается.

Ложится SS на землю.

Затем защёлка тоже на землю и сразу обратно, чтобы считалось.

spi.transfer();

поднять SS обратно.

читайте

Прочитал, вроде бы у меня так и сделано. SS нога на выход с положением — лог.единица. А уже в самом цикле дергаю вниз-верх и потом считываю через SPI.transfer().

n_angelo
Offline
Зарегистрирован: 05.01.2018

Logik пишет:

А с чего Вы взяли что в паралель регистрам можна NRF цеплять? Разве у регистров выход с 3-я состояниями?

Намёка не понял. Можно по подробнее? А у nRF на MISO может быть три состояния? Или за третьее считается  инвертированное по фазе?

Мне больше интересно что такого делает библиотека, что всё перестаёт работать. А в частности эти 010101010 начинают идти после

radio.begin();

Если закомментировать radio.begin() то в мониторе напишутся два одиноких игрека через пробел :))) :

Y Y 

 

n_angelo
Offline
Зарегистрирован: 05.01.2018

Logik пишет:

А с чего Вы взяли что в паралель регистрам можна NRF цеплять? Разве у регистров выход с 3-я состояниями?

Поразмышлял на эту тему. Если они по отдельности оба работают, то теоретически и вместе должны. Хочу подключить в схему вот эту микросхему-ключ К561КТ3, чтобы намертво изолировать их в нужный момент. Но всё больше я склоняюсь в сторону низкоуровневого программирования, чтобы иметь контроль над каждым конфигурационным битом и статус-регистрами. При таком подходе, возможно, и К561КТ3 не понадобится. Чёрт его знает что там библиотеки делают. В офф. описании классов тоже ничего особо не раскрыто, а исходники классов читать не охото ))

taraserker
taraserker аватар
Offline
Зарегистрирован: 24.01.2016

n_angelo пишет:

Ребят, ну, что, никто не сможет мне помочь?

У SPI 4 режима работы,
- полярность синхроимпульса
- считывание по переднему или заднему фронту синхроимпульса
http://s-engineer.ru/interfejs-spi/

У nRF и сдвигового регистра эта настройка может просто не совпадать
Тогда теряется передний или задний бит из байта.

И еще nRF в максимальном режиме HIGH много потребляет, мощности USB не хватает, из за просадки питания куча глюков, надо запитывать от отдельного блока.

n_angelo
Offline
Зарегистрирован: 05.01.2018

taraserker пишет:

n_angelo пишет:

Ребят, ну, что, никто не сможет мне помочь?

У SPI 4 режима работы,
- полярность синхроимпульса
- считывание по переднему или заднему фронту синхроимпульса
http://s-engineer.ru/interfejs-spi/

У nRF и сдвигового регистра эта настройка может просто не совпадать
Тогда теряется передний или задний бит из байта.

И еще nRF в максимальном режиме HIGH много потребляет, мощности USB не хватает, из за просадки питания куча глюков, надо запитывать от отдельного блока.

если вы про режимы, которые конфигурируются строкой

SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));

, то я их все перепробовал. Менял скорости, менял порядок битов, менял режимы. Ничего не помогает. 

Стоит только закомментировать строки:

// RF24 radio(9, 8);
// radio.begin();

как сразу всё начинает работать.

А по поводу потребления, то он из подозрения уходит, т.к. отключен и лежит в сторонке.

Буду ковырять библиотеку.

 

Logik
Offline
Зарегистрирован: 05.08.2014

//Намёка не понял. Можно по подробнее? 

Ни вапрос!! Здесь - 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 темы реально независимыми будут.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

561КТ3 слишком круто для такого.

Если мусор не исчезнет, то таким же способом, MISO передатора не прямо в D12 а через NAND и инвертор, и второй вход также разрешать с SS (D8 или D9, хер их знает в каком они порядке там перечисляются), так же через инвертор. Учтите, сии патчи и апдейты отсрочивают поступление сигнала, в каждом куске 7400 сигнал остаётся на 20 наносекунд, покурить, на диване отдохнуть. Тут их два итого 40.

n_angelo
Offline
Зарегистрирован: 05.01.2018

Logik пишет:

Оно конечно можна и так, но проще на аппаратном spi оставить nRF, с его либой покрытой мраком. Работает - не трогай ;) А регистры поцепить на свободные пины  и устроить им програмный spi. Там делов на 5 минут. Тогда эти 2 темы реально независимыми будут.

Крутое решение. Почему я сразу не догадался так сделать. Ох, мой перфикционизм говорит "не надо так делать, есть специальный порт для этого, вот туда и подключай". Но с другой стороны понимаю, что эти регистры совсем не SPI-ные, а просто очень похожи на SPI.

Спасибо большое, буду пробовать. Как появятся результаты, сразу отпишусь.

 

n_angelo
Offline
Зарегистрирован: 05.01.2018

Voodoo Doll пишет:

561КТ3 слишком круто для такого.

Если мусор не исчезнет, то таким же способом, MISO передатора не прямо в D12 а через NAND и инвертор, и второй вход также разрешать с SS (D8 или D9, хер их знает в каком они порядке там перечисляются), так же через инвертор. Учтите, сии патчи и апдейты отсрочивают поступление сигнала, в каждом куске 7400 сигнал остаётся на 20 наносекунд, покурить, на диване отдохнуть. Тут их два итого 40.

Ох, я новичёк в этом деле, такие схемы и некоторые термины для меня пока еще не очень понятны, но обещаю изучить и попробовать реализовать.

А J3 в данной схеме это кто? С остальными вроде бы понятно: J2 — SPI порт контроллера, RF24 — понятно, 74165 — понятно.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Это выводы ардуины же. Видно что 8 и 9 идут к трансиверу.

n_angelo
Offline
Зарегистрирован: 05.01.2018

УУуиииихууу! Заработало.

Рассадил на разные ноги устройства. Радио на аппаратный SPI, регистры на программный SPI. Нашел библиотеку https://github.com/MajenkoLibraries/SoftSPI

Спасибо за наводку уважаемому @Logik.

Также спасибо @Voodoo Doll за еще один вариант решения.

Реально получил удовольствие по-общаться с умными людьми!

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

n_angelo, не торопитесь переносить регистры на программный SPI, для начала добавьте с выхода регистра последовательно резистор 1-2 кОм.

grizly
Offline
Зарегистрирован: 24.01.2019

а последовательно чему соединять ? у меня такая же проблемка нарисовалась

Schwarz78
Offline
Зарегистрирован: 19.01.2019

Странный вопрос. Вам же ясно написали "последовательно с выхода регистра".

grizly
Offline
Зарегистрирован: 24.01.2019

одна фигня непомогает, нашел как сделать, сегодня подключил miso через буфер 74hc125 все работает, только одно но, нужна доп ножка для ss включения передачи, но на меге их очень много, а на уно и нано можно теми же сдвиговиками рулить на 595 например :))

Schwarz78
Offline
Зарегистрирован: 19.01.2019

Так где проблема. Вопрос ведь был только в совместном использовании неско входов и одного выхода, вам и посоветовали. Способы есть, например через логику с двумя входами и одним выходом. Рисуете таблицу истинности - и вот вам счастье.

grizly
Offline
Зарегистрирован: 24.01.2019

у меня сдвиговик 165 и nrf ка, по отдельности работали вместе контроллер залипает при опросе нрфки, реистор не помог на 165 выход, поэтому сделал через буфер 125тый, теперь проблемы нету, 595 работает в любых вариациях (возможно я название перепутал моси с мисо)

Schwarz78
Offline
Зарегистрирован: 19.01.2019

Названия фиг с ними. Согласовывайте входные и выходные сопротивления - и воздастся вам.