justontime 0 25 января, 2015 Опубликовано 25 января, 2015 · Жалоба Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ? В смысле, можно ли при выполнении, например, команды CMD17 послать на карту все 520 байт (естественно, одновременно при этом читая) одним равномерным потоком битов ? Я понимаю, что с вероятностью практически 100% можно, но сбивают с толку картинки, на которых всегда нарисованы увеличенные паузы между отдельными байтам. Пытаюсь читать стандартную спецификацию, но даже сокращенный вариант с непривычки еще то чтиво... Вопрос возник, так как после переделки моей схемы с побайтовой работы на поблочную что-то работать пока не желает, вот и пытаюсь понять, в каком направлении разбираться... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 25 января, 2015 Опубликовано 25 января, 2015 · Жалоба посмотрите реализацию от ChaN'а. Там код не сложный и, в принципе, основные внутренности видно в одном-двух файлах. ЕМНИП программные паузы не используются, но запрашивается состояние карты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
justontime 0 25 января, 2015 Опубликовано 25 января, 2015 · Жалоба ЕМНИП программные паузы не используются, но запрашивается состояние карты. Э-э... А как можно запросить состояние карты посредине процесса чтения блока ? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 25 января, 2015 Опубликовано 25 января, 2015 · Жалоба Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ? Я байты не разделял ни паузами ни выбором кристалла. В смысле, можно ли при выполнении, например, команды CMD17 послать на карту все 520 байт (естественно, одновременно при этом читая) одним равномерным потоком битов ? Я команды посылал отдельно, 512 байт данных отдельно по ПДП - работало. посмотрите реализацию от ChaN'а. Там код не сложный... В некоторых МК паузы и подсветка байта при помощи выбора кристалла задаются режимами работы SPI так что код не всегда может помочь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
justontime 0 25 января, 2015 Опубликовано 25 января, 2015 · Жалоба Я байты не разделял ни паузами ни выбором кристалла. Я команды посылал отдельно, 512 байт данных отдельно по ПДП - работало. Вообще я именно так и пытаюсь сделать. А у Вас ПДП сплошным потоком битов работал, или все-таки с паузами между байтами ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 25 января, 2015 Опубликовано 25 января, 2015 · Жалоба например так: 1. отправили данные сектора 2. в цикле проверяем статус Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
justontime 0 25 января, 2015 Опубликовано 25 января, 2015 · Жалоба например так: 1. отправили данные сектора 2. в цикле проверяем статус Т.е. шла речь о проверке статуса не при чтении/записи данных, а после засылки команды ? Вообще интересует, в первую очередь, возможность посылки именно блока данных сплошным битовым потоком, без пауз между байтами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 25 января, 2015 Опубликовано 25 января, 2015 · Жалоба именно потоком это и делается http://elm-chan.org/fsw/ff/en/dwrite.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
justontime 0 25 января, 2015 Опубликовано 25 января, 2015 · Жалоба именно потоком это и делается http://elm-chan.org/fsw/ff/en/dwrite.html Я не вижу там ничего насчет физической организации процесса, а более высокий уровень меня никаким боком не интересует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 25 января, 2015 Опубликовано 25 января, 2015 · Жалоба Вообще я именно так и пытаюсь сделать. А у Вас ПДП сплошным потоком битов работал, или все-таки с паузами между байтами ? Я работал на 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 27 января, 2015 Опубликовано 27 января, 2015 · Жалоба Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ? Нет конечно. Я понимаю, что с вероятностью практически 100% можно, но сбивают с толку картинки, на которых всегда нарисованы увеличенные паузы между отдельными байтам. Пытаюсь читать стандартную На картинках может быть что угодно нарисовано. Если-бы были нужны паузы, об этом явно указано было-бы в тексте и указаны их длительности. К тому-же - это бред полный, ибо не ложилось-бы никак на работу с DMA, были-бы жуткие тормоза и т.п. Логическое мышление иногда полезно включать. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 32 27 января, 2015 Опубликовано 27 января, 2015 · Жалоба Недавно имел дело с SD-картой. Осциллографом смотрел картинку - после команды чтения никаких пауз не видел. Думаю, что если они и возможны, то только как вынужденные, когда выполняется обработка принятого байта или при заполнении буфера, если используется аппаратный интерфейс работы с картой. Частота тактирования начинается от 0 герц, поэтому ничего не случится, если будет приостановка. Для большей убедительности подпаяльте провода МГТФ к данным сигналом в заводском девайсе и полюбуйтесь картинкой на осциллографе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
justontime 0 28 января, 2015 Опубликовано 28 января, 2015 · Жалоба Как и следовало ожидать, все заработало без всяких пауз, равномерным потоком битов... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
justontime 0 30 января, 2015 Опубликовано 30 января, 2015 · Жалоба А вот еще вопрос из этой серии - наоборот, можно ли произвольно поднимать CS и опускать его обратно между связанными командами ? В смысле, например, опустить CS, выдать команду чтения блока, поднять CS, опустить его обратно и после этого уже непомредственно прочитать блок ? Или же такое переключение CS сбросит весь процесс ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 31 января, 2015 Опубликовано 31 января, 2015 · Жалоба проверьте уже - это быстрее, чем прочитать то, что вам уже дали или дожидаться ответа от форума. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться