[i] Тест Ethernet в режиме КЗ для К1986ВЕ8Т и микросхем семейства К1986ВЕ1x
В блоке Ethernet MAC микросхем К1986ВЕ8Т и микросхем семейства К1986ВЕ1x (К1986ВЕ1Т, К1986ВЕ1QI, К1986ВЕ1FI, К1986ВЕ1GI) в блоке MAC реализован режим КЗ (loopback). С его помощью можно проверить работу с Ethernet без использования блока Ethernet PHY (блоки MAC и PHY обмениваются данными по интерфейсу MII, который в данном случае не задействован) и без внешнего подключения: блок Ethernet MAC получает те данные, которые сам же и отправляет.
Для микросхем К1986ВЕ8Т пример работы режима Loopback (на уровне Ethernet PHY) есть в составе SPL/Software Pack для Keil uVision. Адаптированный на основе данного примера проект для режима КЗ на уровне Ethernet MAC приведен в конце статьи (проект полностью аналогичен примеру Ethernet PHY loopback, за исключением включения loopback на уровне Ethernet MAC и настройки Ethernet PHY в состояние по умолчанию).Для микросхем семейства К1986ВЕ1x тест режима Loopback MAC приведен в рамках данной статьи.
1. Описание теста Ethernet MAC Loopback для микросхем семейства К1986ВЕ1x
В реализованном тесте (проект приведен в конце статьи) передаются пакеты указанного размера - размер задается макроопределением при сборке. Также макроопределениями задаются режим работы буферов Ethernet MAC (линейный, автоматический или FIFO) и параметры выводов (для возможности перенастройки при необходимости) светодиодной индикации статуса тестирования: LED_OK - индикация успешной работы, LED_ERROR - индикация при обнаружении расхождения между переданными и полученными данными.
Используются выводы PD10 для LED_OK и PD11 для LED_ERROR, которые на отладочной плате для микросхем К1986ВЕ1Т подключены к светодиодам VD9 и VD10 соответственно.
Передатчик формирует и отправляет кадр, приемник получает его и сравнивает полученные данные с переданными.
Передатчик в первые 4 байта Payload (см. статью "[i] Начальные сведения о Ethernet") записывает индекс кадра. В последние 4 байта записывается "индикатор" конца данных (0x7777_7777). При анализе данных в памяти (в линейном и автоматическом режиме работы буферов) это позволяет видеть, где заканчиваются данные и начинается статус передачи (в памяти передатчика) или слово CRC (в памяти приемника).
Приемник получает пакет и сравнивает массивы переданных и полученных данных. Если данные совпадают - моргает светодиод LED_OK, если не совпадают - светодиод LED_ERROR. Тест осуществляется циклически. Поэтому, если после неправильно полученного пакета и индикации LED_ERROR следующий пакет отправлен и получен корректно, будет индикация на LED_OK (без индикации на LED_ERROR). При правильном выполнении теста должен постоянно мигать LED_OK, показывая, что кадры посылаются и принимаются.
На рисунке 1 показано, как выглядят данные в буферах при передаче и приеме кадра для микросхем семейства К1986ВЕ1x в линейном режиме работы (для автоматического режима выглядит аналогично).
Рисунок 1 - Память буфера передатчика и приемника в линейном режиме
2. Особенности работы для микросхем семейства К1986ВЕ1x
При просмотре памяти в режиме отладки необходимо учитывать ошибку errata 0014 "Возникновение Hard Fault в режиме run time при отображении содержимого периферии". В качестве обхода в среде Keil uVision можно после перехода в режим отладки снять опцию Periodic Window Update в меню View.
При работе в линейном режиме также следует учитывать, что для регистров R_Head и X_Tail нет аппаратной защиты от записи неправильных значений (исключение - микросхемы К1986ВЕ1QI, см. ниже). Например, если записать X_Tail = 0, то регистр действительно станет равен 0 вне зависимости от значения Delimiter. Поэтому при реализации своего алгоритма необходимо обеспечить в коде запись корректных значений. В рамках SPL это уже реализовано.
3. Особенности работы для микросхем К1986ВЕ1QI
3.1. Ограничения при работе буферов в автоматическом режиме и режиме FIFO
Для микросхем К1986ВЕ1QI с датой изготовления до 1645 нужно учитывать наличие ошибки errata 0021 "Ограничения при работе буферов контроллера Ethernet в автоматическом режиме и режиме FIFO". Пояснения причин данного поведения приведены ниже.
Передатчик начинает выдачу данных сразу, как только обнаруживает различие указателей X_Head и X_Tail. При работе буферов в линейном режиме сначала записываются данные в буфер передатчика, и после этого должна осуществляться запись в регистр X_Tail. При записи в регистр X_Tail передатчик обнаруживает разницу в указателях X_Head и X_Tail и начинает передачу кадра. Таким образом, на момент начала передачи все данные уже находятся в памяти. По окончании передачи передатчик записывает в регистр X_Head адрес первой свободной ячейки, то есть указатели становятся равны (X_Head == X_Tail). Если регистры оказываются не равны, значит, что-то прошло нештатно.В автоматическом режиме и режиме FIFO указатель X_Tail инкрементируется автоматически при записи каждого слова в буфер. Соответственно, при первой же записи слова в буфер Ethernet регистр X_Tail "обгоняет" X_Head - передатчик обнаруживает запрос на передачу и начинает выдавать данные. Здесь соревнуются два потока - исполняемая функция записывает данные в буфер, а передатчик считывает данные и передает (именно в этом проявляется данная ошибка). И для микросхем К1986ВЕ1QI с датой изготовления до 1645 при частоте ядра меньше 144 МГц передатчик считывает данные быстрее, чем микроконтроллер успевает их записывать.
Передатчик, считав в первом слове количество данных на отправку, начинает передавать данные в линию, пока не достигнет X_Tail. Но перед достижением X_Tail ему еще необходимо записать в буфер статус отправки. В итоге передаваемый пакет уходит поврежденным. Если при этом X_Tail продолжает инкрементироваться (то есть ядро все еще дописывает пакет), то возникнет еще одна передача.
Регистры X_Head и R_Tail доступны только для чтения и сбрасываются автоматически при записи в регистр ETH_Delimiter в функции ETH_DeInit(). Регистры X_Tail и R_Head доступны на запись и чтение в линейном режиме.
При тактировании кварцевым резонатором на 8 МГц (как это сделано, например, на отладочной плате микросхем К1986ВЕ1Т) максимальная частота, которую можно получить после умножения с помощью PLL, составляет 128 МГц, и на такой частоте в режимах работы буферов, отличных от линейного, тест на микросхемах К1986ВЕ1QI с датой изготовления до 1645 не выполнится.
3.2. Запись в регистры указателей в линейном режиме работы
Как указано выше, в линейном режиме работы буферов для регистров R_Head и X_Tail нет аппаратной защиты от записи неправильных значений. Это применимо для микросхем К1986ВЕ1QI с датой изготовления от 1645. Для микросхем К1986ВЕ1QI с датой изготовления до 1645 защита этих регистров присутствует: например, при записи X_Tail = 0, значение X_Tail станет равно ETH_Delimiter.
Сохранить статью в PDF