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

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





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



Цитата
в STM32 с их дохлой периферией без FIFO

Как это без FIFO? В SDIO есть FIFO, другой вопрос почему оно не заполняется корректно, а после первой же итерации (судя по содержимому регистров) выплевывает ошибку. Причем именно в bypass режиме, в 24 МГц вежиме все классно, без затыков. Функции чтения/записи оптимизированы по самое нехочу, что там можно еще убрать-пока что непонятно.
Цитата
Вы сами толком не понимаете что Вам надо

Прекрасно понимаю, надо считать данные с АЦП, сложить их в циклический буфер, читай программное FIFO, и успевать их выплевывать в файл, чтобы буфер не переполнялся. Частота считывания 200 КГц. Понимаю как работает DMA, но думаю, что оно не принесет ожидаемого прироста. А учитывая, что с DMA никогда не работал+требование руководства высказанное еще в пору AVR (раньше Xmega 64 была), экспериментировать не очень хочется, тем более не все выжато из SDIO.

Понимаете, скорости обмена хватает. Но впритык. Поэтому хотелось бы иметь запасец, на случай долгого "отдыха" карты после записи итд, ну сами понимаете, всякое может быть, лучше выжать максимум. Поэтому и заморочился 48 МГц режимом.

Хотя согласен с вами, некоторые вещи не совсем понятны на аппаратном уровне. DMA и SDIO к ним не относятся.
Тут дело либо в непереведенной в "быстрый режим" карте (хотя почему команды проходят тогда?), либо в том, что опыты ставлю на дискавери, через проводки (укороченные, но все же...). Либо еще в чем-то мною неизведанном пока что.
Go to the top of the page
 
+Quote Post



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

 


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


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