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

 
 
> 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
smalcom
сообщение Jan 25 2015, 08:43
Сообщение #2


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



посмотрите реализацию от ChaN'а. Там код не сложный и, в принципе, основные внутренности видно в одном-двух файлах.
ЕМНИП программные паузы не используются, но запрашивается состояние карты.
Go to the top of the page
 
+Quote Post
justontime
сообщение Jan 25 2015, 08:53
Сообщение #3


Местный
***

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



Цитата(smalcom @ Jan 25 2015, 11:43) *
ЕМНИП программные паузы не используются, но запрашивается состояние карты.


Э-э... А как можно запросить состояние карты посредине процесса чтения блока ? sm.gif
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Jan 25 2015, 12:47
Сообщение #4


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

Группа: Свой
Сообщений: 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
Сообщение #5


Местный
***

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



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

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


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


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



например так:
1. отправили данные сектора
2. в цикле проверяем статус
Go to the top of the page
 
+Quote Post
justontime
сообщение Jan 25 2015, 15:09
Сообщение #7


Местный
***

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



Цитата(smalcom @ Jan 25 2015, 17:56) *
например так:
1. отправили данные сектора
2. в цикле проверяем статус


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

Вообще интересует, в первую очередь, возможность посылки именно блока данных сплошным битовым потоком, без пауз между байтами.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jan 25 2015, 15:48
Сообщение #8


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



именно потоком это и делается
http://elm-chan.org/fsw/ff/en/dwrite.html
Go to the top of the page
 
+Quote Post
justontime
сообщение Jan 25 2015, 16:28
Сообщение #9


Местный
***

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



Цитата(smalcom @ Jan 25 2015, 18:48) *
именно потоком это и делается
http://elm-chan.org/fsw/ff/en/dwrite.html


Я не вижу там ничего насчет физической организации процесса, а более высокий уровень меня никаким боком не интересует.
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Jan 25 2015, 18:54
Сообщение #10


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

Группа: Свой
Сообщений: 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
jcxz
сообщение Jan 27 2015, 03:40
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(justontime @ Jan 25 2015, 12:46) *
Вроде простой вопрос, а вот явного ответа на него пока не нашел - при работе с SD картой по SPI протоколу нужно ли как-то (паузами) разделять байты в пакете ?

Нет конечно.

Цитата(justontime @ Jan 25 2015, 12:46) *
Я понимаю, что с вероятностью практически 100% можно, но сбивают с толку картинки, на которых всегда нарисованы увеличенные паузы между отдельными байтам. Пытаюсь читать стандартную

На картинках может быть что угодно нарисовано. Если-бы были нужны паузы, об этом явно указано было-бы в тексте и указаны их длительности.
К тому-же - это бред полный, ибо не ложилось-бы никак на работу с DMA, были-бы жуткие тормоза и т.п.
Логическое мышление иногда полезно включать. sm.gif
Go to the top of the page
 
+Quote Post
ДЕЙЛ
сообщение Jan 27 2015, 13:37
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085



Недавно имел дело с SD-картой. Осциллографом смотрел картинку - после команды чтения никаких пауз не видел. Думаю, что если они и возможны, то только как вынужденные, когда выполняется обработка принятого байта или при заполнении буфера, если используется аппаратный интерфейс работы с картой. Частота тактирования начинается от 0 герц, поэтому ничего не случится, если будет приостановка. Для большей убедительности подпаяльте провода МГТФ к данным сигналом в заводском девайсе и полюбуйтесь картинкой на осциллографе.
Go to the top of the page
 
+Quote Post
justontime
сообщение Jan 28 2015, 12:25
Сообщение #13


Местный
***

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



Как и следовало ожидать, все заработало без всяких пауз, равномерным потоком битов...
Go to the top of the page
 
+Quote Post
justontime
сообщение Jan 30 2015, 16:48
Сообщение #14


Местный
***

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



А вот еще вопрос из этой серии - наоборот, можно ли произвольно поднимать CS и опускать его обратно между связанными командами ? В смысле, например, опустить CS, выдать команду чтения блока, поднять CS, опустить его обратно и после этого уже непомредственно прочитать блок ? Или же такое переключение CS сбросит весь процесс ?
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jan 31 2015, 08:40
Сообщение #15


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



проверьте уже - это быстрее, чем прочитать то, что вам уже дали или дожидаться ответа от форума.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:21
Рейтинг@Mail.ru


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