реклама на сайте
подробности

 
 
> SDIO+Bypass STM32F4
Hedgehog
сообщение Oct 15 2016, 13:35
Сообщение #1





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Hedgehog
сообщение Oct 17 2016, 09:09
Сообщение #2





Группа: Участник
Сообщений: 6
Регистрация: 15-10-16
Пользователь №: 93 770



Цитата
Что именно надо ускорить?


На данный момент именно обмен с картой надо довести до максимально возможного. Именно НИЗКОУРОВНЕВЫЕ функции надо оптимизировать/ускорить по максимуму. Я сейчас откинул в сторону ФС, отлаживаю только низкий уровень, обмен с картой. И кстати, переполнения при записи в файл идут именно в процессе чтения/записи, поэтому это я и полирую до блеска.
Цитата
Вы вообще смотрели временные диаграммы обмена по шине?


Если речь идет о диаграммах в документации-то да, неоднократно.
Цитата
Вы роете совсем не в том направлении.


Вполне возможно, но на этом этапе моя задача отполировать SDIO, задействовать его по полной программе. Я понимаю, что библиотека FAT не оптимальна, но ведь SDIO должна быть доведена до конца, т.е. скорость обмена должна быть максимальна.
Цитата
как именно поток данных с АЦП на 200кГц может перегрузить карту работающую на 24МГц


Вот это мне не понятно. В режиме SPI при 24 МГц все тоже на соплях пролазило. Где-то задержка-буфер переполнен. Хотя запись шла вообще без ФС, просто по секторам.
Цитата
Или у Вас несколько каналов или Вы ещё какие-то данные пишете на карту вместе?


Нет, на карту пишется только файл, правда Вы я думаю понимаете, что запись через FAT это не запись по секторам, т.е. медленнее дело идет, записывается дополнительная информация.
Цитата
Ещё раз вопрос - какие всё-таки требования по скорости записи?


Ну вот смотрите: одна выборка - 5 мкс. Буфер может содержать до 40 тыс выборок, то бишь переполняется за 200 мс. Частота именно выкидывания данных должна быть где-то 10-20 КГц. Чем больше, тем меньше вероятности попасть в переполнение. Понятно, что карта пишет быстрее, иначе бы даже на соплях ничего бы не проходило. Но учитывая прихлопы ФАТ, открытие файла, заполнение, закрытие, итд итп скорость обмена заметно падает. Именно обмена, а не записи. То есть программа не оптимизирована, я согласен, наверняка в библиотеке есть места, которые можно выбросить или оптимизировать. НО! Сейчас, именно сейчас, стоит задача выжать все из SDIO, чтобы больше к нему не возвращаться.

Цитата
какова скорость потока записываемых данных?


Именно данные пишутся с мегабитными скоростями. Сейчас. Но опрос скажем занятости карты, завершения записи-все это тоже требует времени. Т.е. все вкупе выполняется медленнее, чем хотелось бы.

Поймите правильно, сейчас я вижу, что скорость обмена с картой можно увеличить, в том числе и для команд. И это надо реализовать, а не упереться в то что "не работает, ну и фиг с ним, займусь оптимизацией FAT". Вот я почему так настырно хочу увеличить частоту. После этого я переползу в FAT и спокойно буду оптимизировать его, зная что из SD выжат максимум, все что возможно.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 17 2016, 09:32
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Hedgehog @ Oct 17 2016, 12:09) *
Я сейчас откинул в сторону ФС, отлаживаю только низкий уровень, обмен с картой. И кстати, переполнения при записи в файл идут именно в процессе чтения/записи, поэтому это я и полирую до блеска.

Ну это и правильно - вначале надо отладить процесс обмена с картой без ФС.
Если у Вас идут переполнения, да ещё при таком огромном буфере (на 200 мсек), то смотрите временные диаграммы работы карты. А именно - время выполнения операций записи/стирания. Возможно у Вас тормоза именно в моменты когда карта внутренне пишет данные или стирает перед ними. Возможно надо ей давать команды предварительного стирания блоков (я работал с SD давно - деталей не помню). Попробуйте разные карты. Посмотрите в CSD всё что касается размеров блоков стирания и времён.
Карта при такой внутренней записи/стирании долго не выдаёт сигнал готовности.

Цитата(Hedgehog @ Oct 17 2016, 12:09) *
Если речь идет о диаграммах в документации-то да, неоднократно.

Речь не о диаграммах в доках, а о диаграммах на экране осциллографа или логического анализатора. Сигналов на шине SDIO.

Цитата(Hedgehog @ Oct 17 2016, 12:09) *
Нет, на карту пишется только файл, правда Вы я думаю понимаете, что запись через FAT это не запись по секторам, т.е. медленнее дело идет, записывается дополнительная информация.

Блин! Опять 25!
Мы здесь не телепаты чтобы знать как Вы эти свои 200kS/s выборок АЦП на карту пишете!
Это у Вас там все исходники и если спрашиваете помощи, то непонятно почему и тогда толком не расскажете что именно делаете?
Какова разрядность данных с АЦП? Сколько каналов АЦП? Как пишете просто бинарные данные или в текстовый вид преобразуете или ещё какую инфу к ним добавляете?
Т.е. - какова требуемая скорость потока записи в байтах/сек??? Я уже не знаю как ещё понятнее спросить.....

Цитата(Hedgehog @ Oct 17 2016, 12:09) *
Ну вот смотрите: одна выборка - 5 мкс. Буфер может содержать до 40 тыс выборок, то бишь переполняется за 200 мс.

Ну что-ж - размер буфера выбран вроде достаточным.

Цитата(Hedgehog @ Oct 17 2016, 12:09) *
Но учитывая прихлопы ФАТ, открытие файла, заполнение, закрытие, итд итп скорость обмена заметно падает. Именно обмена, а не записи.

Стоп! А вы что при записи каждой порции данных потока данных в файл его открываете/закрываете? а зачем??
А так - операции с FAT ускоряются например кешированием содержимого карты в ОЗУ.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 18:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01379 секунд с 7
ELECTRONIX ©2004-2016