24416

Тест Ethernet в режиме КЗ для 1986ВЕ1Т, 1986ВЕ3Т

Дата последнего изменения: 08.09.2020 09:38:08

Тест реализован и проверен на следующих ревизиях микроконтроллеров:

  • 1986ВЕ1Т - ревизия 4 и 6
  • 1986ВЕ3Т - ревизия 2

Описание теста: В данном тесте передаются пакеты с постоянно увеличивающейся длиной. Кроме этого в тесте перебираются все три режима работы с буферами - линейный, автоматический и FIFO. Включен режим КЗ, то есть данные не уходят в блок PHY. Блок МАС передает то, что сам посылает.

Так как блоки МАС и PHY общаются по интерфейсу MII, то в данном случае этот интерфейс не задействован.

Код проекта доступен для скачивания в конце статьи. 

Проекты для проверки реального соединения микроконтроллеров, расположенных на отладочных платах, по кабелю доступны там же:

3.2--- Ethernet_VE1_VE3-master (1986ВЕ1Т-1986ВЕ3Т)

3.3-Ethernet_VE1_VE8-master (1986ВЕ1Т-1986ВЕ8Т)

После включения питания загорается первый светодиод на демоплате. Это диод показывает, в каком режиме работают буферы при последующем запуске Ethernet. А именно:

  • LED1 - линейный;
  • LED2 - автоматический;
  • LED3 - FIFO.

Программа ожидает нажатия кнопок. Варианты:

  • LEFT (KEY1 для ВЕ8) - сменить режим. Последовательными нажатиями выбираем необходимый режим, ориентируясь на LED1 - LED3.
  • UP (KEY2 для ВЕ8) - запуск теста. Будет настроен блок Ethernet и начнется обмен.

Перед запуском выбранный режим сохраняется в регистре BKP_REG0. Этот регистр не сбрасывается при Reset. Таким образом, после Reset происходит возврат в установленный режим и можно сразу нажать UP для запуска обмена.

При тесте передаются кадры(фреймы) длиной от FRAME_LEN_MIN до FRAME_LEN_MAX, по REPEAT_FRAME_LEN_COUNT раз для каждой длины.

#define FRAME_LEN_MIN 64
#define FRAME_LEN_MAX 1514
#define REPEAT_FRAME_LEN_COUNT 5
#define LED_FRAME_PERIOD 1000

Передатчик формирует и отправляет кадр, а приемник получает его. Каждая передача и прием считаются, для индикации работы переключаются светодиоды:

  • LED1 - через LED_FRAME_PERIOD отправленных кадров;
  • LED2 - через LED_FRAME_PERIOD принятых кадров.

Передатчик в первые 4 байта Payload записывает индекс кадра. В последние два байта автор проекта записывает импровизированный индикатор конца данных - байт 0xFF и байт текущей длины кадра. При анализе данных в памяти это позволяет видеть, где заканчиваются данные и начинается статус передачи (в памяти передатчика) или слово CRC (в памяти приемника).

Приемник получает кадр и проверяет следующие параметры:

  • Длина кадра - при ошибке загорается LED3.
  • Индекс кадра - при ошибке загорается LED4.
  • Данные кадра - при ошибке загорается LED5.
  • Равенство указателей (R_Head == R_Tail) и (X_Head == X_Teail), ошибка на LED6.

При правильном исполнении теста должны мигать только светодиоды LED1 и LED2, показывая, что кадры посылаются и принимаются. Если загораются другие светодиоды, значит, произошла соответствующая ошибка. Стереть текущие ошибки (погасить светодиоды) можно, нажав на кнопку RIGHT (KEY3 для 1986ВЕ8Т).

  • Кнопки LEFT и UP (KEY1, KEY2) в тесте не участвуют, они нужны только при запуске.

Далее представлены результаты запуска теста для перечисленных микроконтроллеров.

Результат в 1986ВЕ1Т

В 6-й ревизии тест отрабатывает успешно для всех длин кадров и режимов - линейного, автоматического и FIFO.

В 4-й ревизии тест отрабатывает успешно для всех длин кадров только в линейном режиме работы буферов. На рисунке 1 показано, как выглядят данные в буферах при передаче и приеме одного кадра.

Рисунок 1 - Память буфера передатчика и приемника в линейном режиме

Как можно видеть, при успешной передаче регистры X_Head/X_Tail и R_Head/R_Tail имеют согласованные (равные) значения. Это говорит о правильной работе передатчика и приемника.

В остальных режимах - автоматическом и FIFO - сказалась ошибка из errata:

"0021 При работе буферов Ethernet контроллера в автоматическом режиме и режиме FIFO ядро не успевает записывать данные в буферы при работе на частоте менее 144МГц. …"

