|
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, 07:54
|
Группа: Участник
Сообщений: 6
Регистрация: 15-10-16
Пользователь №: 93 770

|
Цитата в STM32 с их дохлой периферией без FIFO Как это без FIFO? В SDIO есть FIFO, другой вопрос почему оно не заполняется корректно, а после первой же итерации (судя по содержимому регистров) выплевывает ошибку. Причем именно в bypass режиме, в 24 МГц вежиме все классно, без затыков. Функции чтения/записи оптимизированы по самое нехочу, что там можно еще убрать-пока что непонятно. Цитата Вы сами толком не понимаете что Вам надо Прекрасно понимаю, надо считать данные с АЦП, сложить их в циклический буфер, читай программное FIFO, и успевать их выплевывать в файл, чтобы буфер не переполнялся. Частота считывания 200 КГц. Понимаю как работает DMA, но думаю, что оно не принесет ожидаемого прироста. А учитывая, что с DMA никогда не работал+требование руководства высказанное еще в пору AVR (раньше Xmega 64 была), экспериментировать не очень хочется, тем более не все выжато из SDIO. Понимаете, скорости обмена хватает. Но впритык. Поэтому хотелось бы иметь запасец, на случай долгого "отдыха" карты после записи итд, ну сами понимаете, всякое может быть, лучше выжать максимум. Поэтому и заморочился 48 МГц режимом. Хотя согласен с вами, некоторые вещи не совсем понятны на аппаратном уровне. DMA и SDIO к ним не относятся. Тут дело либо в непереведенной в "быстрый режим" карте (хотя почему команды проходят тогда?), либо в том, что опыты ставлю на дискавери, через проводки (укороченные, но все же...). Либо еще в чем-то мною неизведанном пока что.
|
|
|
|
|
Oct 17 2016, 08:31
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Hedgehog @ Oct 17 2016, 10:54)  Прекрасно понимаю Ну так если понимаете, то тогда ещё раз - где именно тормоза? Что именно надо ускорить? Именно сам обмен с картой? (Вы вообще смотрели временные диаграммы обмена по шине?) Или всё-таки программную обработку на уровне FS (или каком другом)? Или ваша работа на пользовательском уровне по запихиванию данных в файлы? Или операции записи/стирания на карту? Или ещё где? Где оценочный расклад какая часть процесса сколько занимает (в %)? Как правило, когда для ускорения хотят тупо поднять частоту, то толком не понимают как именно работает весь процесс, где возникают основные расходы времени и тормоза. Просто даже 24МГц - это даже для SPI очень прилично (3МБ/сек), такой поток процессору уровня Cortex-M и всему ПО, которое работает с этим потоком (файловая система и т.п.) уже довльно сложно переварить. А тут у Вас SDIO! Там ещё в разы больше поток. всё это говорит о том, что львиная доля времени будет уходить не на обмен с картой, а на программную обработку. И просто поднятие частоты даст прирост скорости всего на пару процентов. Т.е. - Вы роете совсем не в том направлении. Да и вообще что-то непонятно - как именно поток данных с АЦП на 200кГц может перегрузить карту работающую на 24МГц? Или у Вас несколько каналов или Вы ещё какие-то данные пишете на карту вместе? Ещё раз вопрос - какие всё-таки требования по скорости записи??? какова скорость потока записываемых данных?
|
|
|
|
Сообщений в этой теме
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 ЦитатаЧто именно надо ускорить?
На данный момент ... Oct 17 2016, 09:09 jcxz Цитата(Hedgehog @ Oct 17 2016, 12:09) Я с... Oct 17 2016, 09:32 Hedgehog ЦитатаТ.е. - какова требуемая скорость потока запи... Oct 17 2016, 09:56 501-q Цитата(Hedgehog @ Oct 17 2016, 14:56) А я... Oct 18 2016, 04:04 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
|
|
|