реклама на сайте
подробности

 
 
> Не стартует DMA в LPC2148.
Vova_Minsk
сообщение Sep 25 2007, 08:05
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 8-03-07
Пользователь №: 25 975



Передача организована в bulk режиме. Без использования DMA все передается нормально. При инициализации DMA ошибок не выдает, но переходит в IDLE MODE и ничего не отсылает. Использую кейловский стек, драйвер генерировал в DriverStudio 2.7.

Dd.BufAdr = (DWORD)DataBuf;
Dd.BufLen = 512;
Dd.MaxSize = USB_MAX_PACKET0; // 64 байта
Dd.Cfg.Val = 0;
USB_DMA_Setup (USB_ENDPOINT_IN(5), &Dd))
USB_DMA_Enable(USB_ENDPOINT_IN(5));
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
3m-soft
сообщение Sep 25 2007, 08:58
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Ну а на LPC2148 данные от хоста приходят? Не приходят только на комп?
Go to the top of the page
 
+Quote Post
Vova_Minsk
сообщение Sep 25 2007, 09:08
Сообщение #3





Группа: Новичок
Сообщений: 9
Регистрация: 8-03-07
Пользователь №: 25 975



Без ДМА работает и прием и передача, а при настройке ДМА на передачу в хост, передача не стартует. Прием работает без изменений.
Go to the top of the page
 
+Quote Post
3m-soft
сообщение Sep 25 2007, 09:13
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Как я понимаю даташитом ты вооружен. У меня была такая же проблема. Посмотри команду
Set Mode (Command: 0xF3, Data: write 1 byte)
Бит 5 INAK_BI Interrupt on NAK for Bulk IN endpoints:
0 Only successful transactions generate an interrupt.
1 Both successful and NAKed IN transactions generate interrupts.

Поставь этот бит в единицу и попробуй.
Go to the top of the page
 
+Quote Post
Vova_Minsk
сообщение Sep 25 2007, 09:56
Сообщение #5





Группа: Новичок
Сообщений: 9
Регистрация: 8-03-07
Пользователь №: 25 975



Цитата(3m-soft @ Sep 25 2007, 12:13) *
Как я понимаю даташитом ты вооружен. У меня была такая же проблема. Посмотри команду
Set Mode (Command: 0xF3, Data: write 1 byte)
Бит 5 INAK_BI Interrupt on NAK for Bulk IN endpoints:
0 Only successful transactions generate an interrupt.
1 Both successful and NAKed IN transactions generate interrupts.

Поставь этот бит в единицу и попробуй.


Попробовал. Теперь контроллер выходит в прерывание по конечной точке с сообщением DMA IN EP - Error. В даташите сказано, что эта ошибка возникает в случаи неправильного дескриптора ДМА.
Скажите, правильно ли я его инициализировал?

Dd.BufAdr = (DWORD)DataBuf;
Dd.BufLen = 512;
Dd.MaxSize = USB_MAX_PACKET0; // 64 байта
Dd.Cfg.Val = 0;
USB_DMA_Setup (USB_ENDPOINT_IN(5), &Dd))
USB_DMA_Enable(USB_ENDPOINT_IN(5));
Go to the top of the page
 
+Quote Post
3m-soft
сообщение Sep 25 2007, 10:03
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Так как я не знаю какое описание структуры у тебя, то я лучше покажу как у меня:

