Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем със SDHC карта
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16603
Страница 1 от 1

Автор:  Пенев [ Сря Юни 19, 2019 7:08 pm ]
Заглавие:  Проблем със SDHC карта

Здравейте колеги
Правя библиотека за една сд карта модел SDHC 16ГБ - от новите.Почти запуснах картата - направих инициализацията , четенето на единичен сектор и на мулти сектори , направих и изтриването на сектори и записа на единичен сектор. Остана ми да направя записа на мулти сектори но не ми се получава. Описвам как го правя - подавам команда 25 за запис на мулти сектори , след което чакам отговора на картата , след което за въртам цикъл в който подавам за старт 0xFC и след това 512 байта данни (толкова ми е блока) и накрая два байта 0xFF 0xFF за чек сума като съм изключил предварително проверката на чек сумата. След първи блок картата ми отговаря нормално със 0x05 и 0x00 но на следващите блокове не ще. пак подавам 0xFC и пак 512 байта и пак 2 байта чек сума но повече не отговаря .Въпросът ми е - каква е правилната поредица байтове при записа на мулти сектори на сд картата ?

Автор:  miro_atc [ Сря Юни 19, 2019 8:20 pm ]
Заглавие:  Re: Проблем със SDHC карта

Предполагам ползваш SPI интерфейс (за SDIO e различно)...

ей ти малко код:

Код:
      for(int retry=1; retry<20; retry+=2)
      {
          if (count == 1)
          { /* Single block write */
             if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */
             && xmit_datablock(buff, 0xFE) == RES_OK)
             {
                count = 0;
                break;
             }
          }
          else
          { /* Multiple block write */
             if (disk_type & DISK_TYPE_SDC)
             {
                send_cmd(CMD55, 0);
                send_cmd(CMD23, count); /* ACMD23 */
             }
             if (send_cmd(CMD25, sector) == 0)
             { /* WRITE_MULTIPLE_BLOCK */
                const void* rbuff = buff;
                int rcount = count;
                do
                {
                   if (xmit_datablock(rbuff, 0xFC) != RES_OK)
                      break;
                   rbuff = ((char*)rbuff) + 512;
                } while (--rcount);
                if (xmit_datablock(0, 0xFD) == RES_OK && !rcount) /* STOP_TRAN token */
                {
                   count = 0;
                   break;
                }
             }
          }

          //reset
         if(card_reset(retry))
            retry--;
      }


В началото имаш 23-та команда... еднократно. Не става ясно правиш ли го, как циклиш, чакаш ли картата също не ми е ясно...
всъщност ето ти и трансфера:

Код:
/**
*
* @param buff      512 byte data block to be transmitted
* @param token      Data/Stop token
* @return
*/
RES_CODE sd_disk_t::xmit_datablock(const void* buff, unsigned int token)
{
   if (!card_ready())
      return RES_ERROR;

   /* Xmit data token */
   hspi.tsk_write_locked(&token, 1);
   if (token != 0xFD)
   { /* Is data token */

      /* Xmit the 512 byte data block to MMC */
      hspi.tsk_write_locked(buff, 512);

      /* CRC (Dummy) */
      token = __REV16(CalculateCRC16CCITT(0, (const char *)buff, 512));
      hspi.tsk_write_locked(&token, 2);
      token = 0;
      hspi.tsk_read_locked(&token, 1);
      if ((token & 0x1F) != 0x05) /* If not accepted, return with error */
      {
         tsk_sleep(100);
         TRACELN("!!!SD xmit -> %02X", token);
         return RES_ERROR;
      }
   }

   return RES_OK;
}

Автор:  Пенев [ Сря Юни 19, 2019 9:42 pm ]
Заглавие:  Re: Проблем със SDHC карта

Всичко ми е същото освен това if (xmit_datablock(rbuff, 0xFC) != RES_OK)
промених кода да чака отговор и пак не се получава
да не би да иска коректна чек сума въпреки че е изключена?
При някой опити записва коректно само първия сектор а другите не ги записва въобще и зацикля картата като не приема никаква друга команда. При други опити записва още няколко сектора но пише глупости , явно не мога да улуча поредицата на подаване на команди и байтове както му е редът. На края на първия блок си отговаря нормално както си му е редът със 0xE5 и 0x00 което 0xE5 като се AND със 0x1F и се получава коректния отговор 0x05. И след това на втория блок става мишмаша. Рових в интернет няколко вечера но всичко което намирам за дадения проблем е една картинка със правоъгълничета вместо команди и данни и явно всички са копирали тази картинка едни от други и няма никакво ясно и коректно описание на алгоритъма и особенностите. Освен библиотеки и пдфи и страници описващи сд картите който изчетох не намерих нищо свястно по въпроса а само обща информация.

Автор:  miro_atc [ Сря Юни 19, 2019 10:43 pm ]
Заглавие:  Re: Проблем със SDHC карта

