10.12.2015, 13:29
|
|
Частый гость
Регистрация: 13.07.2006
Сообщений: 34
Сказал спасибо: 6
Сказали Спасибо 10 раз(а) в 8 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от black27512
|
Косяк с адресацией там исправлен (собственно косяк чисто в том, что адрес передается в uint32 и т.к. он передается не в блоках, а в байтах то для SDXC 32 бита не хватает для полной адресации, достаточно перейти на тип uint64 и всё норм будет).
|
А зачем мне вводить uint64 в системе, который его не поддерживает нативно? К слову, пример, который использовал я (мультиблок был уже пофиксен) там уже стоял uint64. И как выяснилось при отладке FatFS успешно вычитывала бут сектор раздела непонятно откуда (у меня малые карты были с одним разделом на всю карту а 64ГБ имеет технологический гап между таблицей разделов и рабочим разделом в 32,5ГБ). И я убрал это мракобесие uint64 и поставил вот такой код в начало функции:
Код:
|
if ( (CardType == SDIO_STD_CAPACITY_SD_CARD_V1_1) | (CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0) )
{
ReadAddr *= BlockSize;
} |
А вам искренне желаю не напороться на порчу данных на карте SDXC за границей в 32ГБ.
|
|
|
|
10.12.2015, 13:34
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Странная какая-то запись.
|
|
|
|
10.12.2015, 14:10
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Ну вот у Чена в примере той же diskio.c есть запись
Цитата:
|
if (!(CardType & CT_BLOCK)) sector *= 512; /* Convert to byte address if needed */
|
Как раз для таких случаев.
И даже в той же SPL/HAL
Цитата:
|
if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
{
BlockSize = 512;
ReadAddr /= 512;
}
|
Так как SPL/HAL хочет абсолютный адрес и затем преобразует к адресу блока.
Последний раз редактировалось realid; 10.12.2015 в 14:13.
|
|
|
|
10.12.2015, 16:34
|
|
Частый гость
Регистрация: 23.10.2011
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от Hives
|
realid
карта может вернуть статус SD_TRANSFER_OK и не быть готовой к записи
а вот для готовности там есть еще один бит статуса - READY_FOR_DATA (в реплике R1)
который и надо мониторить (дополнительно к TRAN состоянию)
PS за подробностями - в описание протокола SD, пункт 4.3, Write Data
|
В спецификации сказано, что данная информация содержится в регистре CSR (Card Status Register). Однако в библиотеке Chan'a он, вообще, никак не фигурирует:
А в библиотеке для STM (функция MMC_disk_ioctl()) отсутствует реализация опроса даже для тех регистров, что есть у Chan'a: http://paul.rutgers.edu/~cwills/glid...n_2mmc_8c.html
Как, тогда, реализовать данный запрос к SD?
Последний раз редактировалось Vitaliki; 10.12.2015 в 16:58.
|
|
|
|
10.12.2015, 17:09
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Библиотека Чана тут вообще ни при чем. Она о SD карте (и прочих слоях уровня diskio) ничего не знает.
В моей (допиленной) версии делается опрос по CMD13 перед записью и проверяется готовность к приему данных.
пример:
Код:
|
DiskTimer2 = SD_CARD_READY_TIMEOUT;
do
{
Result = SD_SendCmd(SD_CMD13, ((u32) SD_CardAddr) ‹‹ 16, SD_RESPONSE_SHORT, SD_REPLY_R1);
Status = SDIO-›RESP1;
}
while ((DiskTimer2) && (Result == SD_RESULT_OK) && ((Status & SD_R1_READY_FOR_DATA) == 0));
if (!DiskTimer2) Result = SD_RESULT_READY_TIMEOUT; |
|
|
|
|
10.12.2015, 17:15
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от Vitaliki
|
В спецификации сказано, что данная информация содержится в регистре CSR (Card Status Register). Однако в библиотеке Chan'a он, вообще, никак не фигурирует:
А в библиотеке для STM (функция MMC_disk_ioctl()) отсутствует реализация опроса даже для тех регистров, что есть у Chan'a: http://paul.rutgers.edu/~cwills/glid...n_2mmc_8c.html
Как, тогда, реализовать данный запрос к SD?
|
В какой библиотеке Чена? FatFs это библа файловой системы? Она не работает с SD картой, она работает с данными на этой карте через низкоуровневые функции которые должны предоставить вы(может у чана есть пример их, но это не библа) и указываете их в файле diskio.c для основных операция чтения, записи и иницализации и тп.
Вот что у Чана написано по этому поводу.
Цитата:
|
Since the FatFs module is a file system layer, it is completely separated from the physical devices, such as memory card, harddisk and any type of storage devices. FatFs accesses the storage devices via a simple interface shown below. The low level device control module is not a part of FatFs module. It is provided by implementer. Also sample implementations for some platforms are available in the downloads.
|
В SPL/HAL для этого есть функция SD_GetStatus() или BSP_SD_GetStatus().
|
|
|
|
10.12.2015, 17:30
|
|
Частый гость
Регистрация: 23.10.2011
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от Hives
|
realid
карта может вернуть статус SD_TRANSFER_OK и не быть готовой к записи
а вот для готовности там есть еще один бит статуса - READY_FOR_DATA (в реплике R1)
|
Спасибо за пояснения!
Значит, нам нужно, чтобы функция SD_GetStatus() возвращала значение SD_CARD_READY?
Последний раз редактировалось Vitaliki; 10.12.2015 в 17:35.
|
|
|
|
10.12.2015, 19:27
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от Vitaliki
|
Спасибо за пояснения!
Значит, нам нужно, чтобы функция SD_GetStatus() возвращала значение SD_CARD_READY?
|
Нет, она возвращает только SD_TRANSFER_OK, SD_TRANSFER_ERROR и SD_TRANSFER_BUSY.
SD_TRANSFER_OK возвращает только, если карта находится в Transfer State, иначе вернет SD_TRANSFER_BUSY. Кстати, в этой функции бит READY_FOR_DATA не проверяется.
|
|
|
|
10.12.2015, 20:50
|
|
Частый гость
Регистрация: 23.10.2011
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от realid
|
Нет, она возвращает только SD_TRANSFER_OK, SD_TRANSFER_ERROR и SD_TRANSFER_BUSY.
SD_TRANSFER_OK возвращает только, если карта находится в Transfer State, иначе вернет SD_TRANSFER_BUSY. Кстати, в этой функции бит READY_FOR_DATA не проверяется.
|
Так я о том и спрашиваю, что нам эту проверку добавить сюда надо? Или лучше доп. функцию сделать? Но, чтобы проверить этот бит READY_FOR_DATA нужно сделать запрос по CMD13.
Есть следующая функция:
// pcardstatus: pointer to the buffer that will contain the SD card
// status (Card Status register).
SD_SendStatus()
Что дальше нужно сделать, чтобы получить состояние этого бита?
|
|
|
|
10.12.2015, 21:02
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Ну так по идее, если функция SD_SendStatus(&resp1) вернет SD_OK, то в resp1 будет статус. Бит READY_FOR_DATA 8-ой.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:37.
|
|