Дело в том, что передатчик начинает выдачу сразу, как только обнаруживает различие указателей X_Head и X_Tail. Работая в линейном режиме, нужно сначала записать данные в буфер Ethernet, а затем прописать регистр X_Tail. При этой записи передатчик обнаруживает разницу в регистрах и начинает передачу кадра. Таким образом, на момент начала передачи все данные уже лежат в памяти. По окончании передачи передатчик записывает в регистр X_Head адрес первой свободной ячейки, то есть указатели становятся равны (X_Head == X_Tail). Если регистры оказываются не равны, значит, что-то прошло не штатно.

В автоматическом и FIFO режиме, при записи данных в буфер, указатель X_Tail инкрементируется автоматически при записи каждого слова. Соответственно, при первой же записи слова в буфер Ethernet регистр X_Tail обгоняет X_Head - передатчик обнаруживает запрос на передачу и начинает выдавать данные. Здесь соревнуются два потока - исполняемая функция записывает данные в буфер, а передатчик считывает данные и передает. В таком случает сказывается ошибка из errata. Получается, что для 1986ВЕ1Т при частоте ядра меньше 144МГц передатчик считывает данные быстрее, чем микроконтроллер успевает их записывать.

Передатчик, считав в первом слове количество данных на отправку, начинает передавать данные в линию пока не достигнет X_Tail. Но перед X_Tail ему еще необходимо записать в буфер статус отправки. В итоге, пакет, передаваемый в линию, уходит битый. Если при этом X_Tail продолжает инкрементироваться, то есть ядро все еще дописывает фрейм, то возникнет еще одна передача.

Регистры X_Head и R_Tail доступны только для чтения и сбрасываются автоматически при присвоении регистра ETH_Delimeter в функции ETH_DeInit(). Регистры X_Tail и R_Head доступны на запись и чтение в линейном режиме.

Примечание: На отладочной плате установлен кварцевый резонатор на 8МГц, поэтому при максимальном умножением PLL (х16) можно получить частоту 128МГц. На такой частоте тест для микроконтроллера 4 ревизии не выполняется (ошибка 0021 errata).

Автоматический режим

Обмен портится на первом же кадре (рисунок 2).

Рисунок 2 - Память буферов передатчика и приемника в автоматическом режиме

На рисунке 2 показана память буферов передатчика и приемника. Как можно видеть, передатчик догнал X_Tail и послал первую часть кадра - в приемнике вертикальная черная линия с цифрой 1. Передатчик дописал поле CRC (жирная зеленая линия).

Потом в буфер передатчика были дописаны ядром оставшиеся данные фрейма, и передатчик выслал оставшиеся данные - черная линия с цифрой 2. Эти данные затерли начало данных предыдущего фрейма в приемнике, поскольку регистр R_Tail продолжал указывать на начало буфера.

В итоге, в памяти передатчика данные лежат верные, а в приемнике - нет. При этом регистры X_Head/X_Tail и R_Head/R_Tail имеют несогласующиеся значения, при дальнейшей передаче данных ситуация будет только хуже.

Режим FIFO

В режиме FIFO для микроконтроллеров младше 6 ревизии при работе на частоте, отличной от 144МГц, можно передать и принять успешно несколько фреймов. Запись данных исполняется быстрее, чем это делалось ядром в автоматическом режиме, но в итоге обмен все равно ломается - наблюдается рассогласование регистров X_Head/X_Tail и R_Head/R_Tail. 

Разница ревизий 4 и 6

В 6-й ревизии 1986ВЕ1Т нет аппаратной защиты регистров R_Head и X_Tail от записи неправильных значений в линейном режиме.

Так, например, если в 6-й ревизии вызвать X_Tail = 0, то регистр действительно станет равен 0. В 4-й же ревизии при записи X_Tail = 0, X_Tail станет равен Delimeter, как и должно быть.

Текущий код SPL работает с этими указателями некорректно - возникает ситуация, когда вызывается X_Tail = 0 и R_Head = 0х1000, при Delimeter = 0х1000. Это делать нельзя. В 4-й ревизии эта некорректная работа нивелировалась аппаратной защитой регистров, и значения получались правильными, поэтому все работало.

Если при переходе на 6-ю ревизию 1986ВЕ1Т Ваш рабочий проект перестал работать - проверьте работу с указателями R_Head и X_Tail.

Результат в 1986ВЕ3Т

Проблема блока Ethernet в 1986ВЕ3Т проявилась в том, что указатели передатчика иногда неправильно обрабатывают конец буфера. Такая ситуация возникает периодически. На рисунке 3 показано состояние регистров и памяти.

Рисунок 3 - Состояние регистров и памяти в 1986ВЕ3Т

Возникло состояние, когда передатчик должен был записать статус передачи в последнюю ячейку буфера Ethernet, но по каким-то причинам не смог это сделать. Кроме этого, отсылаемые данные передатчик должен был закончить посылкой CRC, но CRC тоже не послал. Такой поведение возникает время от времени. При отладке это состояние отрабатывалось правильно через раз. Первый раз статус записывался в последнюю ячейку и пакет принимался верно, а на следующем проходе - статус не записывался и пакет ломался. Если перед сбойной отправкой пакета намеренно в отладчике передвинуть регистр X_Tail на одну позицию (X_Tail = 0х1004), то статус запишется в ячейку 0х1000, и CRC придет верно. Это говорит о том, что проблема именно с записью статуса отправки в последнюю ячейку буфера Ethernet, если X_Tail находится в следующей (начальной) ячейке буфера. Если следом лежит еще один кадр (фрейм) (X_Tail не указывает на начало буфера), то проблем не будет!

