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

 
 
> 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, 06:29
Сообщение #2





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



Genadi Zawidowski,DMA не используется по указанию свыше, т.е. руководитель проекта настоятельно не рекомендует его использовать. Почему-вопрос, но видимо есть причины.
Сега, про Err Datasheet спасибо, просто не знал о его существовании, сейчас буду пробовать. О результатах отпишусь, может поможет кому.
Спасибо.

Сега сверился с ErrData.
Цитата
In high speed communication mode, when SDIO_CK is equal to 48 MHz
(PLL48_output = 48 MHz), the BYPASS bit is equal to ‘1’ and the NEGEDGE bit is equal to
‘0’ (respectively bit 10 and bit 13 in the SDIO_CLKCR register), the hold timing at the I/O pin
is not aligned with the SD/MMC 2.0 specifications.

Биты выставлены именно так, т.е. BYPASS=1, NEGEDGE=0. Карта поддерживает 48 МГц, это UHS-I.
Может быть, проблема в том, что я не перевел командой CMD6 в некий высокоскоростной режим?


Сообщение отредактировал Hedgehog - Oct 17 2016, 06:30
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 17 2016, 07:33
Сообщение #3


Гуру
******

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



Цитата(Hedgehog @ Oct 17 2016, 09:29) *
Genadi Zawidowski,DMA не используется по указанию свыше, т.е. руководитель проекта настоятельно не рекомендует его использовать. Почему-вопрос, но видимо есть причины.

smile3009.gif жесть какая.... Видимо начальник сам пробовал и у него не получилось.... или слышал звон...
Чувствуется - Вы сами толком не понимаете что Вам надо и как это работает.
Вообще-то DMA, при правильно организованной системе, нужен для разгрузки CPU. А на увеличение скорости обмена он напрямую не влияет.
Хотя.... в STM32 с их дохлой периферией без FIFO может быть всякое.....
Тупое увеличение частоты может совсем не принести нужного эффекта. Сначала нужно найти узкое место - где именно тормозит? И как построена работа с картой? И решить для себя вопрос - а сколько нужно-то (скорости)?
Возможно тогда поможет просто переписывание lowlevel-функций обмена с картой, ниже файловой системы. А также кеширование дисковых операций на этом уровне.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 1st August 2025 - 00:28
Рейтинг@Mail.ru


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