AVR Урок 40. LAN. ENC28J60. Часть 5



 

Урок 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);

}

 

Наконец-то мы соберём код и прошьём контроллер, а то, я думаю все уже соскучились и хотят увидеть хоть какой-то результат нашей работы.

Запустим терминальную программу и увидим определённые строки, которые покажут нам адрес источника, пославший широковещательный запрос, также широковещательный адрес, так как наш физический адрес ещё неизвестен ни одному сетевому устройству (кстати модуль у меня подключен в общую сеть, в котором находятся несколько различных устройств), а также видим мы длину фрейма и идентификатор протокола

 

image00

 

В следующей части нашего урока мы напишем функцию приёма кадров канального уровня и проверим её на практике в терминальной программе.

 

 

Предыдущая часть Программирование МК AVR Следующая часть

 

 

Техническая документация:

Документация на микросхему ENC28J60

Перечень ошибок ENC28J60 (Errata)

 

 

Приобрести плату Atmega 328p Pro Mini можно здесь.

Приобрести программатор USBASP USBISP с адаптером можно здесь USBASP USBISP 3.3 с адаптером

Ethernet LAN Сетевой Модуль можно купить здесь ENC28J60 Ethernet LAN Сетевой Модуль.

 

 

Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)

AVR LAN. ENC28J60

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

AVR LAN. ENC28J60

2 комментария на “AVR Урок 40. LAN. ENC28J60. Часть 5
  1. Дмитрий:

    Добрый день! Почему-то широковещательного адреса нет ни в одной посылке. И индикатор протокола при каждой посылке всегда новый (0800 или 0806 не встречается вообще). Длина фрейма всегда максимальная(512). Подключение к маршрутизатору, в сети так же несколько устройств.

  2. Дмитрий:

    Нееее…. Не дорос я ещё до этого… Опять китайская грамота.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*