Перейти к содержанию
    

Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ?

 

В смысле, можно ли при выполнении, например, команды CMD17 послать на карту все 520 байт (естественно, одновременно при этом читая) одним равномерным потоком битов ?

 

Я понимаю, что с вероятностью практически 100% можно, но сбивают с толку картинки, на которых всегда нарисованы увеличенные паузы между отдельными байтам. Пытаюсь читать стандартную спецификацию, но даже сокращенный вариант с непривычки еще то чтиво...

 

Вопрос возник, так как после переделки моей схемы с побайтовой работы на поблочную что-то работать пока не желает, вот и пытаюсь понять, в каком направлении разбираться...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

посмотрите реализацию от ChaN'а. Там код не сложный и, в принципе, основные внутренности видно в одном-двух файлах.

ЕМНИП программные паузы не используются, но запрашивается состояние карты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЕМНИП программные паузы не используются, но запрашивается состояние карты.

 

Э-э... А как можно запросить состояние карты посредине процесса чтения блока ? :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ?

Я байты не разделял ни паузами ни выбором кристалла.

 

В смысле, можно ли при выполнении, например, команды CMD17 послать на карту все 520 байт (естественно, одновременно при этом читая) одним равномерным потоком битов ?

Я команды посылал отдельно, 512 байт данных отдельно по ПДП - работало.

 

посмотрите реализацию от ChaN'а. Там код не сложный...

В некоторых МК паузы и подсветка байта при помощи выбора кристалла задаются режимами работы SPI так что код не всегда может помочь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я байты не разделял ни паузами ни выбором кристалла.

 

Я команды посылал отдельно, 512 байт данных отдельно по ПДП - работало.

 

Вообще я именно так и пытаюсь сделать. А у Вас ПДП сплошным потоком битов работал, или все-таки с паузами между байтами ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

например так:

1. отправили данные сектора

2. в цикле проверяем статус

 

Т.е. шла речь о проверке статуса не при чтении/записи данных, а после засылки команды ?

 

Вообще интересует, в первую очередь, возможность посылки именно блока данных сплошным битовым потоком, без пауз между байтами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

именно потоком это и делается

http://elm-chan.org/fsw/ff/en/dwrite.html

 

Я не вижу там ничего насчет физической организации процесса, а более высокий уровень меня никаким боком не интересует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще я именно так и пытаюсь сделать. А у Вас ПДП сплошным потоком битов работал, или все-таки с паузами между байтами ?

 

Я работал на AT91SAM7S64, насколько я понимаю он ставит паузы только при смене CS, а он у меня ручками переключался.

Запись по ПДП и посылка команд у меня тогда не получилась, а вот скоростное чтение - работало:

 

inline void if_spiOFF(void) {AT91C_BASE_PIOA->PIO_SODR = CS0;} // set high 
inline void if_spiON(void) {AT91C_BASE_PIOA->PIO_CODR = CS0;} // set low 

void if_spiInit(hwInterface_t *iface)
{
euint8 i;

AT91PS_SPI pSPI	  = AT91C_BASE_SPI;
AT91PS_PIO pPIOA	 = AT91C_BASE_PIOA;
AT91PS_PMC pPMC	  = AT91C_BASE_PMC;
pPIOA->PIO_PDR = AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK; //  | NCPS_PDR_BIT;
pPIOA->PIO_ASR = AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK; /// not here: | NCPS_ASR_BIT;

pPIOA->PIO_SODR = CS0; // set high
pPMC->PMC_PCER = ( (euint32) 1 << AT91C_ID_SPI ); // n.b. IDs are just bit-numbers
pSPI->SPI_CR = AT91C_SPI_SPIEN | AT91C_SPI_SWRST;

pSPI->SPI_MR  = AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED | AT91C_SPI_MODFDIS;

pSPI->SPI_MR |= ( (SPI_MR_PCS<<16) & AT91C_SPI_PCS ); // set PCS

pSPI->SPI_CSR[0] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8;
if_spiSetSpeed(0xFE); // slow during init


pSPI->SPI_CR = AT91C_SPI_SPIEN; // enable
for(i=0;i<21;i++) {if_spiSend(iface,0xFF);} // Send 20 spi commands with card not selected 
pPIOA->PIO_CODR = CS0;// NCPS_PDR_BIT; // clear
} 