typedef __packed struct _USB_DMA_DESCRIPTOR
{
void* next_dd; // Указатель на следующий DMA дескриптор
__packed union
{ // DMA конфигурация
__packed struct
{
WORD atle : 1; // Включение режима ATLE (Auto Transfer Length Extract)
WORD reserved1 : 1; // Зарезервировано
WORD link : 1; // Указатель на следующий DMA дескриптор правильный
WORD reserved2 : 1; // Зарезервировано
WORD isochronous : 1; // Признак изохронной передачи
WORD max_packet_size : 11; // Максимальный размер пакета
} bit;
WORD value;
} dd_config;
WORD dma_buffer_length; // Размер DMA буфера
BYTE* dma_buffer; // Указатель на DMA буфер
__packed union
{ // Статус DMA дескриптора
__packed struct
{
WORD retired : 1; // Обработка дескриптора закончена
WORD status : 4; // Текущий статус обработки дескриптора
WORD packet_valid : 1; // Последний переданный пакет обработан без ошибок
WORD ls_byte_extracted : 1; // Младший байт из dma_buffer_length выбран (только для ATLE режима)
WORD ms_byte_extracted : 1; // Старший байт из dma_buffer_length выбран (только для ATLE режима)
WORD position : 6; // Позиция внутри пакета (только для ATLE режима)
WORD reserved : 2; // Зарезервировано
} bit;
WORD value;
} dd_status;
WORD present_count; // Текущее количество переданных байт
} USB_DMA_DESCRIPTOR, *PUSB_DMA_DESCRIPTOR;

void dd_init(PUSB_DMA_DESCRIPTOR _dd)
{
_dd->dd.next_dd=0;
_dd->dd.dd_config.value=0;
_dd->dd.dd_config.bit.max_packet_size=64;
_dd->dd.dma_buffer=buffer_pointer;
_dd->dd.dma_buffer_length=DMABUFFER_SIZE;
_dd->dd.dd_status.value=0;
_dd->dd.present_count=0;
}
Go to the top of the page
 
+Quote Post
Vova_Minsk
сообщение Sep 25 2007, 10:34
Сообщение #7





Группа: Новичок
Сообщений: 9
Регистрация: 8-03-07
Пользователь №: 25 975



Цитата(3m-soft @ Sep 25 2007, 13:03) *
Так как я не знаю какое описание структуры у тебя, то я лучше покажу как у меня:

void dd_init(PUSB_DMA_DESCRIPTOR _dd)
{
_dd->dd.next_dd=0;
_dd->dd.dd_config.value=0;
_dd->dd.dd_config.bit.max_packet_size=64;
_dd->dd.dma_buffer=buffer_pointer;
_dd->dd.dma_buffer_length=DMABUFFER_SIZE;
_dd->dd.dd_status.value=0;
_dd->dd.present_count=0;
}


у меня все так же.
Скажите, а чему у вас равен buffer_pointer. Т.е. передаваемый буфер должен находиться в какой-то определенной области памяти, или нет?
Go to the top of the page
 
+Quote Post
3m-soft
сообщение Sep 25 2007, 11:11
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Ну конечно буфер должен располагаться в USB_RAM

// Определения для USB RAM
#define USB_RAM_ADDR 0x7FD00000 // Стартовый адрес USB RAM
#define USB_RAM_SIZE 0x00002000 // Размер USB RAM (8kB)

Собственно как и сам дескриптор тоже должен быть в этой области

Сообщение отредактировал 3m-soft - Sep 25 2007, 11:12
Go to the top of the page
 
+Quote Post
Vova_Minsk
сообщение Sep 25 2007, 11:19
Сообщение #9





Группа: Новичок
Сообщений: 9
Регистрация: 8-03-07
Пользователь №: 25 975



Цитата(3m-soft @ Sep 25 2007, 14:11) *
Ну конечно буфер должен располагаться в USB_RAM

// Определения для USB RAM
#define USB_RAM_ADDR 0x7FD00000 // Стартовый адрес USB RAM
#define USB_RAM_SIZE 0x00002000 // Размер USB RAM (8kB)

Собственно как и сам дескриптор тоже должен быть в этой области



У меня буфер обявлен вот так:
#pragma arm section zidata = "USB_RAM"
//DWORD InfoBuf[P_C]; /* Packet Info Buffer */
unsigned char DataBuf[B_S]; /* Data Buffer */
#pragma arm section zidata

но DataBuf все равно лежит по адресу 0х40000000, я не нашел нигде ссылки на значение USB_RAM. Как указать линкеру нужный адрес?
Go to the top of the page
 
