Перейти к содержанию
    

Hedgehog

Участник
  • Постов

    6
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. SDIO+Bypass STM32F4

    501-q, читал подобные строки, поэтому меня и обуяли сомнения вообще в реализуемости этого режима. Где-то в спецификации SDIO видел, что UHS может работать на 48 МГц, отсюда и все метания по поводу допкоманды. Спасибо за подробный ответ это было то, что нужно. Кстати, как ни странно, на соплях и с танцами с клоком процессор успешно проходит через прерывания и один файл пишет успешно, без переполнений.
  2. SDIO+Bypass STM32F4

    А я уже не знаю как ответить. Сейчас АЦП, считывание и прочая святотень откинуты. Идет работа только с SDIO, записью. Я просто беру и пишу всякую фигню на карту, без АЦП. И это надо сделать максимально быстро, а не как получится. Я понимаю, чего Вы от меня хотите. Но Вы похоже не понимаете, чего я хочу от Вас. Я хочу разобраться с 48 МГц режимом, а не оптимизировать запись с АЦП, это другая часть работы. Это отдельная песня, упомянул АЦП только потому, что хотел чтобы общее видение устройства сложилось. Повторюсь, сейчас пишу мусор. while(1) { delay(1000); SD_Write(temp,i++,1); GPIO_ToggleBits(GPIOD,GPIO_Pin_14); } Вот именно так сейчас выглядит main (опущены процедуры инициализации). Т.е. про АЦП забыли, нету его. Извиняюсь, если внес сумятицу упоминанием об АЦП. Зачем, действительно. Я создаю и пишу файл, который содержит 2 минуты записи с АЦП. Потом закрываю. Потом создаю новый без отрыва от считывания данных с АЦП и так далее. Требования такие. По поводу диаграмм. Смотрел на осцилле, неоднократно. Вот еще что. Название темы у нас SDIO+Bypass, а не отладка быстродействия карты памяти. Давайте будем обсуждать режим bypass, который надо запустить. А не сторонние вещи, вроде его необходимости в отдельно взятой программе. Это первая и не последняя работа с картами памяти. Чем больше я исследую сейчас SDIO, тем меньше придется изучать его потом.
  3. SDIO+Bypass STM32F4

    На данный момент именно обмен с картой надо довести до максимально возможного. Именно НИЗКОУРОВНЕВЫЕ функции надо оптимизировать/ускорить по максимуму. Я сейчас откинул в сторону ФС, отлаживаю только низкий уровень, обмен с картой. И кстати, переполнения при записи в файл идут именно в процессе чтения/записи, поэтому это я и полирую до блеска. Если речь идет о диаграммах в документации-то да, неоднократно. Вполне возможно, но на этом этапе моя задача отполировать SDIO, задействовать его по полной программе. Я понимаю, что библиотека FAT не оптимальна, но ведь SDIO должна быть доведена до конца, т.е. скорость обмена должна быть максимальна. Вот это мне не понятно. В режиме SPI при 24 МГц все тоже на соплях пролазило. Где-то задержка-буфер переполнен. Хотя запись шла вообще без ФС, просто по секторам. Нет, на карту пишется только файл, правда Вы я думаю понимаете, что запись через FAT это не запись по секторам, т.е. медленнее дело идет, записывается дополнительная информация. Ну вот смотрите: одна выборка - 5 мкс. Буфер может содержать до 40 тыс выборок, то бишь переполняется за 200 мс. Частота именно выкидывания данных должна быть где-то 10-20 КГц. Чем больше, тем меньше вероятности попасть в переполнение. Понятно, что карта пишет быстрее, иначе бы даже на соплях ничего бы не проходило. Но учитывая прихлопы ФАТ, открытие файла, заполнение, закрытие, итд итп скорость обмена заметно падает. Именно обмена, а не записи. То есть программа не оптимизирована, я согласен, наверняка в библиотеке есть места, которые можно выбросить или оптимизировать. НО! Сейчас, именно сейчас, стоит задача выжать все из SDIO, чтобы больше к нему не возвращаться. Именно данные пишутся с мегабитными скоростями. Сейчас. Но опрос скажем занятости карты, завершения записи-все это тоже требует времени. Т.е. все вкупе выполняется медленнее, чем хотелось бы. Поймите правильно, сейчас я вижу, что скорость обмена с картой можно увеличить, в том числе и для команд. И это надо реализовать, а не упереться в то что "не работает, ну и фиг с ним, займусь оптимизацией FAT". Вот я почему так настырно хочу увеличить частоту. После этого я переползу в FAT и спокойно буду оптимизировать его, зная что из SD выжат максимум, все что возможно.
  4. SDIO+Bypass STM32F4

    Как это без FIFO? В SDIO есть FIFO, другой вопрос почему оно не заполняется корректно, а после первой же итерации (судя по содержимому регистров) выплевывает ошибку. Причем именно в bypass режиме, в 24 МГц вежиме все классно, без затыков. Функции чтения/записи оптимизированы по самое нехочу, что там можно еще убрать-пока что непонятно. Прекрасно понимаю, надо считать данные с АЦП, сложить их в циклический буфер, читай программное FIFO, и успевать их выплевывать в файл, чтобы буфер не переполнялся. Частота считывания 200 КГц. Понимаю как работает DMA, но думаю, что оно не принесет ожидаемого прироста. А учитывая, что с DMA никогда не работал+требование руководства высказанное еще в пору AVR (раньше Xmega 64 была), экспериментировать не очень хочется, тем более не все выжато из SDIO. Понимаете, скорости обмена хватает. Но впритык. Поэтому хотелось бы иметь запасец, на случай долгого "отдыха" карты после записи итд, ну сами понимаете, всякое может быть, лучше выжать максимум. Поэтому и заморочился 48 МГц режимом. Хотя согласен с вами, некоторые вещи не совсем понятны на аппаратном уровне. DMA и SDIO к ним не относятся. Тут дело либо в непереведенной в "быстрый режим" карте (хотя почему команды проходят тогда?), либо в том, что опыты ставлю на дискавери, через проводки (укороченные, но все же...). Либо еще в чем-то мною неизведанном пока что.
  5. SDIO+Bypass STM32F4

    Genadi Zawidowski,DMA не используется по указанию свыше, т.е. руководитель проекта настоятельно не рекомендует его использовать. Почему-вопрос, но видимо есть причины. Сега, про Err Datasheet спасибо, просто не знал о его существовании, сейчас буду пробовать. О результатах отпишусь, может поможет кому. Спасибо. Сега сверился с ErrData. Биты выставлены именно так, т.е. BYPASS=1, NEGEDGE=0. Карта поддерживает 48 МГц, это UHS-I. Может быть, проблема в том, что я не перевел командой CMD6 в некий высокоскоростной режим?
  6. SDIO+Bypass STM32F4

    Здравствуйте уважаемые форумчане! Разбираюсь с SDIO режимом STM32F407VG. Встал вопрос скорости. Решил попробовать Bypass, т.е. брать чистые, неразделенные 48 MHz для тактирования карты. Команды вроде бы проходят, а вот взаимодействие (запись) с флеш-картой не завелось. Регулярно выбивается бит TXUNDERR, что говорит о незаполненности FIFO. Пользуюсь SPL, но даташит не игнорирую. Привожу код: 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 губит все быстродействие(( Заранее благодарю откликнувшихся.
×
×
  • Создать...