RSS блога
Подписка
SD-карта Samsung Evo Plus for Creators 32Gb и тестер для карт
- Цена: 708р.
- Перейти в магазин
Решил тут прикупить полноразмерную SD-карту для штатной навигации в авто. Казалось бы, возьми microSD + переходник и оукей, но именно в такой конфигурации несколько раз ловил фризы при навигации — все же лишние контакты при вибрации — ни к чему. Поэтому остановился на полноразмерной карте, несмотря на то, что она существенно дороже. Самсунг же был выбран за проверенную годами надежность и фирменную утилитку для проверки оригинальности карты. Ну и заодно из гамна, палок и ардуиновского скетча собрал простенький тестер SD-карт по типу андроидной проги SD Insight.
Карта вполне обычная.
Обычное для Самсунга Филиппинское производство.
Скорость записи по сравнению с аналогичной MicroSD на 7-8мб/с выше. На чтение — такая же.
h2testw проблем не нашел.
Проверку на оригинальность карта проходит.
В общем с картой ничего интересного — вполне обычный, массовый оригинальный продукт.
Теперь про тестер карт, позволяющий читать всякую служебную инфу карты, в то числе идентификатор производителя. Из железа нужна платка Arduino Uno, валяющаяся без дела, пожалуй, у каждого второго. И еще — копеечный SD-модуль.
Получилась вот такая вундервафля…
Подключение:
Arduino SD-модуль
5V ----> VCC
GND ----> GND
10 ----> CS
11 ----> MOSI
12 ----> MISO
13 ----> SCK
Тут надо обратить внимание, что не все SD-модули имеют стабилизатор на 3,3В. Если его нет, надо VCC подключать к пину 3,3В, чтоб не спалить карту. Кстати, вместо Arduino Uno подойдет любая платка, у которой выведены контакты под SPI-интерфейс, только надо будет в скетче пины переопределить.
Затем ставим Arduino IDE и библиотеку SDFat, заливаем скетч, пихаем SD-карту, запускаем монитор порта и далее вводим любой символ и смотрим результаты.
Если что — я не настоящий сварщик. Скетч взят из примеров библиотеки SDFat и немножко допилен в плане добавления базы производителей, добытой из интернетика, проги SD Insight и тестов собственной коллекции карт. Закомментированный блок в скетче — это производители имеющие действующие лицензии на производство SD карт, но пока мне неизвестно какие коды они используют. Плюс производители отмеченные по типу «EXP 2017» — это производители с закончившейся (в 2017-м) лицензией. То есть карта этого производителя, выпущенная позже — будет под большим вопросом…
В общем тестите свои карты и выкладывайте результаты — будем пополнять базу производителей.
UPD — пришел наконец-то полноразмерный SD-модуль, так что ниже результат чтения SD карты Samsung Evo Plus for Creators 32Gb.
Card type: SDHC
Manufacturer ID: 0X1B
Samsung Electronics Co., Ltd.
OEM ID: SM
Product: 5B1Q5
Version: 3.0
Serial number: 0X735D8C68
Manufacturing date: 2/2021
cardSize: 32044.48 MB (MB = 1,000,000 bytes)
flashEraseSize: 128 blocks
eraseSingleBlock: true
OCR: 0XC0FF8000
Карта вполне обычная.
Обычное для Самсунга Филиппинское производство.
Скорость записи по сравнению с аналогичной MicroSD на 7-8мб/с выше. На чтение — такая же.
h2testw проблем не нашел.
Проверку на оригинальность карта проходит.
В общем с картой ничего интересного — вполне обычный, массовый оригинальный продукт.
Теперь про тестер карт, позволяющий читать всякую служебную инфу карты, в то числе идентификатор производителя. Из железа нужна платка Arduino Uno, валяющаяся без дела, пожалуй, у каждого второго. И еще — копеечный SD-модуль.
Получилась вот такая вундервафля…
Подключение:
Arduino SD-модуль
5V ----> VCC
GND ----> GND
10 ----> CS
11 ----> MOSI
12 ----> MISO
13 ----> SCK
Тут надо обратить внимание, что не все SD-модули имеют стабилизатор на 3,3В. Если его нет, надо VCC подключать к пину 3,3В, чтоб не спалить карту. Кстати, вместо Arduino Uno подойдет любая платка, у которой выведены контакты под SPI-интерфейс, только надо будет в скетче пины переопределить.
Затем ставим Arduino IDE и библиотеку SDFat, заливаем скетч, пихаем SD-карту, запускаем монитор порта и далее вводим любой символ и смотрим результаты.
Скетч
/*
* This program attempts to initialize an SD card and analyze its structure.
*/
#include "SdFat.h"
#include "sdios.h"
/*
Set DISABLE_CS_PIN to disable a second SPI device.
For example, with the Ethernet shield, set DISABLE_CS_PIN
to 10 to disable the Ethernet controller.
*/
const int8_t DISABLE_CS_PIN = -1;
/*
Change the value of SD_CS_PIN if you are using SPI
and your hardware does not use the default value, SS.
Common values are:
Arduino Ethernet shield: pin 4
Sparkfun SD shield: pin 8
Adafruit SD shields and modules: pin 10
*/
// SDCARD_SS_PIN is defined for the built-in SD on some boards.
#ifndef SDCARD_SS_PIN
const uint8_t SD_CS_PIN = SS;
#else // SDCARD_SS_PIN
const uint8_t SD_CS_PIN = SDCARD_SS_PIN;
#endif // SDCARD_SS_PIN
// Try to select the best SD card configuration.
#if HAS_SDIO_CLASS
#define SD_CONFIG SdioConfig(FIFO_SDIO)
#elif ENABLE_DEDICATED_SPI
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SD_SCK_MHZ(16))
#else // HAS_SDIO_CLASS
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SD_SCK_MHZ(16))
#endif // HAS_SDIO_CLASS
//------------------------------------------------------------------------------
SdFs sd;
cid_t m_cid;
csd_t m_csd;
uint32_t m_eraseSize;
uint32_t m_ocr;
static ArduinoOutStream cout(Serial);
//------------------------------------------------------------------------------
bool cidDmp() {
String ManufName = "Unknown";
if (int(m_cid.mid)==0) ManufName = "Invalid";
if (int(m_cid.mid)==1) ManufName = "Panasonic Corporation";
if (int(m_cid.mid)==2) ManufName = "Toshiba Corporation";
if (int(m_cid.mid)==3) ManufName = "Sandisk Corporation";
if (int(m_cid.mid)==6) ManufName = "Ritek Corporation (EXP 2018)";
if (int(m_cid.mid)==9) ManufName = "ATP Electronics Inc.";
if (int(m_cid.mid)==19) ManufName = "Kingmax Semiconductor Inc.(EXP 2014)";
if (int(m_cid.mid)==25) ManufName = "Dynacard Co., Ltd.";
if (int(m_cid.mid)==26) ManufName = "Power Quotient Intl. Co., Ltd (EXP 2017)";
if (int(m_cid.mid)==27) ManufName = "Samsung Electronics Co., Ltd.";
if (int(m_cid.mid)==29) ManufName = "ADATA Technology Co., Ltd.(AData, Corsair)";
if (int(m_cid.mid)==39) ManufName = "Phison Electronics Corp. (AgfaPhoto, Delkin, Integral, Lexar, Patriot, PNY, Polaroid, Sony, Verbatim";
if (int(m_cid.mid)==40) ManufName = "Barun Electronics (EXP 2019) (Lexar, PNY, ProGrade)";
if (int(m_cid.mid)==49) ManufName = "Silicon Power Computer & Comm., Inc. (EXP 2017)";
if (int(m_cid.mid)==54) ManufName = "Crucial";
if (int(m_cid.mid)==65) ManufName = "Kingston";
if (int(m_cid.mid)==69) ManufName = "MIXZA";
if (int(m_cid.mid)==81) ManufName = "STEC Inc. / SimpleTech (EXP 2010)";
if (int(m_cid.mid)==93) ManufName = "SwissBit AG";
if (int(m_cid.mid)==97) ManufName = "Netlist, Inc.";
if (int(m_cid.mid)==99) ManufName = "Cactus Technologies";
if (int(m_cid.mid)==115) ManufName = "Silicon Power?";
if (int(m_cid.mid)==116) ManufName = "Jiaelec Corp.";
if (int(m_cid.mid)==130) ManufName = "Jiang Tay Technical Co., Ltd.";
if (int(m_cid.mid)==131) ManufName = "Netcom Technology (HK) Ltd. (EXP 2015)";
if (int(m_cid.mid)==132) ManufName = "Strontium Technologies Pte Ltd (EXP 2019)";
if (int(m_cid.mid)==156) ManufName = "LD, MIXZA 333x";
if (int(m_cid.mid)==173) ManufName = "Shenzhen Longsys Electronics Co., Ltd (Lexar 2021)";
/*
if (int(m_cid.mid)==0) ManufName = "AGI Technology Co., Ltd";
if (int(m_cid.mid)==0) ManufName = "Biwin Storage Technology CO., LTD";
if (int(m_cid.mid)==0) ManufName = "BUFFALO INC.";
if (int(m_cid.mid)==0) ManufName = "Centon Electronics Inc.";
if (int(m_cid.mid)==0) ManufName = "Delidor Digital Technology Co., Limited";
if (int(m_cid.mid)==0) ManufName = "Delkin Devices";
if (int(m_cid.mid)==0) ManufName = "DIGILINK ELECTRONIC LIMITED";
if (int(m_cid.mid)==0) ManufName = "Edisk Technology Ltd.";
if (int(m_cid.mid)==0) ManufName = "G. Skill International Enterprises";
if (int(m_cid.mid)==0) ManufName = "Grand and Broad Technology Co. Limited";
if (int(m_cid.mid)==0) ManufName = "GTS Co. Ltd";
if (int(m_cid.mid)==0) ManufName = "Guangdong Transcend Semiconductor Co., Ltd.";
if (int(m_cid.mid)==0) ManufName = "Hagiwara Solutions Co., Ltd.";
if (int(m_cid.mid)==0) ManufName = "HOSIN Global Electronics Co., Limited";
if (int(m_cid.mid)==0) ManufName = "Innodisk Corp.";
if (int(m_cid.mid)==0) ManufName = "Integral Memory Plc";
if (int(m_cid.mid)==0) ManufName = "Keple Ltd";
if (int(m_cid.mid)==0) ManufName = "LEAPRO TECHNOLOGY CO., LTD.";
if (int(m_cid.mid)==0) ManufName = "Metorage Semiconductor technology Co., Ltd";
if (int(m_cid.mid)==0) ManufName = "REALTECH SEMICONDUCTOR TECHNOLOGY LIMITED";
if (int(m_cid.mid)==0) ManufName = "SC Global Company Co., Ltd";
if (int(m_cid.mid)==0) ManufName = "Shenzhen Dadongjia Industrial Co., Ltd.";
if (int(m_cid.mid)==0) ManufName = "Shenzhen Shenghua Youxin Semiconductor Technology Limited";
if (int(m_cid.mid)==0) ManufName = "Shenzhen YeKeSheng Digital Co.,Ltd.";
if (int(m_cid.mid)==0) ManufName = "SMART Modular Technologies (Global), Inc.";
if (int(m_cid.mid)==0) ManufName = "SPYRUS INC.";
if (int(m_cid.mid)==0) ManufName = "Taishin International Resources Co., Ltd.";
if (int(m_cid.mid)==0) ManufName = "Virtium LLC";
if (int(m_cid.mid)==0) ManufName = "WETOP TECHNOLOGY CORPORATION LIMITED";
if (int(m_cid.mid)==0) ManufName = "Wintec Industries, Inc.";
if (int(m_cid.mid)==0) ManufName = "Yuanchuang Digital Technology Limited";
*/
cout << F("\nManufacturer ID: ");
cout << uppercase << showbase << hex << int(m_cid.mid) << dec << endl;
cout << ManufName << endl;
cout << F("OEM ID: ") << m_cid.oid[0] << m_cid.oid[1] << endl;
cout << F("Product: ");
for (uint8_t i = 0; i < 5; i++) {
cout << m_cid.pnm[i];
}
cout << F("\nVersion: ");
cout << int(m_cid.prv_n) << '.' << int(m_cid.prv_m) << endl;
cout << F("Serial number: ") << hex << m_cid.psn << dec << endl;
cout << F("Manufacturing date: ");
cout << int(m_cid.mdt_month) << '/';
cout << (2000 + m_cid.mdt_year_low + 16* m_cid.mdt_year_high) << endl;
cout << endl;
return true;
}
//------------------------------------------------------------------------------
void clearSerialInput() {
uint32_t m = micros();
do {
if (Serial.read() >= 0) {
m = micros();
}
} while (micros() - m < 10000);
}
//------------------------------------------------------------------------------
bool csdDmp() {
bool eraseSingleBlock;
if (m_csd.v1.csd_ver == 0) {
eraseSingleBlock = m_csd.v1.erase_blk_en;
m_eraseSize = (m_csd.v1.sector_size_high << 1) | m_csd.v1.sector_size_low;
} else if (m_csd.v2.csd_ver == 1) {
eraseSingleBlock = m_csd.v2.erase_blk_en;
m_eraseSize = (m_csd.v2.sector_size_high << 1) | m_csd.v2.sector_size_low;
} else {
cout << F("m_csd version error\n");
return false;
}
m_eraseSize++;
cout << F("cardSize: ") << 0.000512 * sdCardCapacity(&m_csd);
cout << F(" MB (MB = 1,000,000 bytes)\n");
cout << F("flashEraseSize: ") << int(m_eraseSize) << F(" blocks\n");
cout << F("eraseSingleBlock: ");
if (eraseSingleBlock) {
cout << F("true\n");
} else {
cout << F("false\n");
}
return true;
}
//------------------------------------------------------------------------------
void errorPrint() {
if (sd.sdErrorCode()) {
cout << F("SD errorCode: ") << hex << showbase;
printSdErrorSymbol(&Serial, sd.sdErrorCode());
cout << F(" = ") << int(sd.sdErrorCode()) << endl;
cout << F("SD errorData = ") << int(sd.sdErrorData()) << endl;
}
}
//------------------------------------------------------------------------------
bool mbrDmp() {
MbrSector_t mbr;
bool valid = true;
if (!sd.card()->readSector(0, (uint8_t*)&mbr)) {
cout << F("\nread MBR failed.\n");
errorPrint();
return false;
}
cout << F("\nSD Partition Table\n");
cout << F("part,boot,bgnCHS[3],type,endCHS[3],start,length\n");
for (uint8_t ip = 1; ip < 5; ip++) {
MbrPart_t *pt = &mbr.part[ip - 1];
if ((pt->boot != 0 && pt->boot != 0X80) ||
getLe32(pt->relativeSectors) > sdCardCapacity(&m_csd)) {
valid = false;
}
cout << int(ip) << ',' << uppercase << showbase << hex;
cout << int(pt->boot) << ',';
for (int i = 0; i < 3; i++ ) {
cout << int(pt->beginCHS[i]) << ',';
}
cout << int(pt->type) << ',';
for (int i = 0; i < 3; i++ ) {
cout << int(pt->endCHS[i]) << ',';
}
cout << dec << getLe32(pt->relativeSectors) << ',';
cout << getLe32(pt->totalSectors) << endl;
}
if (!valid) {
cout << F("\nMBR not valid, assuming Super Floppy format.\n");
}
return true;
}
//------------------------------------------------------------------------------
void dmpVol() {
cout << F("\nScanning FAT, please wait.\n");
uint32_t freeClusterCount = sd.freeClusterCount();
if (sd.fatType() <= 32) {
cout << F("\nVolume is FAT") << int(sd.fatType()) << endl;
} else {
cout << F("\nVolume is exFAT\n");
}
cout << F("sectorsPerCluster: ") << sd.sectorsPerCluster() << endl;
cout << F("clusterCount: ") << sd.clusterCount() << endl;
cout << F("freeClusterCount: ") << freeClusterCount << endl;
cout << F("fatStartSector: ") << sd.fatStartSector() << endl;
cout << F("dataStartSector: ") << sd.dataStartSector() << endl;
if (sd.dataStartSector() % m_eraseSize) {
cout << F("Data area is not aligned on flash erase boundary!\n");
cout << F("Download and use formatter from www.sdcard.org!\n");
}
}
//------------------------------------------------------------------------------
void printCardType() {
cout << F("\nCard type: ");
switch (sd.card()->type()) {
case SD_CARD_TYPE_SD1:
cout << F("SD1\n");
break;
case SD_CARD_TYPE_SD2:
cout << F("SD2\n");
break;
case SD_CARD_TYPE_SDHC:
if (sdCardCapacity(&m_csd) < 70000000) {
cout << F("SDHC\n");
} else {
cout << F("SDXC\n");
}
break;
default:
cout << F("Unknown\n");
}
}
//------------------------------------------------------------------------------
void printConfig(SdSpiConfig config) {
if (DISABLE_CS_PIN < 0) {
cout << F(
"\nAssuming the SD is the only SPI device.\n"
"Edit DISABLE_CS_PIN to disable an SPI device.\n");
} else {
cout << F("\nDisabling SPI device on pin ");
cout << int(DISABLE_CS_PIN) << endl;
pinMode(DISABLE_CS_PIN, OUTPUT);
digitalWrite(DISABLE_CS_PIN, HIGH);
}
cout << F("\nAssuming the SD chip select pin is: ") << int(config.csPin);
cout << F("\nEdit SD_CS_PIN to change the SD chip select pin.\n");
}
//------------------------------------------------------------------------------
void printConfig(SdioConfig config) {
(void)config;
cout << F("Assuming an SDIO interface.\n");
}
//-----------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
// Wait for USB Serial
while (!Serial) {
SysCall::yield();
}
cout << F("SdFat version: ") << SD_FAT_VERSION_STR << endl;
printConfig(SD_CONFIG);
}
//------------------------------------------------------------------------------
void loop() {
// Read any existing Serial data.
clearSerialInput();
// F stores strings in flash to save RAM
cout << F("\ntype any character to start\n");
while (!Serial.available()) {
SysCall::yield();
}
uint32_t t = millis();
if (!sd.cardBegin(SD_CONFIG)) {
cout << F(
"\nSD initialization failed.\n"
"Do not reformat the card!\n"
"Is the card correctly inserted?\n"
"Is there a wiring/soldering problem?\n");
if (isSpi(SD_CONFIG)) {
cout << F(
"Is SD_CS_PIN set to the correct value?\n"
"Does another SPI device need to be disabled?\n"
);
}
errorPrint();
return;
}
t = millis() - t;
cout << F("init time: ") << t << " ms" << endl;
if (!sd.card()->readCID(&m_cid) ||
!sd.card()->readCSD(&m_csd) ||
!sd.card()->readOCR(&m_ocr)) {
cout << F("readInfo failed\n");
errorPrint();
return;
}
printCardType();
cidDmp();
csdDmp();
cout << F("\nOCR: ") << uppercase << showbase;
cout << hex << m_ocr << dec << endl;
if (!mbrDmp()) {
return;
}
if (!sd.volumeBegin()) {
cout << F("\nvolumeBegin failed. Is the card formatted?\n");
errorPrint();
return;
}
dmpVol();
}
Пример декодированной информации
Card type: SDXC
Manufacturer ID: 0X82
Jiang Tay Technical Co., Ltd.
OEM ID: JT
Product: NCard
Version: 0.2
Serial number: 0X37D800B1
Manufacturing date: 10/2014
cardSize: 63416.83 MB (MB = 1,000,000 bytes)
flashEraseSize: 128 blocks
eraseSingleBlock: true
OCR: 0XC0FF8000
SD Partition Table
part,boot,bgnCHS[3],type,endCHS[3],start,length
1,0X0,0XA,0X9,0X2,0X7,0XFE,0XFF,0XFF,32768,123828224
2,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0,0
3,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0,0
4,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0,0
volumeBegin failed. Is the card formatted?
SD errorCode: SD_CARD_ERROR_INVALID_CARD_CONFIG = 0X2A
SD errorData = 0X0
Если что — я не настоящий сварщик. Скетч взят из примеров библиотеки SDFat и немножко допилен в плане добавления базы производителей, добытой из интернетика, проги SD Insight и тестов собственной коллекции карт. Закомментированный блок в скетче — это производители имеющие действующие лицензии на производство SD карт, но пока мне неизвестно какие коды они используют. Плюс производители отмеченные по типу «EXP 2017» — это производители с закончившейся (в 2017-м) лицензией. То есть карта этого производителя, выпущенная позже — будет под большим вопросом…
В общем тестите свои карты и выкладывайте результаты — будем пополнять базу производителей.
UPD — пришел наконец-то полноразмерный SD-модуль, так что ниже результат чтения SD карты Samsung Evo Plus for Creators 32Gb.
Card type: SDHC
Manufacturer ID: 0X1B
Samsung Electronics Co., Ltd.
OEM ID: SM
Product: 5B1Q5
Version: 3.0
Serial number: 0X735D8C68
Manufacturing date: 2/2021
cardSize: 32044.48 MB (MB = 1,000,000 bytes)
flashEraseSize: 128 blocks
eraseSingleBlock: true
OCR: 0XC0FF8000
Самые обсуждаемые обзоры
+61 |
1933
66
|
+156 |
6387
153
|
+33 |
3531
58
|
Цена 485 рублей. Заказ во время не доставили.
Извинились. Прислали промокод на 500р (100% оплата).
Итог: карта и +15рублей.
Года три не покупаю память на али И НИ КОМУ НЕ СОВЕТУЮ!!!
И они вполне неплохо просматриваются, даже под черной краской. У остальных производителей карт дорожки разведены стандартно — под 0, 45 и 90 градусов.
отличить оригинал от подделки, кстати, можно даже не вскрывая коробку — на подделках печать хуже качеством, очень заметно, если есть с чем сравнивать. выявлено экспериментальным путем.
Например, торцы должно быть тоже белые (у белых карт).
У продавана с 98% рейтингом и покупок карт от 3000 мне прислали подделку.
Есть ссылки точно не на подделку?
вот тут ни разу не было ни одной подделки. то же по отзывам на форумах халявщиков, ни одного негативного не встречал.
я же покупал всё это добро по купонам почти с нулем вложений, поэтому экспериментировал с продавцами.
На 64 — Samsung и Kodak, около 7 баксов, стоят в телефонах больше года.
На 8 — Kingston, стремная упаковка, обошелся в бакс, брал для установки на него прошивки в тв-бокс, сдох при установке прошивки.
Остальные 16 SanDisk и 32 — Lexar, Samsung и Kodak, до 4 баксов стоят в неосновных устройствах или подарены, все живы.
Теперь такой шары на карточки нет.
По флешкам, дешевле найти в офлайне. Последнее что брал, Kingston DataTraveler 100 G3 32GB USB 3.0 за 3 бакса, с гарантией.
Так что с памятью с али не все так однозначно.
На фото 2 верхних нерабочие, нижние рабочие. Хранились в комнате, никаких экстремальных видов эксплуатации.
на самом деле у меня пачка этих переходников самых разных фирм, и обычно они либо работают и изредка не работают совсем. а чтоб глючили — повезло, не видел такого.
а на «вундервафлю» есть готовый проект:
kbiva.wordpress.com/2016/06/26/information-about-sd-card/
www.youtube.com/watch?v=ZAe61GZ-52Y
а вот зачем sid и на карте памяти
Делать из оригинальной неоригинальную, или наоборот
s3.ap-northeast-2.amazonaws.com/global.semi.static/SMCA_Win_P01_RC01_20191202.exe
проверил свое хозяйство, а именно — 6 карточек ЭВО плюс. 4 по 64 куплены в мвидео, 2 по 128 — на али в разное время у разных продавцов. все 6 оригинальные.
автору спасибо за наводку
название программы для поиска — Samsung Card-UFD Authentication Utility