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

 
 
> SD/MMC, CSD и CID
hsx_Vlad
сообщение Dec 21 2007, 18:43
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 15-08-07
Пользователь №: 29 819



Подскажите пожалуйста почему не все карточки на ARMе отзываються на команды CMD10 и CMD9 и можноли это как то обойти?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
hsx_Vlad
сообщение Dec 31 2007, 11:05
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 15-08-07
Пользователь №: 29 819



Спасибо, но проблема чуть не в этом. Часть вычитывающая блок у меня работает нормально.

static DWORD MMC_read_block (u8 cmd, DWORD arg, u8 *buf, DWORD len)
{
DWORD res = CARD_ERROR;
DWORD i, k, indx;
u8 constval = 0xFF;
k = 0;
i = 0;
res = CARD_ERROR;
sd_att = SD_MAX_ATT;
do
{
SD_SELECT_CARD;
cmd_buf[0] = 0xFF;
cmd_buf[1] = 0xFF;
cmd_buf[2] = 0xFF;
cmd_buf[3] = 0xFF;
cmd_buf[4] = cmd;
cmd_buf[5] = (arg >> 24);
cmd_buf[6] = (arg >> 16);
cmd_buf[7] = (arg >> 8);
cmd_buf[8] = (arg);
cmd_buf[9] = 0xFF;
cmd_buf[10] = 0xFF;
cmd_buf[11] = 0xFF;
cmd_buf[12] = 0xFF; // Cb_end, Cb_transfer_err функции изменяющие значение ssp_flgs
ssp_flgs = 0; // Устанавливается в прерывании DMA в значения SSP_DONE или SSP_TX_ERR
Start_dma_read_from_SSPSD(cmd_buf, 13, Cb_end, Cb_transfer_err); // После этого чтения в буфере
Start_dma_write_to_SSPSD(cmd_buf, 13, 0, Cb_transfer_err); // 11 байт должен стать равным 0 если все нормально
while ( (ssp_flgs&(SSP_DONE|SSP_TX_ERR))==0 ); // количество данных, которые необходимо прочитать извесны 13, а становиться либо 11 либо 12
if(ssp_flgs&SSP_TX_ERR ) goto exit__;
if ( ((cmd_buf[11] & 0x80)==0) || ((cmd_buf[12] & 0x80)==0))

{
if(cmd_buf[11]!=0 && cmd_buf[12]!=0)
{
res = cmd_buf[i];
goto exit__;
}
sd_ratt = SD_MAX_RATT;
do
{
ssp_flgs = 0;
Start_dma_read_from_SSPSD(cmd_buf, READ_WAIT_LEN, Cb_end, Cb_transfer_err);
Start_dma_write_const_to_SSPSD(&constval, READ_WAIT_LEN, 0, Cb_transfer_err);
while((ssp_flgs&(SSP_DONE|SSP_TX_ERR))==0 );
if(ssp_flgs&SSP_TX_ERR ) goto exit__;
for ( i=0;i<READ_WAIT_LEN;i++ )
{
if ( cmd_buf[i] == 0xFE )
{
k = i + 1;
break;
}
}
if ( cmd_buf[i] == 0xFE ) break;
sd_ratt--;
if ( sd_ratt==0 ) goto exit_att__;
}
while ( 1 );
indx = 0;
for ( i=k;i<READ_WAIT_LEN;i++ )
{
buf[indx++] = cmd_buf[i];
if ( indx==len ) break;
}
if ( indx!=len )
{
ssp_flgs = 0;
Start_dma_read_from_SSPSD(&buf[indx], len - indx, Cb_end, Cb_transfer_err);
Start_dma_write_const_to_SSPSD(&constval, len - indx, 0, Cb_transfer_err);
while ( (ssp_flgs&(SSP_DONE|SSP_TX_ERR))==0 );
if ( ssp_flgs&SSP_TX_ERR) goto exit__;
}
ssp_flgs = 0;
Start_dma_read_from_SSPSD(cmd_buf, 3, Cb_end, Cb_transfer_err);
Start_dma_write_const_to_SSPSD(&constval, 3, 0, Cb_transfer_err);
while ( (ssp_flgs&(SSP_DONE|SSP_TX_ERR))==0 );
if ( ssp_flgs&SSP_TX_ERR ) goto exit__;
res = CARD_OK;
goto exit__;
}
exit_att__: SD_UNSELECT_CARD;
sd_att--;
}
while ( sd_att!=0 );
exit__: SD_UNSELECT_CARD;
return res;
}

Сообщение отредактировал hsx_Vlad - Dec 31 2007, 11:08
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 31 2007, 12:26
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(hsx_Vlad @ Dec 31 2007, 13:05) *
Часть вычитывающая блок у меня работает нормально.

Нет.

В качестве Новогоднего подарка еще два кусочка исходников опять таки с таймаутами и готовностями smile.gif кои с ..... ну, скажем, упорством достойным лучшего применения Вы пытаетесь игнорировать.

