|
|
  |
FatFs. LPC2388. MCI. Не работает, На какие грабли наступил? |
|
|
|
Jul 28 2009, 06:30
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата А файликом для MCI не поделитесь для FatFs? А чегож не поделится, поделюсь.
Прикрепленные файлы
mci2.rar ( 15.29 килобайт )
Кол-во скачиваний: 138
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Jul 29 2009, 07:41
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата Да, это одно и то-же. Об этом и речь. Так в чем проблема, модуль MCI я выдрал из рабочего проекта где работает именно ФС по ссылке выше, всё должно работать. По идее вам только файл переименовать с MCI2 на MCI.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Jul 29 2009, 08:32
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Не совсем.  эта файловая система работает по функциям определенным в diskio.h А именно: DSTATUS disk_initialize (BYTE); DSTATUS disk_status (BYTE); DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); DRESULT disk_ioctl (BYTE, BYTE, void*); Вот тут-то и приходится извращаться. Поскольку то, что в примере с этой системой работать отказывается.
|
|
|
|
|
Jul 29 2009, 09:00
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Ладно, углубимся... Смотрим для примера функцию disk_initialize: Вот эта функция в dickio.c Код /*-----------------------------------------------------------------------*/ /* Initialize a Drive */
DSTATUS disk_initialize (BYTE drv) /* Physical drive nmuber (0..) */ { if ( drv != 0 ) return STA_NOINIT;
if ( MCI_disk_initialize() ) { // error occured Stat |= STA_NOINIT; power_off(); } else { Stat &= ~STA_NOINIT; // cardtype mci.h to chan cardtype - (maybe redundant) switch ( MCI_CardType ) { case SDHC_CARD : TERMf((tbuf,TXT("\r\nCardType-SDHC"))); CardType = 4; break; case MMC_CARD : TERMf((tbuf,TXT("\r\nCardType-MMC"))); CardType = 1; break; case SD_CARD : TERMf((tbuf,TXT("\r\nCardType-SD"))); CardType = 2; break; default : TERMf((tbuf,TXT("\r\nCardType-0"))); CardType = 0; } } return Stat; } Видим что из функции disk_initialize вызывается только одна функция MCI_disk_initialize которая и находится в пристёгнутом архиве выше. Цитата Поскольку то, что в примере с этой системой работать отказывается. Разумеется что-то может и не заработать из примера, но есть же отладчик и терминал. Ещё раз повторяю модуль MCI выдрал из РАБОЧЕГО проекта.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Jul 29 2009, 11:08
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
В общем все заработало. Всем спасибо за помощь.  Просто в комплекте от мистера Чана идут не совсем корректные, IMHO, примеры под LPC. Взял пример от Мартина Томаса вот здесьмалость переработал и собсно все заработало. Довести до ума осталось, но в целом вроде все работает. Будем посмотреть. Надеюсь кому-нибудь пригодится это все.
|
|
|
|
|
Jul 29 2009, 11:21
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата Дело в том, что в том архиве нету такой функции. Каюсь, не искал её там, думал коль её у вас нету то должна быть там. Рад что у вас всё заработало.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Jul 29 2009, 13:22
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата(EXeGLuMATOR @ Jul 29 2009, 16:08)  В общем все заработало. Всем спасибо за помощь.  Просто в комплекте от мистера Чана идут не совсем корректные, IMHO, примеры под LPC. Взял пример от Мартина Томаса вот здесьмалость переработал и собсно все заработало. Довести до ума осталось, но в целом вроде все работает. Будем посмотреть. Надеюсь кому-нибудь пригодится это все. О! Спасибо за ссылку! Проект сделан под кейловский компилятор - но при компиляции выдает ошибку: Код drivers_mthomas\diskio.c(520): error: #167: argument of type "volatile BYTE *" is incompatible with parameter of type "const void *restrict" в функции DRESULT disk_read на строчку memcpy(buff, ReadBlock, 512);как исправить?
Сообщение отредактировал Ivan Kuznetzov - Jul 29 2009, 13:23
--------------------
Разработчик
|
|
|
|
|
Jul 29 2009, 17:37
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Цитата(Ivan Kuznetzov @ Jul 29 2009, 17:22)  О! Спасибо за ссылку! Проект сделан под кейловский компилятор - но при компиляции выдает ошибку: Код drivers_mthomas\diskio.c(520): error: #167: argument of type "volatile BYTE *" is incompatible with parameter of type "const void *restrict" в функции DRESULT disk_read на строчку memcpy(buff, ReadBlock, 512);как исправить? memcpy(buff, (BYTE*)ReadBlock, 512); Аналогично и во втором месте, где выдаст такую ошибку.
|
|
|
|
|
Jul 31 2009, 04:04
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата memcpy(buff, (BYTE*)ReadBlock, 512); Аналогично и во втором месте, где выдаст такую ошибку. Спасибо, подкорректировал, ошибка исчезла! Протестировал исходник на Olimex LPC2378 платке - с карточками до 1 Гб пашет отлично, инициализирует фс-ку и читает файлики с нее Но есть один непонятный момент - SDHC карточки инициализировать не хочет, хотя в diskio.c уже есть ветвление на SD/SDHC карты (сохраняет тип в переменную CardType)... Включил дебаг в diskio.c - обнаружилось, что вываливается на MCI_Check_CID()Код MCI DMA enabled Check_CID failed Set_Address failed Send_CSD failed Select_Card failed Set_BlockLen failed Set_BlockLen o.k. dump_status: Send_Status INVALID_RESPONSE
SELECT Select_Card failed - retry SELECT timeout changeing to trans dump_status: Send_Status INVALID_RESPONSE wait_ready: Send_Status INVALID_RESPONSE wait_ready: timeout stby or trans DESELCT timeout waiting trans or stby
Сообщение отредактировал Ivan Kuznetzov - Jul 31 2009, 04:09
--------------------
Разработчик
|
|
|
|
|
Jul 31 2009, 13:01
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 3-01-07
Из: Germany
Пользователь №: 24 071

|
Адаптировал пример к платине Keil MCB2387 - всё работало отлично. В функции MCI_Init() возможно нужно ещё PINSELx для LPC2388 правильно изменить.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|