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

Ethernet MAC на BF-537 и все вопросы про это

Вот решил создать отдельную тему.

 

Работаю с процессором недавно. Написал драйвер для своего самописного стека.

Функции драйвера:

int Init(BYTE *pMacAddr);
int CheckRx();
int TxData(DWORD *Buf, DWORD Len);
int RxData(DWORD **Buf, DWORD *Len);

 

Пока DMA настроен так: DMA передатчика работает в режиме массива дескрипторов и отправляет только один буфер.

 

DMA приемника работает в режиме больших списков, и имеет некоторый кольцевой буфер.

 

Функция CheckRx() определяет наличие принятого пакета по полю Status в дескрипторе вот так:

int bfEmac::CheckRx(void)
{
    if((RxDescBuf[RxConsumeIndex].StatusWord & RX_COMP) !=0)
        if(RxDescBuf[RxConsumeIndex].StatusWord & RX_OK)
            return 0;        // Возвращаем 0, если пакет принят
    return -1;
}

 

Функция приема RxData() после обработки пакета инкрементирует RxConsumeIndex (который не может быть больше количества дескрипторов). И возвращает указатель на принятый буфер и его длину.

 

Проблема: работает только тогда, когда один приемный дескриптор.

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

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

int bfEmac::RxData(DWORD **Buf, DWORD *Len)
{
    // определяем указатель на принятый буфер
    pETH_FRAME_BUFFER pRxEframe = (pETH_FRAME_BUFFER)RxBuf[RxConsumeIndex];
    // возвращаем указатель и длину принятых данных
    *Buf = (DWORD*)pRxEframe->Dest;
    *Len = ((RxDescBuf[RxConsumeIndex].StatusWord) & 0x7FF) + 2;
    // обнуляем статус (без этой операции дма не станет больше писать в этот буфер)
    RxDescBuf[RxConsumeIndex].StatusWord = 0;
    // инкрементируем смещение в массиве дескрипторов
    ++RxConsumeIndex;
    if(RxConsumeIndex >= RX_BUF_NUM)
            RxConsumeIndex = 0;
    return 0;
}

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


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

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

Изменено пользователем Vitaliy_ARM

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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