Перейти к содержанию
    

ADSP-BF607 проблема с EMAC

Всем привет, срочно нужна помощь. Проблема такая.. в процессе приема пакетов в далеко не перегруженной сети постоянно переполняется внутреннее FIFO (128 байт) в модуле EMAC, с последующим выпадением бита OVF в REG_EMACx_DMA_STAT. Сначала были подозрения что происходит пропуск прерывания(-ий) по статусу, но этот вариант отпал т.к. поллинг бита готовности данных в главном цикле (REG_EMAC0_DMA_STAT) дает такой же результат. Перепробовал все возможные настройки регистров - результат 0. Флаг переполнения появляется довольно хаотично, но в среднем на каждом 4 пакете. DMA исправно заполняет цепочку буферов из 10 дескрипторов, переходит на первый и т.д. пока не возникает переполнение и следующий пакет оказывается нулевой длины. В самом проекте других прерываний кроме статуса EMAC нет, проект полностью во внутренней памяти, оси нет, загрузка другими задачами отсутствует,принятые принятые данные просто отбрасываются. Настройки обычные: проект в Core 0 (Core 1 не запущен), RMII, Chain на 10 дескрипторов, 100Мбит, full duplex. Мозги кипят уже 3-ю неделю, может это болезнь нового процессора или может есть у кого пример работающего драйвера? В самом CCES имеется код драйвера gemac, в нем подключен cdefbf609.h проект компилируется, но не работает так как адреса в структуре ADI_EMAC_REGISTERS не подходят для BF-60x. Другой пример lwip полностью запрятан в dlb библиотеки и что там происходит внутри неизвестно... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Флаг OVF на периферийном DMA появляется в ситуации когда канал DMA не может занять шину памяти для выгрузки данных набранных в буфер.

Так как других DMA нет и судя по всему пропускная способность шины памяти не превышена, то скорее всего во время работы DMA вы усиленно пишите/читаете внутреннюю память ядром, а приоритеты доступа к памяти не меняли (по дефолтным настройкам приоритет у ядра и DMA ждет когда ядро освободит шину).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...скорее всего во время работы DMA вы усиленно пишите/читаете внутреннюю память ядром, а приоритеты доступа к памяти не меняли (по дефолтным настройкам приоритет у ядра и DMA ждет когда ядро освободит шину).

Главный цикл состоит только из этого:

while(1)

{

HL1_TOGGLE;

if(lcount!=count) {

count=lcount; // lcount modified in interrupt

_print("pkt_count=",count," entry_num=",icount); }

}

Вопрос в том как повысить приоритет DMA и почему по дефолту он такой низкий? C помощью регистров связанных с ЕМАС DMA это сделать невозможно. Изменить приоритет ядра также нет возможности. Но между МАС модулем и ядром имеется System Crossbar который обеспечивает "Programmable bus arbitration model for bandwidth and latency management". Тут в наличии всего два регистра SCB_ARBRn и SCB_ARBWn, что с ними делать и что туда записывать разобраться я так и не смог.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...