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

|
Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ?
В смысле, можно ли при выполнении, например, команды CMD17 послать на карту все 520 байт (естественно, одновременно при этом читая) одним равномерным потоком битов ?
Я понимаю, что с вероятностью практически 100% можно, но сбивают с толку картинки, на которых всегда нарисованы увеличенные паузы между отдельными байтам. Пытаюсь читать стандартную спецификацию, но даже сокращенный вариант с непривычки еще то чтиво...
Вопрос возник, так как после переделки моей схемы с побайтовой работы на поблочную что-то работать пока не желает, вот и пытаюсь понять, в каком направлении разбираться...
|
|
|
|
|
 |
Ответов
|
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, 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); }
|
|
|
|
Сообщений в этой теме
justontime SD карта через SPI Jan 25 2015, 06:46 smalcom посмотрите реализацию от ChaN'а. Там код не сл... Jan 25 2015, 08:43 justontime Цитата(smalcom @ Jan 25 2015, 11:43) ЕМНИ... Jan 25 2015, 08:53 smalcom например так:
1. отправили данные сектора
2. в цик... Jan 25 2015, 14:56 justontime Цитата(smalcom @ Jan 25 2015, 17:56) напр... Jan 25 2015, 15:09 smalcom именно потоком это и делается
http://elm-chan.org/... Jan 25 2015, 15:48 justontime Цитата(smalcom @ Jan 25 2015, 18:48) имен... Jan 25 2015, 16:28 jcxz Цитата(justontime @ Jan 25 2015, 12:46) В... Jan 27 2015, 03:40 ДЕЙЛ Недавно имел дело с SD-картой. Осциллографом смотр... Jan 27 2015, 13:37 justontime Как и следовало ожидать, все заработало без всяких... Jan 28 2015, 12:25 justontime А вот еще вопрос из этой серии - наоборот, можно л... Jan 30 2015, 16:48 smalcom проверьте уже - это быстрее, чем прочитать то, что... Jan 31 2015, 08:40 justontime Цитата(smalcom @ Jan 31 2015, 11:40) пров... Jan 31 2015, 10:17 smalcom значит у вас много времени. почитайте документацию... Jan 31 2015, 12:02 justontime Цитата(smalcom @ Jan 31 2015, 15:02) знач... Jan 31 2015, 13:42  jukebox Возможно немного не по теме,но это тоже связано с ... May 8 2015, 08:09 UDmitry Касательно записи на SD карту могу вам сказать, чт... Jun 17 2015, 18:55 jukebox Итак, позанимался с Flash AT25FD041A.Есть некоторо... Jul 7 2015, 16:23  jcxz Цитата(jukebox @ Jul 7 2015, 22:23) CS на... Jul 8 2015, 03:51   jukebox Цитата(jcxz @ Jul 8 2015, 04:51) Во время... Jul 15 2015, 17:49 MiklPolikov Цитата(justontime @ Jan 25 2015, 09:46) В... Jul 8 2015, 04:29 toweroff Цитата(MiklPolikov @ Jul 8 2015, 07:29) Н... Jul 8 2015, 15:10  MiklPolikov Цитата(toweroff @ Jul 8 2015, 18:10) а ес... Jul 8 2015, 16:43   jcxz Цитата(MiklPolikov @ Jul 8 2015, 22:43) П... Jul 10 2015, 07:30
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|