Код
//---------------------------------------------------------------------------
// Send a command to MMC
//---------------------------------------------------------------------------
static BYTE send_cmd( BYTE cmd, DWORD arg )
{
BYTE nn;
BYTE res;

    if( wait_ready() )
        return( 0x8F );

    // Send command packet
    mmc_sendbyte( cmd );                       // Command
    
    mmc_sendbyte( arg >> 24 );        // Argument[31..24]
    mmc_sendbyte( arg >> 16 );        // Argument[23..16]
    mmc_sendbyte( arg >> 8  );      // Argument[15...8]
    mmc_sendbyte( arg       );        // Argument[7....0]
    
    if( cmd == CMD0_RESET )
        nn = 0x95;            // CRC for CMD0  (0)
    else if( cmd == CMD8_IF_V2 )
        nn = 0x87;            // CRC for CMD8 (0x1AA)
    else
        nn = 0x00;
                    
    mmc_sendbyte( nn );

    // Receive command response
    if( cmd == CMD12_STOP_TX )
        mmc_sendbyte( 0xFF );            // Skip a stuff byte when stop reading
    
    // Wait for a valid response in timeout of 10 attempts    
    nn = 10;                                
    do
    {    res = mmc_sendbyte( 0xFF );
    
    }
    while( ( res & R1_NOTVALID )&&( --nn ) );

    return( res );                        // Return with the response value
}

//---------------------------------------------------------------------------
// Wait for card ready  
//---------------------------------------------------------------------------
static int wait_ready(void)
{
// Wait for ready in timeout
ulong timer = xGetTimeout_ms( SD_READY_TIME_OUT );            
BYTE ret;    
    mmc_sendbyte( 0xFF );
    
    do
    {   ret = mmc_sendbyte( 0xFF );
        if( ret == 0xFF )
            return( 0 );                
    }
    while( xIsTimeout( timer ) == FALSE );
    return( 1 );
}


Moderator:
Воздержитесь от постов длиных (воспользуйтесь возможностями приложений) невнятных неформатированных (ознакомьтесь с возможностями тэгов) кусков исходных текстов.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- hsx_Vlad   SD/MMC   Dec 21 2007, 18:43
- - KuzmaPrytkov   Цитата(hsx_Vlad @ Dec 21 2007, 22:43) Под...   Dec 21 2007, 18:59
|- - zltigo   Цитата(KuzmaPrytkov @ Dec 21 2007, 20:59)...   Dec 21 2007, 19:22
- - hsx_Vlad   Цитата(zltigo @ Dec 21 2007, 22:22) Не на...   Dec 21 2007, 19:48
|- - zltigo   Цитата(hsx_Vlad @ Dec 21 2007, 21:48) Чег...   Dec 21 2007, 20:10
- - hsx_Vlad   Написано на С, команды действительно 16-ти байтины...   Dec 21 2007, 21:48
|- - zltigo   Цитата(hsx_Vlad @ Dec 21 2007, 23:48) Нап...   Dec 21 2007, 22:01
- - rv3dll(lex)   насчёт SPI режима не скажу - на всех раттах кот...   Dec 24 2007, 05:40
- - hsx_Vlad   С причиной неработоспособности я разобрался, работ...   Dec 26 2007, 10:50
|- - rv3dll(lex)   Цитата(hsx_Vlad @ Dec 26 2007, 13:50) С п...   Dec 26 2007, 11:07
|- - gotty   Цитата(hsx_Vlad @ Dec 26 2007, 12:50) С п...   Dec 26 2007, 11:08
|- - zltigo   Цитата(gotty @ Dec 26 2007, 13:08) по ...   Dec 28 2007, 21:38
- - hsx_Vlad   Цитата(gotty @ Dec 26 2007, 14:08) Предпо...   Dec 28 2007, 20:39
- - rv3dll(lex)   у меня куча всего - но этого думаю достаточно   Dec 29 2007, 05:19
- - hsx_Vlad   С работоспособностью разобрался, задержка не приче...   Dec 30 2007, 21:22
|- - zltigo   Цитата(hsx_Vlad @ Dec 30 2007, 23:22) Вот...   Dec 30 2007, 21:29
- - hsx_Vlad   насколько я знаю, дма генерит приерывание только в...   Dec 30 2007, 21:40
|- - zltigo   Цитата(hsx_Vlad @ Dec 30 2007, 23:40) нас...   Dec 30 2007, 21:48
- - hsx_Vlad   а что есть DATA_TOKEN_17_18_24?   Dec 30 2007, 22:03
|- - zltigo   Цитата(hsx_Vlad @ Dec 31 2007, 00:03) а ч...   Dec 30 2007, 22:14
- - hsx_Vlad   Спасибо, вот это меня как раз и интерисовало, полу...   Dec 31 2007, 13:21
- - zltigo   Цитата(hsx_Vlad @ Dec 31 2007, 15:21) пол...   Dec 31 2007, 14:16


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

 


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


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