Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

stm32f4xx+lan8720

Пн июл 18, 2022 19:43:10

Избороздил весь мануал на stm32f407. В разделе Ethernet очень много неясного. Для начала интересует можно ли управлять чипом lan8720 из stm32f407 без линий MDC/MDIO ?
В мануале сказано что : Как тактовая линия MDC, так и линия передачи данных MDIO реализованы в качестве альтернативного функционального ввода-вывода
в микроконтроллере. Всем спасибо и мяу-мяу! :P

Re: stm32f4xx+lan8720

Вт июл 19, 2022 08:13:26

Эти две линии - управление чипом. В том числе, чтение его состояния, установка регистров и всяческая настройка.
Если я правильно помню, то чип можно предварительно настроить подтяжками на определённых пинах. В момент сброса он читает их состояние и соответствующим образом выполняет минимальную настройку, затем переходит в максимально общий режим работы - Auto_Neg / 10-100M / Auto-Duplex. Режим порта MII/RMII, обычно устанавливается в MII (как правило, но это не обязательно - подробнее лучше читать в мануале на сам чип).

То есть, без этих линий не получится принудительно настроить чип на нужную скорость, включить режим RMII (если требуется), запустить диагностику кабеля или тесты самого чипа (в том числе, заворот трафика на разных стадиях его обработки). Технически, его можно эмулировать "ногодрыгом". В каком-то чипе без наличия Ethernet модуля я подключал TLK105 и пытался заставить его выполнять диагностику кабеля. И это даже работало. Нестабильно, но работало.

danone78 писал(а):В мануале сказано что : Как тактовая линия MDC, так и линия передачи данных MDIO реализованы в качестве альтернативного функционального ввода-вывода

Да.
GPIOx->MODER, соответствующие биты портов должны быть установлены в "10" - Alternate Function
GPIOx->AFR[0/1] - соответствующие биты должны быть установлены в номер фукнции.

В вашем случае, это порты GPIOC1 - MII_MDC, GPIOA2 - MII_MDIO. Оба имеют номер функции 11 0x0B. Соответственно:
Код:
GPIOC->MODER &= 0xFFFFFFF3; // GPIOC[1] -> `00`
GPIOC->MODER |= 0x00000008; // GPIOC[1] -> `10'
GPIOC->AFR[0] &= 0xFFFFFF0F; // GPIOC[1].AFR -> `0000`
GPIOC->AFR[0] |= 0x000000B0; // GPIOC[1].AFR -> `1011` / 11
GPIOA->MODER &= 0xFFFFFFCF; // GPIOA[2] -> `00`
GPIOA->MODER |= 0x00000020; // GPIOA[2] -> `10`
GPIOA->AFR[0] &= 0xFFFFF0FF; // AFR -> `0000`
GPIOA->AFR[0] |= 0x00000B00; // AFR -> `1011` / 11

Re: stm32f4xx+lan8720

Сб июл 23, 2022 13:31:57

Пару месяцев назад разбирался, тоже пару вопросов возникло.

В чем разница между кольцевым дескриптором и связанным списком.
В ДШ написано что каждый дескриптор может содержать только один кадр, так ли это для кольцевого дескриптора ?
Тогда что помешается во втором буфере кольцевого дескриптора, продолжение кадра или же новый кадр?

Re: stm32f4xx+lan8720

Вс июл 24, 2022 05:16:20

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

В принципе их работы. Кольцо может использовать два буфера одновременно (либо только один из них, как захочет программист). В списке второй буфер ссылается на "следующий" дескриптор.
Как на изображении из Reference Manual'а:
Буфер обмена01.png
(65.32 KiB) Скачиваний: 67

В ДШ написано что каждый дескриптор может содержать только один кадр, так ли это для кольцевого дескриптора ?

Так же.
Data chaining refers to frames that span multiple data buffers. However, a single descriptor cannot span multiple frames. The DMA skips to the next frame buffer when the end of frame is detected.

Цепочка дескрипторов содержит поля с указателями на буферы данных. Тем не менее, один дескриптор не может содержать несколько фреймов. DMA переходит на следующий буфер фрейма как только детектирует конец пакета.