чек сумите са изключени по дефаулт, доколкото помня. Но искрено те съветвам да ги включиш. Още повече, че има вероятност да имаш и хардуерен проблем. Щом пишеш или четеш глупости ;-)
Няма да е зле да боцнеш един скоп да видиш при теб картинката дали е с
"правоъгълничета", дали сигналчета от сорта на чип селект са там, където трябват... ей такива работи ;-)
Иначе стандарта си го има в нета и достатъчно подробно написан.

Автор:  timt [ Сря Юни 19, 2019 11:21 pm ]
Заглавие:  Re: Проблем със SDHC карта

Да не би още при буферирането да се получава този проблем? Чек сумата ? Ако ти е голяма програмата на чипа може да става мазано!

Автор:  Пенев [ Сря Юни 19, 2019 11:27 pm ]
Заглавие:  Re: Проблем със SDHC карта

Установката ми за разработка е пик процесор на хид усб и програма на уиндоус. Пик процесора само предава и приема байтове по SPI и управлява чип селекта , така че нищо съществено нямам в него. Работи коректно понеже съм направил инициализацията и четенето и изтриването на блокове и записа на единичен сектор. В него и програмата за уин нямам съмнения. Хардуера ми е наред и софтуера. Просто не мога да улуча протокола за запис на мулти сектори и това е.

Автор:  Пенев [ Чет Юни 20, 2019 1:23 am ]
Заглавие:  Re: Проблем със SDHC карта

Пак нагодих алгоритъма след всички опити на старото положение. Сега записва четни сектори - 0 и 2 а пък нечетните 1 и 3 пише мишмаш но накрая като подам 0xFD и спира и приема вече други команди. Мислех че е от захранването понеже го захранвам от усб а картата си дърпа доста , та захраних директно от лабораторно захранване. Няма промяна.

Автор:  timt [ Чет Юни 20, 2019 2:11 am ]
Заглавие:  Re: Проблем със SDHC карта

Няма да съм ти много от полза, с тези карти не съм се занимавал но едва ли ще е такава екзотика понеже и старите устройства трябва да работят с тях. Скоро си дръпнах от фейсбук-а ти Micro SDHC Card и го разгледах като не видях много разлика. Да си призная че и за първи път чух за такива карти HC. Вече взе да ми писва от новите джаджи ....

Автор:  Цецо [ Чет Юни 20, 2019 10:01 am ]
Заглавие:  Re: Проблем със SDHC карта

Нещо не ти е наред физически с интерфейса и/или управлението на SPI в пика. Особенно както казваш, че чете през едно...

Осцилоскопа закачи ли?

Автор:  slav4o.com [ Чет Юни 20, 2019 1:04 pm ]
Заглавие:  Re: Проблем със SDHC карта

Защо не намалиш скоростта , намали я няколко пъти за пробата

Автор:  Н'бабане Гт'муан'га [ Чет Юни 20, 2019 1:23 pm ]
Заглавие:  Re: Проблем със SDHC карта

Инициализацията на картата се прави на 200 килохерца, после може да вдигаш клока, но не повече от 20 мегахерца.
Ето ти тук моя файл от ритъла който работи много стабилно. Аз ползвам FatFs, но ти ако ползваш нещо друго си извади само нужните парчета.

Прикачени файлове:
sd_spi.c [13.74 KiB]
264 пъти
sd_spi.h [1.2 KiB]
295 пъти

Автор:  Пенев [ Пет Юни 21, 2019 6:04 pm ]
Заглавие:  Re: Проблем със SDHC карта

Начертах алгоритъма който ползвам и който гледах от документите и интернет.
SPI ми е на 100кхц - възможно най-ниско. Между байтовете имам 1 мс понеже ползвам хид усб.
Записва четни сектори - 0 и 2 а нечетните 1 и 3 пише мишмаш.
На четните отговаря нормално със E5 и 00. На нечетните отговаря със FF.
Някъде прочетох че във SPI режим се поддържат командите само за четене и запис на единичен блок а на мулти блокове не се поддържат.

Прикачени файлове:
Коментар на файл: алгоритъм
CMD25.PNG
CMD25.PNG [ 958 Байта | Прегледано 5774 пъти ]

Автор:  miro_atc [ Пет Юни 21, 2019 6:31 pm ]
Заглавие:  Re: Проблем със SDHC карта

Пенев написа:
Някъде прочетох


Една жена каза :D

има си стандарт... Прочети в него за кои класове CMD25 е mandatory, как се проверява какъв ти е класа, съответно дали трябва да информираш картата за броя на секторите преди да почнеш. Има описано как се прави трансфер с повече сектори, къде ти отговаря с R1, къде ти отговаря с data response, къде може да каже busy и т.н.

Описано с думи и нарисувано с картинки... Стандарт като Слънце ;-)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/