Решить проблему помогло выравнивание регистров R_Head и R_Tail после вторичной посылки кадра:

uint32_t CheckBuffPTR(void)
{
  uint32_t ErrCnt = 0;
 
 if (ETHERNET_X->ETH_R_Head != ETHERNET_X->ETH_R_Tail)
 {
  #ifdef USE_VE3_BUG_PTR_FIX
  ETHERNET_X->ETH_R_Head = ETHERNET_X->ETH_R_Tail;
  #endif ErrCnt++;
 }
 if (ETHERNET_X->ETH_X_Head != ETHERNET_X->ETH_X_Tail)
 {
 // ETHERNET_X->ETH_X_Tail = ETHERNET_X->ETH_X_Head; // Перекрывается обработкой ETH_R_Head
 ErrCnt++;
 }
return !ErrCnt;
}

При следующей посылке кадра X_Tail сдвигается на длину следующего кадра, и тогда передатчик уже справляется с записью статуса и меняет значение X_Head. Но при этом принимается неправильный пакет, при котором происходит рассогласование указателей приемника.

Выравнивание указателей помогло в выполнении рассматриваемого теста. Светодиоды покажут ошибку, пакет текущей длины будет передан еще раз и уже успешно. Правильная работа обмена продолжится дальше до возникновения следующей сбойной ситуации записи в последнюю ячейку буфера Ethernet. В тесте при зажигании светодиодов ошибок необходимо нажать кнопку RIGHT, это сбросит индикацию и покажет, что следующие данные передаются без ошибок.

Без выравнивания указателей тест ломается очень быстро, и дальнейший обмен не происходит - тест "зависает" в ожидании приема пакета. То есть передатчик фрейм отправил, но приемник данных не видит - указатели R_Head и R_Tail равны. По картинке видно, что до первого сбоя было передано 0х0386 фреймов (902 в десятеричной системе).

Линейный режим

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

#define FRAME_LEN_MAX 1514
// Выравнивание указателей позволяет правильно принимать следующий пакет!
// Для линейного и FIFO, мешает в Auto
#define USE_VE3_BUG_PTR_FIX

Режим FIFO

В режиме FIFO с выравниванием указателей передаются кадры длиной до порядка 850 байт. При передаче кадров большей длины обмен ломается - тест "зависает" в ожидании приема пакета.

#define FRAME_LEN_MAX 850 //1514
// Выравнивание указателей позволяет правильно принимать следующий пакет!
// Для линейного и FIFO, мешает в Auto
#define USE_VE3_BUG_PTR_FIX

Автоматический режим

В автоматическом режиме выравнивание указателей USE_VE3_BUG_PTR_FIX мешает, обмен "зависает" в ожидании приема пакета.

В режиме без выравнивания обмен данными происходит, но высвечиваются все ошибки. До первой ошибки передается 180 фреймов (0хB4). От длины фрейма зависимость не выявлена. Состояние первого сбоя показано на рисунке 4.

Рисунок 4 - Буферы приемника и передатчика 1986ВЕ3Т в автоматическом режиме

Видно, что в буфере передатчика данные лежат правильно. Но, как и в случае с режимом авто для 1986ВЕ1Т, это не гарантирует, что пакет не был послан не один раз.

Смена режима буферов в ходе программы

На 1986ВЕ1Т 6-й ревизии удалось сбрасывать контроллер Ethernet и перенастраивать его в новом режиме работы буферов по ходу работы программы. 

Выводы по режиму КЗ

1986ВЕ1

  • Ревизия 6 - Работать можно в любом режиме с кадрами любого размера.
  • Ревизия 4 - Без частоты 144МГц, работать можно только в линейном режиме. При 144МГц требуется проверка.

1986ВЕ3 (ревизия 2 - ошибка 30 в errata "Ошибка передачи фрейма при возникновении условия записи статуса отправки в последнее слово буфера передатчика Ethernet")
  • Есть аппаратная проблема работы с указателями передатчика на конце буфера данных.
  • В линейном режиме требуется выравнивание указателей приемника при рассогласовании. Пакеты периодически посылаются битые.
  • В режиме FIFO требуется выравнивание указателей приемника при рассогласовании. 
Ошибка исправлена в микросхемах 1986ВЕ3Т 3(третьей) ревизии.



Сохранить статью в PDF

Файлы для скачивания

Документация

Программное обеспечение

Standard Peripherals Library + software pack для Keil MDK 5
Standard Peripherals Library + software pack для Keil MDK 5
ОФИЦИАЛЬНАЯ СБОРКА
Standard Peripherals Library – библиотека для микроконтроллеров.

Теги

Была ли статья полезной?