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 2.0

Ethernet LAN Сетевой Модуль можно купить здесь (модуль SD SPI в подарок) ENC28J60 Ethernet LAN Сетевой Модуль.

 

 

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

 

AVR LAN. ENC28J60

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

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

  2. Дмитрий:

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

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

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

*