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

 
 
> 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



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

 


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


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