Произвольное использование ноги SCLK

matuei
Offline
Зарегистрирован: 28.11.2015

Добрый день. Помогите решить проблему. Есть плата на основе atmega328pb на которой находятся ethernet модуль W5500 и cдвиговые регистры 74hc165. Из-за нехватки ног контроллера было решено объединить пины SCLK на модуле и пин CLK на сдвиговом регистре. Казалось бы они выполняют одну функцию и все должно работать. 

Сдвиговые регистры опрашиваю простой функцией 

void read_shift_regs()
{
  digitalWrite(load, LOW);
  delayMicroseconds(1);
  digitalWrite(load, HIGH);
   for (int i = 0; i < 16; i++)
  {
    Array[i] = digitalRead(out_hc);
    digitalWrite(sck, HIGH);
    delayMicroseconds(1);
    digitalWrite(sck, LOW);
  }
}

которая просто обновляет глобальный массив, в котором находятся состояние входов регистров. 

Для W5500 использую библиотеки SPI.h Ethernet.h PubSubClient.h,  , т.к. общение происходит по mqtt. Если по отдельности запускать - то все работает, но если собрать все вместе то нет. А именно после вызова Ethernet.begin(mac))  перестает работать функция digitalWrite(sck, ); Проверял так же подключив осцилограф на пин sck и по очереди комментируя строки. Как заставить это работать вместе? 

 

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

правильно выставлять CS для Эзернет модуля пробовали?

А вообще, сейчас вам скажут. что контроллер надо выбирать под задачу - и будут правы. Вы мало того что присобачили сдвиговые для увеличения числа портов - так вам даже для сдвиговых и то пинов не хватает. Очевидно, что надо брать МК с большим числом GPIO

Памяти-то у 328 хватит? А то ведь Эзернет очень прожорлив на этот счет. Может, пока проект не уперся в пределы, на мегу переехать?

matuei
Offline
Зарегистрирован: 28.11.2015

b707 пишет:

правильно выставлять CS для Эзернет модуля пробовали?

да, в сетапе есть строка Ethernet.init(CS_W5500); 

Переход на мегу не целесобразен, т.к. размер платы не сильно больше меги. И это сильно удорожит плату. 

По памяти все влезает, т.к. mqtt на ней работает, места не много остается, но компилятор не предупреждает. 
А в использовании сдвиговых регистров ничего плохого не вижу, они считают входящие сигналы и смотрят на состояние дип переключателей. Не думаю что для кучки переключателей стоит тащить за собой мегу, т.к. ножек не хватило. 

sadman41
Offline
Зарегистрирован: 19.10.2016

matuei пишет:

А именно после вызова Ethernet.begin(mac))  перестает работать функция digitalWrite(sck, );

...

Как заставить это работать вместе? 

Читать исходники библиотеки и разбираться, что делает с ногой Ethernet.begin() и вообще Ethernet.* ().

По другому никак.

_Igor_
Offline
Зарегистрирован: 10.01.2022

Посмотрите что на ноге CS_W5500 до и после begin. Попробуйте в read_shift_regs уставить sck как OUTPUT...

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

matuei пишет:

да, в сетапе есть строка Ethernet.init(CS_W5500);

причем тут строка в сетапе?

Я вас спросил - вы сами, лично, пробовали в своем коде перед обращением к сдвиговым переводить Эзернет с помощью CS в ждущее состояние? - как работает SPI почитайте

rkit
Offline
Зарегистрирован: 23.11.2016

Пользуйся драйвером SPI для сдвигового регистра. Благо это одно и то же. Заодно и еще один пин освободишь.

matuei
Offline
Зарегистрирован: 28.11.2015

b707 пишет:

причем тут строка в сетапе?

Я вас спросил - вы сами, лично, пробовали в своем коде перед обращением к сдвиговым переводить Эзернет с помощью CS в ждущее состояние? - как работает SPI почитайте

А как пин CS может влиять на пин SCLK? 

 

Сейчас попробовал, сработала следующая конструкция 

SPI.end();
  read_shift_regs();
  SPI.begin();
 
и работает и w5500 и 74hc165, всем спасибо.
b707
Offline
Зарегистрирован: 26.05.2017

matuei пишет:

А как пин CS может влиять на пин SCLK?

я ж вам советовал почитать про SPI... Высокий уровень на CS переводит w5500 в ждущее состояние и он освобождает SCLK (по крайней мере должен так делать)

 

Цитата:
Сейчас попробовал, сработала следующая конструкция 

SPI.end();
  read_shift_regs();
  SPI.begin();
 
и работает и w5500 и 74hc165, всем спасибо.

ну раз работает....

Хотя книжки читать все равно полезно.

rkit
Offline
Зарегистрирован: 23.11.2016

b707 пишет:

Высокий уровень на CS переводит w5500 в ждущее состояние и он освобождает SCLK (по крайней мере должен так делать)

Пины атмеги всё равно контроллируются spi-модулем.

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

rkit пишет:

Пины атмеги всё равно контроллируются spi-модулем.

значит я был неправ, а ТС предложил рабочий вариант

matuei
Offline
Зарегистрирован: 28.11.2015

b707 пишет:

я ж вам советовал почитать про SPI... Высокий уровень на CS переводит w5500 в ждущее состояние и он освобождает SCLK (по крайней мере должен так делать)

 

CS при высоком уровне на W5500 должен перевести пин MISO в Z - состояние, а SCLK для модуля это вход, строб на нем генерирует контроллер.  Но на опрос сдвигового регистра этот пин ни как не влияет, потому что выход OUT на 74hc165 заведен на свой gpio на контроллере.