+Quote Post
3m-soft
сообщение Sep 25 2007, 11:31
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Файл: Project.sct

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x00080000 { ; load region
ER_IROM1 0x00000000 { ; load address = execution address
*.o (RESET, +First)
* (+RO)
}
RW_IRAM1 0x40000000 0x00008000 { ; RW data
* (+RW +ZI)
}
RW_USBRAM 0x7FD00000 0x00002000 {
*.o (USB_RAM)
}
}

А это например в проге:

#pragma arm section zidata="USB_RAM"
PUSB_DMA_DESCRIPTOR UDCA[USB_EP_COUNT]; // Массив указателей на DMA дескрипторы для всех (32) конечных точек
BYTE dma_buffer[DMABUFFER_SIZE];
USB_DMA_DESCRIPTOR in_dd;
#pragma arm section zidata

Сообщение отредактировал 3m-soft - Sep 25 2007, 11:54
Go to the top of the page
 
+Quote Post
Vova_Minsk
сообщение Sep 25 2007, 12:30
Сообщение #11





Группа: Новичок
Сообщений: 9
Регистрация: 8-03-07
Пользователь №: 25 975



Цитата(3m-soft @ Sep 25 2007, 14:31) *
Файл: Project.sct

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x00080000 { ; load region
ER_IROM1 0x00000000 { ; load address = execution address
*.o (RESET, +First)
* (+RO)
}
RW_IRAM1 0x40000000 0x00008000 { ; RW data
* (+RW +ZI)
}
RW_USBRAM 0x7FD00000 0x00002000 {
*.o (USB_RAM)
}
}

А это например в проге:

#pragma arm section zidata="USB_RAM"
PUSB_DMA_DESCRIPTOR UDCA[USB_EP_COUNT]; // Массив указателей на DMA дескрипторы для всех (32) конечных точек
BYTE dma_buffer[DMABUFFER_SIZE];
USB_DMA_DESCRIPTOR in_dd;
#pragma arm section zidata


Все заработало. Спасибо за ценные советы. a14.gif
Go to the top of the page
 
+Quote Post
Vova_Minsk
сообщение Oct 29 2007, 13:59
Сообщение #12





Группа: Новичок
Сообщений: 9
Регистрация: 8-03-07
Пользователь №: 25 975



Возникла необходимость перенести сабж на 2368 и пошли старые косяки.
После настройки и разрешения ДМА вылетает в прерывание со значением NDD_REQ_INT (запрос на новый дескриптор), хотя ни один байт не отправлен.
В ДШ что-то упоминалось про двойной буфер для Bulk режима (мой случай) но что-то не понятно там ка-то написано про него. Других причин я пока не нахожу. Если кто что знает, отпишите плз.
Go to the top of the page
 
+Quote Post
demiurge
сообщение Mar 5 2008, 00:13
Сообщение #13





Группа: Новичок
Сообщений: 2
Регистрация: 26-02-08
Пользователь №: 35 412



Цитата(3m-soft @ Sep 25 2007, 11:13) *
Как я понимаю даташитом ты вооружен. У меня была такая же проблема. Посмотри команду
(Command: 0xF3, Data: write 1 byte)
Бит 5 INAK_BI Interrupt on NAK for Bulk IN endpoints:
0 Only successful transactions generate an interrupt.
1 Both successful and NAKed IN transactions generate interrupts.

Поставь этот бит в единицу и попробуй.


Добрый вечер! У меня та же проблема. Прописывал команду Set Mode в разных местах,
но прерывания на NAKed IN так и не получил. Подскажите, пожалуйста, как и где прописать эту Set Mode (Command: 0xF3, Data: write 1 byte)? В USB_Init(), USB_Connect() или где-то ещё?
Буду очень благодарен, если приведёте фрагмент кода. help.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 09:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.97956 секунд с 7
ELECTRONIX ©2004-2016