|
SD карта через SPI |
|
|
|
Jan 25 2015, 06:46
|
Местный
  
Группа: Свой
Сообщений: 254
Регистрация: 6-12-14
Из: СПб
Пользователь №: 84 003

|
Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ?
В смысле, можно ли при выполнении, например, команды CMD17 послать на карту все 520 байт (естественно, одновременно при этом читая) одним равномерным потоком битов ?
Я понимаю, что с вероятностью практически 100% можно, но сбивают с толку картинки, на которых всегда нарисованы увеличенные паузы между отдельными байтам. Пытаюсь читать стандартную спецификацию, но даже сокращенный вариант с непривычки еще то чтиво...
Вопрос возник, так как после переделки моей схемы с побайтовой работы на поблочную что-то работать пока не желает, вот и пытаюсь понять, в каком направлении разбираться...
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jan 25 2015, 12:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(justontime @ Jan 25 2015, 09:46)  Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ? Я байты не разделял ни паузами ни выбором кристалла. Цитата(justontime @ Jan 25 2015, 09:46)  В смысле, можно ли при выполнении, например, команды CMD17 послать на карту все 520 байт (естественно, одновременно при этом читая) одним равномерным потоком битов ? Я команды посылал отдельно, 512 байт данных отдельно по ПДП - работало. Цитата посмотрите реализацию от ChaN'а. Там код не сложный... В некоторых МК паузы и подсветка байта при помощи выбора кристалла задаются режимами работы SPI так что код не всегда может помочь.
|
|
|
|
|
Jan 25 2015, 13:23
|
Местный
  
Группа: Свой
Сообщений: 254
Регистрация: 6-12-14
Из: СПб
Пользователь №: 84 003

|
Цитата(_4afc_ @ Jan 25 2015, 15:47)  Я байты не разделял ни паузами ни выбором кристалла.
Я команды посылал отдельно, 512 байт данных отдельно по ПДП - работало. Вообще я именно так и пытаюсь сделать. А у Вас ПДП сплошным потоком битов работал, или все-таки с паузами между байтами ?
|
|
|
|
|
Jan 25 2015, 15:09
|
Местный
  
Группа: Свой
Сообщений: 254
Регистрация: 6-12-14
Из: СПб
Пользователь №: 84 003

|
Цитата(smalcom @ Jan 25 2015, 17:56)  например так: 1. отправили данные сектора 2. в цикле проверяем статус Т.е. шла речь о проверке статуса не при чтении/записи данных, а после засылки команды ? Вообще интересует, в первую очередь, возможность посылки именно блока данных сплошным битовым потоком, без пауз между байтами.
|
|
|
|
|
Jan 25 2015, 18:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(justontime @ Jan 25 2015, 16:23)  Вообще я именно так и пытаюсь сделать. А у Вас ПДП сплошным потоком битов работал, или все-таки с паузами между байтами ? Я работал на AT91SAM7S64, насколько я понимаю он ставит паузы только при смене CS, а он у меня ручками переключался. Запись по ПДП и посылка команд у меня тогда не получилась, а вот скоростное чтение - работало: CODE 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); }
|
|
|
|
|
Jan 27 2015, 03:40
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(justontime @ Jan 25 2015, 12:46)  Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ? Нет конечно. Цитата(justontime @ Jan 25 2015, 12:46)  Я понимаю, что с вероятностью практически 100% можно, но сбивают с толку картинки, на которых всегда нарисованы увеличенные паузы между отдельными байтам. Пытаюсь читать стандартную На картинках может быть что угодно нарисовано. Если-бы были нужны паузы, об этом явно указано было-бы в тексте и указаны их длительности. К тому-же - это бред полный, ибо не ложилось-бы никак на работу с DMA, были-бы жуткие тормоза и т.п. Логическое мышление иногда полезно включать.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|