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

 
 
> LPC2478 mass storage
Chameleon
сообщение Oct 23 2012, 15:53
Сообщение #1


Участник
*

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



Пытаюсь запустить 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 */
};


Сообщение отредактировал Chameleon - Oct 23 2012, 15:54
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Chameleon
сообщение Nov 1 2012, 09:19
Сообщение #2


Участник
*

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



В общем победил.
Скорость чтения ~350Кб/сек.
Скорость записи ~40Кб/сек. Для DATAFLASH и должно так мало быть?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 1 2012, 11:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Chameleon @ Nov 1 2012, 11:19) *
Скорость чтения ~350Кб/сек.

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


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

Да, где-то так и получается: запись страницы - 20-50 миллисекунд, размер страницы 0,5 кБ. Так и выходит.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 1 2012, 12:28
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 1 2012, 12:47
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Сергей Борщ @ Nov 1 2012, 14:28) *
А у нее же два входных буфера. Если использовать их по очереди и заполнять следующий пока пишется предыдущий, нельзя ли удвоить скорость записи?

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

Может скорость можно повысить за счёт предварительного стирания блоков-секторов и записывать без стирания. Но стирает она тоже не быстро.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 1 2012, 13:35
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 7th August 2025 - 17:11
Рейтинг@Mail.ru


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