|
SDIO+Bypass STM32F4 |
|
|
|
Oct 15 2016, 13:35
|
Группа: Участник
Сообщений: 6
Регистрация: 15-10-16
Пользователь №: 93 770

|
Здравствуйте уважаемые форумчане! Разбираюсь с SDIO режимом STM32F407VG. Встал вопрос скорости. Решил попробовать Bypass, т.е. брать чистые, неразделенные 48 MHz для тактирования карты. Команды вроде бы проходят, а вот взаимодействие (запись) с флеш-картой не завелось. Регулярно выбивается бит TXUNDERR, что говорит о незаполненности FIFO. Пользуюсь SPL, но даташит не игнорирую. Привожу код: CODE void Fast_Bus()// Перевод в режим быстрой шины после инициализации { send_command(7,RCA<<16,SDIO_CPSM_Enable,SDIO_Response_Short,SDIO_Wait_No,1); send_command(55,RCA<<16,SDIO_CPSM_Enable,SDIO_Response_Short,SDIO_Wait_No,1); send_command(6,0x00000002,SDIO_CPSM_Enable,SDIO_Response_Short,SDIO_Wait_No,1);
SDIO_SetPowerState(SDIO_PowerState_OFF); SDIO_InitTypeDef sdio; sdio.SDIO_BusWide=SDIO_BusWide_4b; sdio.SDIO_ClockBypass=SDIO_ClockBypass_Enable; sdio.SDIO_ClockDiv=0x00; sdio.SDIO_ClockEdge=SDIO_ClockEdge_Rising; sdio.SDIO_ClockPowerSave=SDIO_ClockPowerSave_Disable; sdio.SDIO_HardwareFlowControl=SDIO_HardwareFlowControl_Disable; SDIO_Init(&sdio); SDIO_SetPowerState(SDIO_PowerState_ON); do { SDIO->ICR=0xFFFFFFFF; send_command(13,RCA<<16,SDIO_CPSM_Enable,SDIO_Response_Short,SDIO_Wait_No,0); } while(SDIO_GetResponse(SDIO_RESP1)!=0x00000900); }
void DPSM_Init()// Инициализация DPSM { SDIO_DataInitTypeDef data; data.SDIO_DataBlockSize=SDIO_DataBlockSize_512b; data.SDIO_DataLength=512; data.SDIO_DataTimeOut=0x005B8D80; data.SDIO_DPSM=SDIO_DPSM_Enable; data.SDIO_TransferDir=SDIO_TransferDir_ToCard; data.SDIO_TransferMode=SDIO_TransferMode_Block; SDIO_DataConfig(&data); }
void SD_Write(uint8_t const sector_data[],uint32_t sector,uint16_t count)// Собственно запись {
uint32_t dtlength=0; GPIO_ToggleBits(GPIOD,GPIO_Pin_12); for(int i=0;i<128*count;i++) { data_tr[i]=0x0; } uint32_t counter=0;
for(int i=0;i<128*count;i++) { data_tr[i]|=(sector_data[counter++]); data_tr[i]|=(sector_data[counter++]<<8); data_tr[i]|=(sector_data[counter++]<<16); data_tr[i]|=(sector_data[counter++]<<24); } send_command(25,sector,SDIO_CPSM_Enable,SDIO_Response_Short,SDIO_Wait_No,0); DPSM_Init(); counter=0; do { if((SDIO_GetFlagStatus(SDIO_FLAG_TXFIFOHE)==SET)&&(dtlength<(512))) { SDIO_WriteData(data_tr[counter++]); SDIO_WriteData(data_tr[counter++]); SDIO_WriteData(data_tr[counter++]); SDIO_WriteData(data_tr[counter++]); SDIO_WriteData(data_tr[counter++]); SDIO_WriteData(data_tr[counter++]); SDIO_WriteData(data_tr[counter++]); SDIO_WriteData(data_tr[counter++]); dtlength+=32; }
} while ((SDIO_GetFlagStatus(SDIO_FLAG_DATAEND)|SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT)|S DIO_GetFlagStatus(SDIO_FLAG_TXUNDERR)|SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL))!=SET); // DPSM_DeInit(); send_command(12,0x0,SDIO_CPSM_Enable,SDIO_Response_Short,SDIO_Wait_No,0);// Вот здесь флаг выставлен. if(SDIO_GetResponse(SDIO_RESP1)!=0x00000900) { DPSM_DeInit(); do { SDIO->ICR=0xFFFFFFFF; send_command(13,RCA<<16,SDIO_CPSM_Enable,SDIO_Response_Short,SDIO_Wait_No,0); } while(SDIO_GetResponse(SDIO_RESP1)!=0x00000900); SDIO->ICR=0xFFFFFFFF; } else { DPSM_DeInit(); SDIO->ICR=0xFFFFFFFF; }
} Вот как-то так. Помогите чайнику разобраться, очень бы хотелось активировать этот режим, т.к. иначе работа без запаса по времени почти. FAT губит все быстродействие(( Заранее благодарю откликнувшихся.
Сообщение отредактировал Herz - Oct 17 2016, 08:22
Причина редактирования: codebox
|
|
|
|
|
 |
Ответов
|
Oct 17 2016, 09:56
|
Группа: Участник
Сообщений: 6
Регистрация: 15-10-16
Пользователь №: 93 770

|
Цитата Т.е. - какова требуемая скорость потока записи в байтах/сек??? Я уже не знаю как ещё понятнее спросить..... А я уже не знаю как ответить. Сейчас АЦП, считывание и прочая святотень откинуты. Идет работа только с SDIO, записью. Я просто беру и пишу всякую фигню на карту, без АЦП. И это надо сделать максимально быстро, а не как получится. Я понимаю, чего Вы от меня хотите. Но Вы похоже не понимаете, чего я хочу от Вас. Я хочу разобраться с 48 МГц режимом, а не оптимизировать запись с АЦП, это другая часть работы. Цитата Мы здесь не телепаты чтобы знать как Вы эти свои 200kS/s выборок АЦП на карту пишете! Это отдельная песня, упомянул АЦП только потому, что хотел чтобы общее видение устройства сложилось. Повторюсь, сейчас пишу мусор. Код while(1) { delay(1000); SD_Write(temp,i++,1); GPIO_ToggleBits(GPIOD,GPIO_Pin_14); } Вот именно так сейчас выглядит main (опущены процедуры инициализации). Т.е. про АЦП забыли, нету его. Извиняюсь, если внес сумятицу упоминанием об АЦП. Цитата Стоп! А вы что при записи каждой порции данных потока данных в файл его открываете/закрываете? а зачем?? Зачем, действительно. Я создаю и пишу файл, который содержит 2 минуты записи с АЦП. Потом закрываю. Потом создаю новый без отрыва от считывания данных с АЦП и так далее. Требования такие. По поводу диаграмм. Смотрел на осцилле, неоднократно. Вот еще что. Название темы у нас SDIO+Bypass, а не отладка быстродействия карты памяти. Давайте будем обсуждать режим bypass, который надо запустить. А не сторонние вещи, вроде его необходимости в отдельно взятой программе. Это первая и не последняя работа с картами памяти. Чем больше я исследую сейчас SDIO, тем меньше придется изучать его потом.
Сообщение отредактировал Hedgehog - Oct 17 2016, 13:39
|
|
|
|
|
Oct 18 2016, 04:04
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 24-02-09
Из: Екатеринбург
Пользователь №: 45 296

|
Цитата(Hedgehog @ Oct 17 2016, 14:56)  А я уже не знаю как ответить. Сейчас АЦП, считывание и прочая святотень откинуты. Идет работа только с SDIO, записью. Я просто беру и пишу всякую фигню на карту, без АЦП. И это надо сделать максимально быстро, а не как получится. Я понимаю, чего Вы от меня хотите. Но Вы похоже не понимаете, чего я хочу от Вас. Я хочу разобраться с 48 МГц режимом, а не оптимизировать запись с АЦП, это другая часть работы. RM0090 Reference manual, Doc ID 018909 Rev 6, p.1005/1710: SDIO_CK is the clock to the card: one bit is transferred on both command and data lines with each clock cycle. The clock frequency can vary between 0 MHz and 20 MHz (for a MultiMediaCard V3.31), between 0 and 48 MHz for a MultiMediaCard V4.0/4.2, or between 0 and 25 MHz (for an SD/SD I/O card). Так что 25 МГц -- это максимум для работы с SD карточкой. Кроме того, без DMA передача данных в SDIO будет прерываться на время обработки прерываний, что вызовет TXUNDERR. То, что у вас есть буфер на 200 мс -- это хорошо, но мало. Внимательно почитайте раздел 4.13 Speed Class Specification в документе SD Specifications Part 1 Physical Layer Simplified Specification; максимальное допустимое время обновления FAT для карточек -- 750 мс. Так что буфера менее чем на 800 мс может не хватить. При записи на карточку основное время уходит на ожидание готовности карточки. Сама передача занимает вряд ли более 10% времени (при записи по одному сектору). Так что увеличение частоты в 2 раза, если бы это можно было сделать, даст прирост не более 5%. Гораздо больший выигрыш даст правильное выравнивание данных в памяти (чтобы писать блоками по 4 или 8 кБ за раз) и на карточке и предварительная подготовка карточки. И еще про заполнение FIFO SDIO. При частоте 48 МГц (допустим, модуль будет работать) данные в FIFO нужно добавлять в среднем каждые 28 тактов (у вас же 4 линии данных?, ядро работает на частоте 168 МГц?). Функция SDIO_WriteData -- это не макрос! Вызов, возврат, считывание слова из памяти, запись в FIFO -- это всё запросто может длиться более 28 тактов. Так что без DMA вообще никак. Илья
Сообщение отредактировал 501-q - Oct 18 2016, 05:26
|
|
|
|
Сообщений в этой теме
Hedgehog SDIO+Bypass STM32F4 Oct 15 2016, 13:35 Сега Читайте STM32F40x and STM32F41x Errata sheet — ... Oct 15 2016, 14:29 Genadi Zawidowski А по DMA не проще будет "кормить" карту ... Oct 15 2016, 15:12 Hedgehog Genadi Zawidowski,DMA не используется по указанию ... Oct 17 2016, 06:29 jcxz Цитата(Hedgehog @ Oct 17 2016, 09:29) Gen... Oct 17 2016, 07:33 Hedgehog Цитатав STM32 с их дохлой периферией без FIFO
Как ... Oct 17 2016, 07:54 jcxz Цитата(Hedgehog @ Oct 17 2016, 10:54) Пре... Oct 17 2016, 08:31 Hedgehog ЦитатаЧто именно надо ускорить?
На данный момент ... Oct 17 2016, 09:09 jcxz Цитата(Hedgehog @ Oct 17 2016, 12:09) Я с... Oct 17 2016, 09:32 Hedgehog 501-q, читал подобные строки, поэтому меня и обуял... Oct 18 2016, 06:01 Allregia Есть еще один нюанс, который не все знают, я на эт... Oct 18 2016, 18:44 Rash Запускал на 48МГц по DMA и без DMA на ST32F429, вс... Oct 20 2016, 13:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|