void sd_spiPDC_RD512(hwInterface_t *iface,u08 *buf,u16 len)
{
u32 i;
u08 *p;

if (len==0) return;

p=&SpiMem[0]; for(i=0;i<514;i++) p[i]=0xFF;

while( !( AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE ) ); // transfer compl. wait

AT91C_BASE_SPI->SPI_PTCR=AT91C_PDC_TXTDIS|AT91C_PDC_RXTDIS;
AT91C_BASE_SPI->SPI_TPR=&SpiMem[0]; 
AT91C_BASE_SPI->SPI_RPR=&SpiMemR[0];
AT91C_BASE_SPI->SPI_RCR=514;	
AT91C_BASE_SPI->SPI_TCR=514; 
AT91C_BASE_SPI->SPI_PTCR=AT91C_PDC_TXTEN|AT91C_PDC_RXTEN;
while( !( AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RXBUFF ) ); // transfer compl. wait

p=&SpiMemR[0];
for(i=0;i<len;i++) buf[i]=p[i];
//Wait(100);
//while(AT91C_BASE_SPI->SPI_RCR!=0 ); // transfer compl. wait
}

esint8 sd_readSectorM(hwInterface_t *iface,euint32 address, euint8* buf, euint16 len)
{
static u32 oldaddress=0xfffffff0;
u08 cardresp;
u08 firstblock;
u16 fb_timeout=0xffff;
u32 place;

if ((oldaddress+1)!=address)
{
sd_Command(iface,12, 0,0); //STOP_TRANSMISSION
cardresp=sd_Resp8b(iface); // Card response 
place=512*address;

sd_Command(iface,18, (euint16) (place >> 16), (euint16) place); //READ_MULTIPLE_BLOCK
cardresp=sd_Resp8b(iface); // Card response 
if(cardresp!=0x00) 	{sd_Resp8bError(iface,cardresp);return(-1);}
}

// Wait for startblock 
do
firstblock=sd_Resp8b(iface); 
while(firstblock==0xff && fb_timeout--);

if( firstblock!=0xfe) 	{sd_Resp8bError(iface,firstblock);return(-1);}
sd_spiPDC_RD512(iface,&buf[0],len);
oldaddress=address;
return(0);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ?

Нет конечно.

 

Я понимаю, что с вероятностью практически 100% можно, но сбивают с толку картинки, на которых всегда нарисованы увеличенные паузы между отдельными байтам. Пытаюсь читать стандартную

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

К тому-же - это бред полный, ибо не ложилось-бы никак на работу с DMA, были-бы жуткие тормоза и т.п.

Логическое мышление иногда полезно включать. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Недавно имел дело с SD-картой. Осциллографом смотрел картинку - после команды чтения никаких пауз не видел. Думаю, что если они и возможны, то только как вынужденные, когда выполняется обработка принятого байта или при заполнении буфера, если используется аппаратный интерфейс работы с картой. Частота тактирования начинается от 0 герц, поэтому ничего не случится, если будет приостановка. Для большей убедительности подпаяльте провода МГТФ к данным сигналом в заводском девайсе и полюбуйтесь картинкой на осциллографе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как и следовало ожидать, все заработало без всяких пауз, равномерным потоком битов...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот еще вопрос из этой серии - наоборот, можно ли произвольно поднимать CS и опускать его обратно между связанными командами ? В смысле, например, опустить CS, выдать команду чтения блока, поднять CS, опустить его обратно и после этого уже непомредственно прочитать блок ? Или же такое переключение CS сбросит весь процесс ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проверьте уже - это быстрее, чем прочитать то, что вам уже дали или дожидаться ответа от форума.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...