Произвольное использование ноги SCLK
- Войдите на сайт для отправки комментариев
Добрый день. Помогите решить проблему. Есть плата на основе 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 и по очереди комментируя строки. Как заставить это работать вместе?
правильно выставлять CS для Эзернет модуля пробовали?
А вообще, сейчас вам скажут. что контроллер надо выбирать под задачу - и будут правы. Вы мало того что присобачили сдвиговые для увеличения числа портов - так вам даже для сдвиговых и то пинов не хватает. Очевидно, что надо брать МК с большим числом GPIO
Памяти-то у 328 хватит? А то ведь Эзернет очень прожорлив на этот счет. Может, пока проект не уперся в пределы, на мегу переехать?
правильно выставлять CS для Эзернет модуля пробовали?
да, в сетапе есть строка Ethernet.init(CS_W5500);
Переход на мегу не целесобразен, т.к. размер платы не сильно больше меги. И это сильно удорожит плату.
По памяти все влезает, т.к. mqtt на ней работает, места не много остается, но компилятор не предупреждает.
А в использовании сдвиговых регистров ничего плохого не вижу, они считают входящие сигналы и смотрят на состояние дип переключателей. Не думаю что для кучки переключателей стоит тащить за собой мегу, т.к. ножек не хватило.
А именно после вызова Ethernet.begin(mac)) перестает работать функция digitalWrite(sck, );
...
Как заставить это работать вместе?
Читать исходники библиотеки и разбираться, что делает с ногой Ethernet.begin() и вообще Ethernet.* ().
По другому никак.
Посмотрите что на ноге CS_W5500 до и после begin. Попробуйте в read_shift_regs уставить sck как OUTPUT...
да, в сетапе есть строка Ethernet.init(CS_W5500);
причем тут строка в сетапе?
Я вас спросил - вы сами, лично, пробовали в своем коде перед обращением к сдвиговым переводить Эзернет с помощью CS в ждущее состояние? - как работает SPI почитайте
Пользуйся драйвером SPI для сдвигового регистра. Благо это одно и то же. Заодно и еще один пин освободишь.
причем тут строка в сетапе?
Я вас спросил - вы сами, лично, пробовали в своем коде перед обращением к сдвиговым переводить Эзернет с помощью CS в ждущее состояние? - как работает SPI почитайте
А как пин CS может влиять на пин SCLK?
Сейчас попробовал, сработала следующая конструкция
А как пин CS может влиять на пин SCLK?
я ж вам советовал почитать про SPI... Высокий уровень на CS переводит w5500 в ждущее состояние и он освобождает SCLK (по крайней мере должен так делать)
ну раз работает....
Хотя книжки читать все равно полезно.
Высокий уровень на CS переводит w5500 в ждущее состояние и он освобождает SCLK (по крайней мере должен так делать)
Пины атмеги всё равно контроллируются spi-модулем.
Пины атмеги всё равно контроллируются spi-модулем.
значит я был неправ, а ТС предложил рабочий вариант
я ж вам советовал почитать про SPI... Высокий уровень на CS переводит w5500 в ждущее состояние и он освобождает SCLK (по крайней мере должен так делать)
CS при высоком уровне на W5500 должен перевести пин MISO в Z - состояние, а SCLK для модуля это вход, строб на нем генерирует контроллер. Но на опрос сдвигового регистра этот пин ни как не влияет, потому что выход OUT на 74hc165 заведен на свой gpio на контроллере.