|
|
  |
проблемы с настройкой модуля USB в AT91SAM7S256 |
|
|
|
Oct 25 2007, 11:05
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Написано достаточно много , но есть строка Revision 2.0 Полагаю это относится к версии USB...
|
|
|
|
|
Oct 25 2007, 11:37
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Плата на пластиковых пеньках , стола не касается . Питание от USB напрямую не используется , но заведено через защитный диод в паралель напряжению 3.9 В , на вход преобразователя TPS73033, который формирует итоговые 3.3 используемын для питания проца . Не знаю может ли оно влиять ? Проблемка осталась , с длинными файлами : типа файл практически полность скопирован , а нет чего то для завершения не хватает ... При последующем включении файл виден , т.е в каталоге есть , но содержимое его битое... Все малоки убрал , сделал статические буфера . Длину FIFO увеличил в 2 раза на всякий случай ... пока тоже самое
|
|
|
|
|
Oct 25 2007, 11:46
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(coolzero @ Oct 25 2007, 15:37)  Плата на пластиковых пеньках , стола не касается . Питание от USB напрямую не используется , но заведено через защитный диод в паралель напряжению 3.9 В , на вход преобразователя TPS73033, который формирует итоговые 3.3 используемын для питания проца . Не знаю может ли оно влиять ? Проблемка осталась , с длинными файлами : типа файл практически полность скопирован , а нет чего то для завершения не хватает ... При последующем включении файл виден , т.е в каталоге есть , но содержимое его битое... Все малоки убрал , сделал статические буфера . Длину FIFO увеличил в 2 раза на всякий случай ... пока тоже самое Положите под плату лист текстолита соединённый с заземлением в розетке или в осциллоскопе. Я не использовал BFSA, но в EFSL было кэширование записи - требовалось флушить файловую систему. Проверьте можете ли вы писать/читать сектора не в начале флэши без ошибок.
|
|
|
|
|
Oct 25 2007, 12:05
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Текстолита , увы , сейчас под рукой нет ... Не совсем понял , что значит флушить ? Насчёт чтения\записи - я в принципе и так не в начале флеши работаю : первые 2 страницы ( 1056 байт ) отвёл под свои внутренние нужды , при доступе к файловой системе просто к адресу добавляется смещение . Уважаемый 4afc , а не поясните ли какую роль играют буффера выделяемые малоком ( FIFO, FW_FIFO, TB ) и какие могут быть критичны по размеру ( возможно переполнение ) ?
|
|
|
|
|
Oct 25 2007, 12:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(coolzero @ Oct 25 2007, 16:05)  Текстолита , увы , сейчас под рукой нет ... Не совсем понял , что значит флушить ? Насчёт чтения\записи - я в принципе и так не в начале флеши работаю : первые 2 страницы ( 1056 байт ) отвёл под свои внутренние нужды , при доступе к файловой системе просто к адресу добавляется смещение . Уважаемый 4afc , а не поясните ли какую роль играют буффера выделяемые малоком ( FIFO, FW_FIFO, TB ) и какие могут быть критичны по размеру ( возможно переполнение ) ? Просто односторонний текстолит проще чем метал. А втыкаемый паяльник вашим соседом или запускаемый за стеной холодильник могут добавить вам проблем. Флушить - отписывать возможные буфера файловой системы на диск/флеш. Вопрос не втом в каком адресе флеш памяти вы работаете, а в том насколько корректно вы умеете ходить по физическим секторам и пересчитывать кластеры FAT16 туда и обратно. У вас таблица фат хоть меняется после записи файла? А сами сектора упомянутые в фат меняют своё содержимое? Я заменял 4 буфера но их назначение для меня неизвесно т.к. протокол я не изучал, а тем более реализацию. extern structTB MYMEM_fw_TB[FW_TB_NUM];//8*structTB=8*(12+64)=608 bytes extern char MYMEM_data_buff[MAX_TRANSFER_SIZE]; //х*MAX_PACKET_SIZE extern char MYMEM_fw_fifoId[FW_FIFO_SIZE];//512 bytes extern UCHAR MYMEM_buff[FW_FIFO_SIZE];//512 bytes Кстати несмоьря на то что MAX_TRANSFER_SIZE у меня равен 4096, WinXP1 читает с меня блоками по 64к. А ранее я вроде умудрялся ограничиватьразмеры запросов.
Сообщение отредактировал _4afc_ - Oct 25 2007, 12:36
|
|
|
|
|
Oct 25 2007, 13:08
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Таблица ФАТ и соответствующие сектора меняются Насчёт того корректно ли хожу по физическим адресам , думаю что да , сбоев не замечал , но кто его знает... надо углублённо проверять . Насчёт флага RXSUSP , а не может он мешать ? Пару раз заметил при отсутствии копирования , что маска прерываний сброшена в состояние по умолчанию , пару раз прервание по конечной точке на выход запрещено... странно как то
Я использую AT45DB16, там размер страницы 528 байт , правда есть какой-то режим с 512 байтами , но что я с ним не разобрался , не захотела флешка так работать
|
|
|
|
|
Oct 25 2007, 13:38
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Надо попробовать
|
|
|
|
|
Oct 25 2007, 14:48
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(Dron_Gus @ Oct 25 2007, 16:45)  Какой размер сектора Вы используете? Хотя у AT45 размер сектора 264 байта, я использую лишь 256 первых. При этом обьединяю два сосених сектора в "честный" 512-байтный сектор. В одном проекте у меня устройство ёмкостью 8 секторов 512 байт, после каждого чтения данные в них меняются на новые. В другом я заполняю SD карту файлами, которые доступны для чтения по USB. Сектора 512 байт. Заполнение EFSL. Чтение чистый MSD без файловой системы - какой сектор винда хочет - такой и получает. А вот у других сотрудников которые использовали другие файловые системы - были проблемы с вычислением из номера кластера в FAT16/FAT32 в физический номер сектора.
|
|
|
|
|
Oct 26 2007, 12:09
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Погонял свой девайс , мнение такое сложилось - косячно работает связка ARM-AT45 , там три команды есть непрерывного чтения основной памяти , у меня нормально работает только 0xE8 ,да и то на частоте AT91C_SPI_SCBR&(2<<8) ... делаю частоту ниже AT91C_SPI_SCBR&(4<<8) - всё начинаются траблы тут сегодня топик появился - у чела практически те же проблемы - при считовании больших массивов данных АТ45db161 сбоит... не подскажут ли уважаемые форумчане , кто работает с данной датафлешкой , какиме настройки по SPI ?
|
|
|
|
|
Oct 26 2007, 12:45
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
Код
/* typedef struct _AT45_Device{ int buflen; int pages; int blocks; char pagebits; char sign; const char * name; }AT45_Device; */ #define AT45_Types 8 const AT45_Device AT45_Type[AT45_Types]= { { 264, 4096, 512, 9, 0, "Unknown"}, { 264, 512, 64, 9, 3, "AT45DB011"}, // 1 Mbit { 264, 1024, 128, 9, 5, "AT45DB021"}, // 2 Mbit { 264, 2048, 256, 9, 7, "AT45DB041"}, // 4 Mbit { 264, 4096, 512, 9, 9, "AT45DB081"}, // 8 Mbit { 528, 4096, 512, 10, 11, "AT45DB161"}, // 16 Mbit { 528, 8192, 1024, 10, 13, "AT45DB128"}, // 32 Mbit {1056, 8196, 1024, 11, 15, "AT45DB642"} // 64 Mbit };
FS_AT45_InitSPI(void) { AT91PS_SPI pSPI = AT91C_BASE_SPI0;
// enable peripheral clock for SPI AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, (1 << AT91C_ID_SPI0)); // SPI enable and reset if (!(pSPI->SPI_CR & AT91C_SPI_SPIEN)) { pSPI->SPI_CR = AT91C_SPI_SWRST; pSPI->SPI_CR = AT91C_SPI_SPIDIS; pSPI->SPI_CR = AT91C_SPI_SPIEN; } // SPI mode: master, fixed periph. sel., FDIV=0, fault detection disabled pSPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED | AT91C_SPI_MODFDIS; // set chip-select-register // SPI mode 0: 8 bits per transfer, CPOL=0, ClockPhase=0, DLYBCT = 0 //pSPI->SPI_CSR[AT45_SPI_CSRNum] = /*AT91C_SPI_CPOL |*/ AT91C_SPI_NCPHA | AT91C_SPI_BITS_8 | AT91C_SPI_CSAAT | (0xFF << 8);
// SPI mode 3: 8 bits per transfer, CPOL=1, ClockPhase=1, DLYBCT = 0 pSPI->SPI_CSR[AT45_SPI_CSRNum] = AT91C_SPI_CPOL | /*AT91C_SPI_NCPHA |*/ AT91C_SPI_BITS_8 | 0x0F << 8; // pSPI->SPI_CR = AT91C_SPI_SPIEN;
// if(pSPI->SPI_SR & AT91C_SPI_SPIENS) // printf("SPI initialized...\n"); }
// Read DataFlash status register __ramfunc char FS_AT45_ReadStatus(U8 Unit) { char s; FS_AT45_DisableCS(Unit); FS_AT45_EnableCS(Unit); FS_AT45_RW(StatusReg); s = FS_AT45_RW(0xFF); FS_AT45_DisableCS(Unit); return s; }
int FS_AT45_InitDev(U8 Unit) { char result; int i;
result = FS_AT45_ReadStatus(Unit); // printf("AT45 status %X\r\n", result); AT45_Devs[Unit] = &(AT45_Type[0]); for (i = AT45_Types; i >= 0; i--) if (((result >> 2) & 0x0F) == AT45_Type[i].sign) break; AT45_Devs[Unit] = &AT45_Type[i]; if (i != 0) return 0; else return 1; }
int FS_AT45_InitDevice(U8 Unit) // Called from AddDevice. Usually the first call to the driver { int result, i; char prev_dev;
FS_AT45_InitPIO(); FS_AT45_InitSPI(); FS_AT45_DisableCS(Unit); prev_dev = FS_AT45_Select(AT45_SPI_CSRMask); FS_AT45_SetSpeed(AT45_MIN_SPEED); //slow during init for(i=0;i<41;i++) FS_AT45_RW(0xFF); FS_AT45_SetSpeed(AT45_MAX_SPEED); result = FS_AT45_InitDev(Unit); //DataAbort will be detected if we use printf here! FS bag? /* if (result != 0) { printf("Error init AT45 devise No %d\n\r", Unit); } else { printf("Found %s\n\r", AT45_Devs[Unit]->name); }*/ FS_AT45_Select(prev_dev); return result; }
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|