То есть, вы можете заполнить настроить дескрипторы в кольцо, настроить у каждого по два буфера с ненулевым размером (если размер Buffer 1 равен нулю, будет использоваться Buffer 2), но использоваться будет только Buffer 1. Либо Buffer 2, если размер Buffer 1 нулевой.

Тогда что помешается во втором буфере кольцевого дескриптора, продолжение кадра или же новый кадр?

Зависит от варианта настроек.
Первая запись в дескрипторе TDES0, биты 20 и 21:
Bit 21 TER: Transmit end of ring
When set, this bit indicates that the descriptor list reached its final descriptor. The DMA returns to the base address of the list, creating a descriptor ring.

Bit 20 TCH: Second address chained
When set, this bit indicates that the second address in the descriptor is the next descriptor address rather than the second buffer address. When TDES0[20] is set, TBS2 (TDES1[28:16]) is a “don’t care” value. TDES0[21] takes precedence over TDES0[20].

Бит 21. TER: Конец кольца передачи
Когда бит установлен, дескриптор последний в списке. DMA возвращается к базовому адресу списке, создавая кольцо.
Бит 20. TCH: Второй ардес сцеплен
Когда бит установлен, второй адрес дескриптора используется как указатель на следующий дескриптор вместо указателя на второй буфер. Когда установлен TDES0[20], TBS2 (TDES1[28:16]) игнорируются. TDES0[21] имеет приоритет над TDES0[20].

Re: stm32f4xx+lan8720

Вт сен 27, 2022 23:33:18

можно ли инициализировать PHY подключив лишь линии MDC/MDIO ? При условии, что PHY тактируется от своего CMOS генератора.

Re: stm32f4xx+lan8720

Ср сен 28, 2022 00:13:05

Да его можно инициализировать вообще ничего не подключая только конфигурациоными резисторами. Но зачем? Через MII/RMII передаются данные, а через MDC/MDIO управление PHY. Зачем что-то делать не так как задумано стандартом интерфейса?

Re: stm32f4xx+lan8720

Ср сен 28, 2022 13:58:33

дело в том что у меня вообще был полный ноль и осциллографа под рукой не оказалось. Просто проверить выходные сигналы не мог, непонятно было куда копать то-ли фи не отвечает то ли МАК не говорит. Вышел из положения немного по турецки. Соединил перемычкой сначала MDC с портА0, и во время передачи пока бит0 ETH_MACMIIAR поднят, считал состояние порта А0 битбандингом в оперативку. То же самое с MDIO. Информация несинхронизированная , но мне хватило чтобы понял что МАК что-то выдает. Потом я вроде ничего не менял, но мне наконец-то удалось получить что-то отличное от нулей. Прочитался третий регистр фи с идентификационными данными, ну и так дальше и тому подобное. Хочу оставить памятку чтобы пацанам полегче было.
stm32f407 + dp83848
читать и изменять содержимое регистров посредством Station Managment Interface можно
подключив лишь питание и mdc/mdio, при условии что PHY тактируется.
На плате PHY уже установлен CMOS генератор 50 МГц. От него сразу тактируется PHY.
Вводящая в заблуждение надпись oscin на плате PHY на самом деле означает выход
50МГц для передачи тактовых импульсов от PHY к MAC 802.3 .
MAC 802.3 должен тактироваться с двух сторон: со стороны RCC AHB stm32f407 и со стороны PHY.
Частота со стороны RCC AHB должна быть выше или равна частоте PHY.
Частота для MDC не имеет нижнего предела, верхний 2.5 МГц.
Внутри чипа dp83848 к ножке paddr0 слабое подтягивание к VCC,
поэтому начальный адрес PHY по умолчанию 0х00001.
Для работы с MAC 802.3 на stm32f407 сначала нужно настроить порты.
В режиме RMII понадобятся только:
RCC_AHB1ENR для включения тактирования MAC 802.3 со стороны stm32f407.
GPIOA_MODER
GPIOB_MODER
GPIOC_MODER для включения портов в режим альтернативной функции
GPIOA_AFRL
GPIOB_AFRL
GPIOC_AFRL для выбора альтернативной функции 11(0xb)(0b1011)
никаких дополнительных подтягиваний не нужно, все порты в режиме push-pull.
Ответить