Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2478 mass storage
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Chameleon
Пытаюсь запустить mass storage на отладочной плате StarterKit c LPC2478

Начальная стандартная инициализация проходит успешно.

При получении запроса Get max LUN отвечаю 1 (устройство с двумя дисками), но после этого происходит сброс USB, хотя вроде должен быть первый SCSI запрос (так происходит в рабочем кардридере).

До запроса Get max LUN в регистре REALIZED_EP биты для Endpoint 2 установлены, сразу после него - сброшены.

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

Используется второй USB порт.

Вот дескрипторы:


CODE
/* USB Standard Device Descriptor */
const unsigned char DevDescriptor[] = {
18, /* bLength */
0x01, /* bDescriptorType */
0x10,0x01, /* bcdUSB */
0x00, /* bDeviceClass */
0x00, /* bDeviceSubClass */
0x00, /* bDeviceProtocol */
64, /* bMaxPacketSize0 */
0x51,0xC2, // VID
0x03,0x17, // PID
0x00,0x01, // Version
0x01, /* iManufacturer */
0x02, /* iProduct */
0x03, /* iSerialNumber */
0x01 /* bNumConfigurations */
};

/* USB Configuration Descriptor */
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const unsigned char ConfigDescriptor[] = {
/* Configuration 1 */
0x09, /* bLength */
0x02, /* bDescriptorType */
32,0, // wTotalLength = Configuration + Interface + 2 endpoint
0x01, /* bNumInterfaces */
0x01, /* bConfigurationValue */
0x00, /* iConfiguration */
0xC0, // Self powered
0x01, // bMaxPower
/* Interface 0, Alternate Setting 0, MSC Class */
0x09, /* bLength */
0x04, /* bDescriptorType */
0x00, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x02, /* bNumEndpoints */
0x08, /* bInterfaceClass - Storage*/
0x06, /* bInterfaceSubClass - SCSI*/
0x50, /* bInterfaceProtocol */
0x00, /* iInterface */
/* Bulk In Endpoint */
0x07, /* bLength */
0x05, /* bDescriptorType */
0x02, /* bEndpointAddress */
0x02, /* bmAttributes */
0x40,0x00, /* wMaxPacketSize */
0, /* bInterval */
/* Bulk Out Endpoint */
0x07, /* bLength */
0x05, /* bDescriptorType */
0x82, /* bEndpointAddress */
0x02, /* bmAttributes */
0x40,0x00, /* wMaxPacketSize */
0, /* bInterval */
};
SyncLair
Цитата(Chameleon @ Oct 23 2012, 19:53) *
Пытаюсь запустить mass storage на отладочной плате StarterKit c LPC2478

Простите вы используете Device a не хост?

Chameleon
Да, Device
Chameleon
Нашел пример от кейла, не работает точно также. Инициализация проходит, а после запроса Get Max LUN происходит сброс.
По снифферу USB вижу, что компьютер пытается отправить превый SCSI запрос, но мое устройство его не получает.

Кто-нибудь запускал пример Usb memory от Кейла?
kovigor
Цитата(Chameleon @ Oct 28 2012, 20:50) *
Кто-нибудь запускал пример Usb memory от Кейла?

Я запускал, но на LPC214x, и затем строил на основе этого примера свой проект. Пример вполне рабочий ...
SyncLair
Цитата(Chameleon @ Oct 28 2012, 20:50) *
Кто-нибудь запускал пример Usb memory от Кейла?

Пробывал запускать пока только на LPC1768 -> работает если питание платы не от USB. Даже пока не знаю с чем это связано!
Chameleon
Вроде заработало, сделал два диска - один остался образ в ОЗУ, второй - DataFlash AT45BD32.
Теперь Виндовс не хочет форматировать диск, пишет "Не удается завершить форматирование." Датафлеш чистая, все FF. В отладчике смотрю, что пытается писать в нулевой сектор - совсем не образ нулевого сектора. Причем данные меняются от попытки к попытке.
Может влиять, что объем датафлеши 4Мб?

Запись в датафлеш вручную проверял, все правильно.

Кто-нибудь с таким сталкивался?
Chameleon
В общем победил.
Скорость чтения ~350Кб/сек.
Скорость записи ~40Кб/сек. Для DATAFLASH и должно так мало быть?
_Артём_
Цитата(Chameleon @ Nov 1 2012, 11:19) *
Скорость чтения ~350Кб/сек.

Как-то медленно, такую скорость и АВР выдаст.


Цитата(Chameleon @ Nov 1 2012, 11:19) *
Скорость записи ~40Кб/сек. Для DATAFLASH и должно так мало быть?

Да, где-то так и получается: запись страницы - 20-50 миллисекунд, размер страницы 0,5 кБ. Так и выходит.
Сергей Борщ
QUOTE (_Артём_ @ Nov 1 2012, 14:55) *
запись страницы - 20-50 миллисекунд, размер страницы 0,5 кБ.
А у нее же два входных буфера. Если использовать их по очереди и заполнять следующий пока пишется предыдущий, нельзя ли удвоить скорость записи?
_Артём_
Цитата(Сергей Борщ @ Nov 1 2012, 14:28) *
А у нее же два входных буфера. Если использовать их по очереди и заполнять следующий пока пишется предыдущий, нельзя ли удвоить скорость записи?

Удвоить за счёт буфера - вряд ли.
Допустим скорость записи в буфер по spi - 500 кБ/сек.
Тогда запись в буфер - 1 мс. Всё равно ждать придётся...

Может скорость можно повысить за счёт предварительного стирания блоков-секторов и записывать без стирания. Но стирает она тоже не быстро.
Сергей Борщ
QUOTE (_Артём_ @ Nov 1 2012, 15:47) *
Тогда запись в буфер - 1 мс. Всё равно ждать придётся...
Ну да, ну да. Остается предварительное стирание, но как его реализовать? Это ведь только файловая система знает, какой сектор сейчас пустой. Разве что иметь некоторое количество резервных секторов и делать подмену. Но это еще один уровень иерархии. Делал так при организации MSD во внутренней флешке LPC1769. Работало, но не понравилось.
Chameleon
QUOTE (_Артём_ @ Nov 1 2012, 14:55) *
Как-то медленно, такую скорость и АВР выдаст.


Это наверно потому что без DMA и двойного буферирования по USB. Посмотрел по интернету, на Full speed вроде 600-700Кб максимально достижимая скорость чтения.
У меня это все равно будет вроде как хранилище настроек, Mass storage только для удобства доступа.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.