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

 
 
> SD карта через SPI
justontime
сообщение Jan 25 2015, 06:46
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 254
Регистрация: 6-12-14
Из: СПб
Пользователь №: 84 003



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

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

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

Вопрос возник, так как после переделки моей схемы с побайтовой работы на поблочную что-то работать пока не желает, вот и пытаюсь понять, в каком направлении разбираться...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_4afc_
сообщение Jan 25 2015, 12:47
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 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 так что код не всегда может помочь.
Go to the top of the page
 
+Quote Post
justontime
сообщение Jan 25 2015, 13:23
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 254
Регистрация: 6-12-14
Из: СПб
Пользователь №: 84 003



Цитата(_4afc_ @ Jan 25 2015, 15:47) *
Я байты не разделял ни паузами ни выбором кристалла.

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


Вообще я именно так и пытаюсь сделать. А у Вас ПДП сплошным потоком битов работал, или все-таки с паузами между байтами ?
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Jan 25 2015, 18:54
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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