Урок 40
Часть 5
LAN. ENC28J60
В предыдущей части нашего урока мы закончили инициализацию микросхемы, а также написали ещё некоторые нужные функции.
Создадим также функцию чтения фрейма чуть выше функции net_poll
//———————————————————
void eth_read(enc28j60_frame_ptr *frame, uint16_t len)
{
}
//———————————————————
Тип протокола в кадре передаётся в перевёрнутом виде, не так как обычно, в формате big endian. Поэтому напишем определённый дефайн для преобразогвания в файле net.h
} enc28j60_frame_ptr;
//——————————————
#define be16toword(a) ((((a)>>8)&0xff)|(((a)<<8)&0xff00))
В файле net.c добавим глобальный строковый массив
#include «net.h»
//———————————————
char str1[60]={0};
Добавим код в функцию eth_read, который выведет в терминальную программу адрес источника, отправившего кадр, адрес приёмника и тип протокола (пока в цифровом виде)
void eth_read(enc28j60_frame_ptr *frame, uint16_t len)
{
if(len >= sizeof(enc28j60_frame_ptr))
{
sprintf(str1,«%02X:%02X:%02X:%02X:%02X:%02X-%02X:%02X:%02X:%02X:%02X:%02X; %d; %04X»,
frame->addr_src[0],frame->addr_src[1],frame->addr_src[2],frame->addr_src[3],frame->addr_src[4],frame->addr_src[5],
frame->addr_dest[0],frame->addr_dest[1],frame->addr_dest[2],frame->addr_dest[3],frame->addr_dest[4],frame->addr_dest[5],len,be16toword(frame->type));
USART_TX((uint8_t*)str1,strlen(str1));
USART_TX((uint8_t*)«\r\n»,2);
}
}
В файле enc28j60.h добавим прототип функции enc28j60_packetReceive
void enc28j60_ini(void);
uint16_t enc28j60_packetReceive(uint8_t *buf, uint16_t buflen);
В файле net.c в функции обработки приёма и передачи из микросхемы net_poll добавим код для приёма информации из буфера чтения
enc28j60_frame_ptr *frame = (void*)net_buf;
while((len = enc28j60_packetReceive(net_buf, sizeof(net_buf))))
{
eth_read(frame, len);
}
Наконец-то мы соберём код и прошьём контроллер, а то, я думаю все уже соскучились и хотят увидеть хоть какой-то результат нашей работы.
Запустим терминальную программу и увидим определённые строки, которые покажут нам адрес источника, пославший широковещательный запрос, также широковещательный адрес, так как наш физический адрес ещё неизвестен ни одному сетевому устройству (кстати модуль у меня подключен в общую сеть, в котором находятся несколько различных устройств), а также видим мы длину фрейма и идентификатор протокола
В следующей части нашего урока мы напишем функцию приёма кадров канального уровня и проверим её на практике в терминальной программе.
Предыдущая часть Программирование МК AVR Следующая часть
Техническая документация:
Документация на микросхему ENC28J60
Перечень ошибок ENC28J60 (Errata)
Приобрести плату Atmega 328p Pro Mini можно здесь.
Приобрести программатор USBASP USBISP с адаптером можно здесь USBASP USBISP 3.3 с адаптером
Ethernet LAN Сетевой Модуль можно купить здесь ENC28J60 Ethernet LAN Сетевой Модуль.
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добрый день! Почему-то широковещательного адреса нет ни в одной посылке. И индикатор протокола при каждой посылке всегда новый (0800 или 0806 не встречается вообще). Длина фрейма всегда максимальная(512). Подключение к маршрутизатору, в сети так же несколько устройств.
Нееее…. Не дорос я ещё до этого… Опять китайская грамота.