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

 
 
> 16xNAND и AT91RM9200, подключение 16 битной NAND flash и драйвер для работы с ней
primus
сообщение Jul 3 2009, 09:09
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 9-04-07
Из: Санкт-Петербург
Пользователь №: 26 884



Доброго времени суток, ALL!

Надеюсь на вашу помошь, т.к. собственных сил уже не хватает.

Subj, заключается в следующем.

Появилась необходимость повышения производительности в работе с NAND flash, поэтому заменил ранее использовавшуюся 8-ми битную NAND Micron MT29F4G08AAAWP ET
на аналогичную ей 16-ти битную Micron MT29F2G16AAD ET D. Возникла проблема - не могу считать ID c 16 битной NAND, когда на 8-ми битной все работает.

Подкорректировал схему включения микросхемы, но структорно она осталась прежней:

AT91RM9200 MICRON

NSC3| ------------->| !CE
A19| ------------->| CLE
A20| ------------->| ALE
NANDOE| ------------->| !RE
NANDWE| ------------->| !WE
PC8|<-------------- | !R/b
16x I/0|--< шина >--| 16x I/0


где !СE - инвертированный вход, аналогично как и RE, WE

Сигналы все проходят (проверил осциллогорафом).

Схемотехнически, imho, все выполненно правильно. В цепи питания видимых ошибок не обнаруженно.
(да и ошибиться-то там негде)
написал маленький дравер для работы с NAND (первичный загрузчик отлажен и проверен (100% работает!)):

//listing...

CODE

//чтение данных
#define read_data() (*(volatile unsigned short*)0x40000000)

//запись данных
#define write_data(x) *((volatile unsigned short*)0x40000000) = (unsigned short)(x)
//запись команды - поднимается CS и адресс A19 (CLE)
#define write_command(x) *((volatile unsigned short*)0x40080000) = (unsigned short)(x)
//запись адреса - поднимается CS и адресс A20 (ALE)
#define write_address(x) *((volatile unsigned short*)0x40100000) = (unsigned short)(x)

// инициализация NAND
void nand_init(void)
{

// Конфигурирование EBI - CS3 настраивается для работы с NAND (CS - !CE)
SET(MCU_MC|EBI_CSA, 0x00000008);

/*
настройка регистра SMC Chip Select Register 3
( Byte Access Type = 16 бит;
Data Bus Width = 16 бит;
Wait State Enable = 1;
Number of Wait States = 127;
перепробовал все варианты, с учетом всех задержек и временных диаграмм
)
*/
SET(MCU_MC|SMC_CSR3, 0x000030FF);

// настройка PIO - здесь все просто
SET(MCU_PIOC|PIO_ASR, 0x0000000a);
//SET(MCU_PIOC|PIO_MDDR, 0x0000000a);
SET(MCU_PIOC|PIO_PUER, 0x0000000a);
SET(MCU_PIOC|PIO_PDR, 0x0000000a);
}

// чтение ID
void NAND_READ_ID(void)
{

unsigned short status;

write_command(0x0090); // в старших адресах 0x00
write_address(0x0000);

status = read_data();
printf("NAND status = %.4x\n", (unsigned)status);

status = read_data();
printf("NAND status = %.4x\n", (unsigned)status);

status = read_data();
printf("NAND status = %.4x\n", (unsigned)status);

status = read_data();
printf("NAND status = %.4x\n", (unsigned)status);
}



На выходе получаю FFFF. Шина данных подтянута. Такое ощущение, что nand просто не работает.
Но! При подаче управляющего сигнала переазгрузки (write_command(0x00FF); ) сигнал R/B генерируется и прерыване возбуждается. Что говорит о том что NAND срабатывает. Ошибки в передаче по сигнальным линиям быть не может.
Очень часто данная команда "не проходит", но всегда прохоит команда (write_command(0xFFFF)!!! С чем это связанно я не знаю.
Аналогичный алгоритм работает при использовани 8 битной NAND.

При использовании другого значения для SMC Chip Select Register 3 ( SET(MCU_MC|SMC_CSR3, 0x77033F80)) в соответствии с даташитом.
Получаю на выходе 0x1111.

Может кроме EBI и SMC нужно что-то еще настраивать?
Мог накосячить в разыменовании указателя типа short, но в листинге (см. выше) ошибок не нашел.
Думаю косяк в програмной части, но где найти не могу.
Подскажите! Собственных сил уже не осталось, все волосы с задницы вырвал.
Расчитываю на вашу помощь!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
sergeeff
сообщение Jul 3 2009, 14:45
Сообщение #2


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



У меня 16-битная flash. В 9200 инициализация идет так:

Код
   AT91C_BASE_MC->MC_PUIA[0] = AT91C_MC_PROT_PNAUNA;
   AT91C_BASE_MC->MC_PUP  = 0;
   AT91C_BASE_MC->MC_PUER = 0;   // Memory controller protection unit disable
   AT91C_BASE_MC->MC_ASR  = 0;    // read only!
   AT91C_BASE_MC->MC_AASR = 0;   // read only!

   // Setup MEMC to support CS0=Flash - base address 0x10000000
   AT91C_BASE_EBI->EBI_CSA |= AT91C_EBI_CS0A_SMC;
  
   // [D15:0] Data Bus bits are internally pulled-up to the VDDIOM power supply.
    AT91C_BASE_EBI->EBI_CFGR = (AT91C_EBI_DBPUC & 0x00) | (AT91C_EBI_EBSEN & 0x00);

   // Setup Flash
   // WSEN = 1 (Wait states are enabled)
   // NWS  = 9 (Number of Wait States) ( 9 * 16,7 nS = 150,3 nS)
   // BAT  = 1 (Byte Access Type - 16-bit wide device)
   // DBW  = 1 (Data Bus Width - 16-bit)
   // TDF  = 2 (Data Float Time - 2 cycles)
   AT91C_BASE_SMC2->SMC2_CSR[0] = (AT91C_SMC2_NWS & 9) | AT91C_SMC2_WSEN |
                                  (AT91C_SMC2_TDF & 0x200) | AT91C_SMC2_BAT | AT91C_SMC2_DBW_16;
Go to the top of the page
 
+Quote Post
primus
сообщение Jul 6 2009, 05:23
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 9-04-07
Из: Санкт-Петербург
Пользователь №: 26 884



При таких настройках получаю 0xFFFF. Эти настройки SMC для какой микросхемы? Есть какая-нибудь особенность включения 16-битной NAND в отличие от 8-ми битной?

Сообщение отредактировал primus - Jul 6 2009, 05:25
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 6 2009, 10:33
Сообщение #4


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Intel StrataFlash 28F128
Go to the top of the page
 
+Quote Post
primus
сообщение Jul 6 2009, 14:09
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 9-04-07
Из: Санкт-Петербург
Пользователь №: 26 884



Во время считывания ID сигнал R/B генерируется? На временной диаграмме он не указан. Однако должен он генерироваться при переходе в режим конфигурирования или подачи управляющей комманды?

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
MemoryTest
сообщение Jul 7 2009, 13:41
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 25-01-05
Из: Мск регион.
Пользователь №: 2 161



Цитата(primus @ Jul 6 2009, 18:09) *


может просто at91rm9200 не поддерживает 16 бит NAND.
похоже что более свежий сам9260 поддерживает а старичок нет =( (см. таблицы).
В инициализации вроде все правильно у Вас.
я вот так конфигурю для 8 бит NAND.

CODE
/* Setup Smart Media, first enable the address range of CS3 */
pEBI->EBI_CSA |= AT91C_EBI_CS3A_SMC_SmartMedia;
/* set the bus interface characteristics based on
tDS Data Set up Time 30 - ns
tDH Data Hold Time 20 - ns
tALS ALE Set up Time 20 - ns
16ns at 60 MHz ~= 3 */ // i Use 89Mhz but Faster NAND memory -> so stay with this settings

#define AT91C_SM_RWH (1 << 28) /* orig = 1 */
#define AT91C_SM_RWS (1 << 24) /* orig = 0 */
#define AT91C_SM_TDF (1 << 8) /* orig = 1 */
#define AT91C_SM_NWS (3) /* orig = 3 */
pEBI->EBI_SMC2_CSR[3] = ( AT91C_SM_RWH | AT91C_SM_RWS |
AT91C_SMC2_ACSS_STANDARD |
AT91C_SMC2_DBW_8 | AT91C_SM_TDF |
AT91C_SMC2_WSEN | AT91C_SM_NWS);


/* enable PC0=SMCE, PC1=SMOE, PC3=SMWE, A21=CLE, A22=ALE */
pPIOC->PIO_ASR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE | AT91C_PC3_BFBAA_SMWE;
pPIOC->PIO_PDR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE | AT91C_PC3_BFBAA_SMWE;

/* Configure PC2 as input (signal READY of the SmartMedia) */
pPIOC->PIO_PER = AT91C_PC2_BFAVD; /* enable direct output enable */
pPIOC->PIO_ODR = AT91C_PC2_BFAVD; /* disable output */




Ps. можно попробовать повесить эту 16ти битную нанд, на какой нибудь CS2 например, и сконфигурить
EBI как для работы с обычной 16bit RAM, при этом придется добавить 2 внешних логических элемента.
я так делал когда мне нужно было 2 nand флеши на плате -) одна висела на CS3, другая на CS2, работали не зависимо друг от друга =)
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
primus
сообщение Jul 8 2009, 11:46
Сообщение #7





Группа: Участник
Сообщений: 11
Регистрация: 9-04-07
Из: Санкт-Петербург
Пользователь №: 26 884



Цитата(MemoryTest @ Jul 7 2009, 17:41) *
может просто at91rm9200 не поддерживает 16 бит NAND.


Не думаю что 9200 не поддерживает 16х NAND flash. Доказательств этому не нашел, но и опровержений на www.atmell.com нет. Если 16х NAND flash поддерживает SAM7, то, логично предположить, что и 9200 должен.

На представленных Вами принт-скринах содержиться пример реализации 8-ми битной NAND описанный в даташите. В нем явно не указанно какой тип NAND flash поддерживает м\с.

Вот пример реализации 8-ми и 16-ти разрядных NAND flash при использовании AT91SAM7SE.
Прикрепленное изображение
Прикрепленное изображение

Цитата(MemoryTest @ Jul 7 2009, 17:41) *
Ps. можно попробовать повесить эту 16ти битную нанд, на какой нибудь CS2 например, и сконфигурить
EBI как для работы с обычной 16bit RAM, при этом придется добавить 2 внешних логических элемента.
я так делал когда мне нужно было 2 nand флеши на плате -) одна висела на CS3, другая на CS2, работали не зависимо друг от друга =)


Решил идти несколько другим путем. Все сигналы, кроме разрешения чтения\записи, завел на PIO. К сожалению, положительных результатов получить не смог. Думаю что проблема заключается в таймингах управляющих сигналов, но где понять не могу. sad.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 9 2009, 11:57
Сообщение #8


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



У Atmel аккурат появилась информация по подключению NAND flash : http://www.atmel.com/dyn/general/tech_doc....p;family_id=605
Go to the top of the page
 
+Quote Post
dch
сообщение Jul 13 2009, 15:09
Сообщение #9


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



Цитата(MemoryTest @ Jul 7 2009, 17:41) *
может просто at91rm9200 не поддерживает 16 бит NAND.

я юзал самсунговскую 128 Mb 8и битную NAND , утилита прошивки

http://ucrouter.ru/download/AT91RM9200-k9f1g08u0a.bin
http://ucrouter.ru/download/AT91RM9200-29lv160d-1.tgz

всё в норме, схемку подключения если по коментариям не видно выложу, линуксовый драйверок - правки к нему к нему не сохранился - но работало :-)
Go to the top of the page
 
+Quote Post
primus
сообщение Jul 21 2009, 17:51
Сообщение #10





Группа: Участник
Сообщений: 11
Регистрация: 9-04-07
Из: Санкт-Петербург
Пользователь №: 26 884



Все оказалось гораздо проще. Выбранная микросхема Micron MT29F4G08AAAWP ET D, в отличие от своих аналогов более ранних версий таких как Micron MT29F4G08AAAWP ET A (B, C), выполнена по новому стандарту ONFI. Даташит на нее вышел только 9 апреля 2009 года. На официальном сайте упоминаний, что данная серия будет переведена на новый стандарт опубликовано не было.
Основное отличие заключается в расширенной структуре команд, а также распиновки шины данных (см рис).
Прикрепленное изображение
Прикрепленное изображение

По рисункам видно, что младшие адреса шины данных у новых 16-ти и 8-ми разрядных Nand Flash одинаковые, а в более ранних версиях микросхем они разные. Таким образом для микросхем памяти типа NAND, перешедших на новый стандарт, требуется другая трассировка платы. Если же это сделать нельзя (перетрассировать плату), то можно поступить иначе (использовать «программные заплатки»). Т.к. новый стандарт не отличается по алгоритмам чтения, записи или очистки блока, то необходимо перекодировать команды, чтобы на всех линиях шины данных были необходимые состояния. Для этого нужно использовать следующие процедурки:
Код
// MOVEBIT macro
#define MOVEBIT(x,s,d)        ((((x)>>(s)) & 0x1) << (d))

// test functions

// nand_Forward
unsigned nand_Forward(unsigned x)
{
  // form and return result   return
    MOVEBIT(x, 0, 9)  | MOVEBIT(x, 1, 2) | MOVEBIT(x, 2, 10) | MOVEBIT(x, 3, 3) |
    MOVEBIT(x, 4, 12) | MOVEBIT(x, 5, 5) | MOVEBIT(x, 6, 13) | MOVEBIT(x, 7, 6);
}

// nand_Backward
unsigned nand_Backward(unsigned x)
{
  // form and return result  return
    MOVEBIT(x, 9, 0)  | MOVEBIT(x, 2, 1) | MOVEBIT(x, 10, 2) | MOVEBIT(x, 3, 3) |
    MOVEBIT(x, 12, 4) | MOVEBIT(x, 5, 5) | MOVEBIT(x, 13, 6) | MOVEBIT(x, 6, 7);
}


Пример использования макросов. Процедура чтения id.
Код
#define read_data()                  (*(volatile unsigned short*)0x40000000)

#define write_data(x)              *((volatile unsigned short*)0x40000000) = (unsigned short)(x)
#define write_command(x)          *((volatile unsigned short*)0x40080000) = (unsigned short)(x)
#define write_address(x)          *((volatile unsigned short*)0x40100000) = (unsigned short)(x)


void NAND_READ_ID(void)
{
  unsigned short status;
  unsigned short shifr_value = 0x0;
    
    sys_DoDelay(1);
    
    write_command( nand_Forward(0xFF) );
    sys_DoDelay(100);


    //write_command( nand_Forward(0x90) );
    write_command( 0x0090);
    write_address(0x0000);

    status = read_data ();
    status = nand_Backward(status);
    printf("NAND status = [%.4x] ", (unsigned)status);

    status = read_data ();
    status = nand_Backward(status);
    printf(" [%.4x] ", (unsigned)status);

    status = read_data ();
    status = nand_Backward(status);
    printf(" [%.4x] ", (unsigned)status);

    status = read_data ();
    status = nand_Backward(status);
    printf(" [%.4x]\n", (unsigned)status);
}


Забыл упомянуть, перед началом работы с NAND микросхему необходимо софтверно перезагрузить, путем подачи команды 0xFF.
Т.к. команды управления м/c жестко определены, то для экономии ресурсов системы их можно объявить статическ define, предварительно изменив режим компиляции.
например
Код
#define NAND_CMD_READ0            ( nand_Forward(0))
#define NAND_CMD_READ1            ( nand_Forward(1))
#define NAND_CMD_READ_CONFIRM                    ( nand_Forward(0x30))
#define NAND_CMD_PAGEPROG                        ( nand_Forward(0x10))
#define NAND_CMD_READOOB                        ( nand_Forward(0x50))
#define NAND_CMD_ERASE1            ( nand_Forward(0x60))
#define NAND_CMD_STATUS            ( nand_Forward(0x70))
#define NAND_CMD_SEQIN            ( nand_Forward(0x80))
#define NAND_CMD_READID            ( nand_Forward(0x90))
#define NAND_CMD_ERASE2            ( nand_Forward(0xd0))
#define NAND_CMD_RESET            ( nand_Forward(0xff))


В результате выше указанные макросы нужно будет использовать только в случае записи адреса или получения статуса.

Можно долго посыпать себе голову пеплом и кричать, что нужно вначале читать даташит, а потом трассировать плату, однако вовремя получить даташит с сайта MIRCON мне не удалось. Это вызвано усложненной системой скачиваания документации по письменному запросу.

Надеюсь эта статья поможет сохранить ваши нервы, в случае использования таких версий микросхем.

После написания базовых функций записи, чтения и очистки блока. Была поставлена файловая система yaffs. Полет нормальный! Ниже привожу код функций direct интерфеса, необходимого для запуска yaffs. Код сырой!

Код
void nand_read_page ( int page, unsigned char *buffer, unsigned char *tags )
{
    unsigned int  block_num;
    unsigned int  page_num;
    unsigned int i = 0x0;
    unsigned short temp_read;
            
    page_num  = page / NAND_PAGE_MAX;
    block_num = page % NAND_PAGE_MAX;
    
    write_command(0x0);
    
    write_address(0x0);
    write_address(0x0);
    write_address( nand_Forward(page_num | ((block_num & 3) <<6) ));
    write_address(nand_Forward((block_num >> 2) & 0xFF ));
    write_address(nand_Forward((block_num >>10) & 0x01 ));

    write_command(nand_Forward(0x30));


    for (i = 0; i < NAND_COUNT_DATA; i+=2)
    {
                   if(buffer)
                     {
//                temp_read = read_data();
//                buffer[i] = (char)(temp_read & 0x00FF);
                temp_read = read_data();
                buffer[i] = (char)(temp_read & 0x00FF);
                
                if ((i + 1) < NAND_COUNT_TAGS )
                    buffer[i+1] = (char)((temp_read & 0xFF00) >> 8);
                     }
                     else read_data();
    }
    
    if (tags)
    {
        for ( i = 0; i < NAND_COUNT_TAGS; i+=2 )
            {
//                temp_read = read_data();
//                tags[i] = (char)(temp_read & 0x00FF);

                temp_read = read_data();
                tags[i] = (char)(temp_read & 0x00FF);
                
                if ((i + 1) < NAND_COUNT_TAGS )
                    tags[i] = (char)((temp_read & 0xFF00) >> 8 );
            }
    }
}


void nand_write_page ( int page, unsigned char *buffer, unsigned char *tags )
{
    unsigned int i;
    unsigned short status_data = 0x0;

    unsigned int block_num;
    unsigned int  page_num;
    
    unsigned short temp_read;
    
    page_num  = page / NAND_PAGE_MAX;
    block_num = page % NAND_PAGE_MAX;

    write_command( nand_Forward( 0x80 ) );
    
    write_address(0x0);
    write_address(0x0);
    write_address( nand_Forward(page_num | ((block_num & 3) <<6) ));
    write_address( nand_Forward((block_num >> 2) & 0xFF ));
    write_address( nand_Forward((block_num >>10) & 0x01 ));
    
    for( i = 0; i < NAND_COUNT_DATA; i=+2 )
    {
        temp_read = 0x0;
//        temp_read = (temp_read  | buffer[i]);

        if ((i+1) < NAND_COUNT_DATA)
            temp_read = ((buffer[i+1] << 8) | buffer[i]);
        else temp_read = (temp_read  | buffer[i]);

        write_data( temp_read );
    }
    
    if ( tags )
    {
        for(i = 0; i < NAND_COUNT_TAGS; i+=2)
        {
            temp_read = 0x0;
//            temp_read = (temp_read  | buffer[i]);
            if ((i+1) < NAND_COUNT_DATA)
                temp_read = ((tags[i+1] << 8) | tags[i]);
            else temp_read = (temp_read  | tags[i]);
            write_data( temp_read );
        }
    }
    
    write_command(nand_Forward(0x10));
//    rtems_task_wake_after(50);
    write_command(nand_Forward(0x70));
    
// status chec    
    
    while (1)
    {
         status_data = read_data();
        status_data = nand_Backward(status_data);
        printf("[%x]\n",status_data);
        if (status_data == 0x60) break;
        if (status_data == 0xE0) break;
    }
//printf("write page done\n");
}


void nand_block_erase ( int block_num )
{
    if ( block_num >= NAND_MAX_BLOCK_NUM )
        return;

    write_command( nand_Forward(0x60) );
//    rtems_task_wake_after(3);
                                //    page_num |

    write_address( nand_Forward( ((block_num & 3) <<6) ));
    write_address( nand_Forward(( block_num >>  2 ) & 0xFF) );
    write_address( nand_Forward(( block_num >> 10 ) & 0x01) );

//    rtems_task_wake_after(3);
    write_command( nand_Forward(0xD0) );

    rtems_task_wake_after(3);

}

/****************************/

int yflash_EraseBlockInNAND(yaffs_Device *dev, int blockNumber)
{
    nand_block_erase(blockNumber);

    return YAFFS_OK;
}

static int yaffs_CheckAllFF(unsigned char *ptr, int n)
{
    while(n)
    {
        n--;
        if(*ptr!=0xFF) return 0;
        ptr++;
    }
    return 1;
}

int yflash_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data, yaffs_ExtendedTags *tags)
{
    nand_read_page(chunkInNAND, data, (unsigned char *)tags);

    if (yaffs_CheckAllFF((unsigned char *)tags, sizeof(yaffs_ExtendedTags)))
        yaffs_InitialiseTags(tags);
    else
        tags->chunkUsed = 1;

    return YAFFS_OK;
}

int yflash_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data, yaffs_ExtendedTags *tags)
{

    nand_write_page(chunkInNAND, data, (unsigned char *)tags);

    return YAFFS_OK;
}

int yflash_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, yaffs_BlockState *state, int *sequenceNumber)
{
    yaffs_ExtendedTags tags;
    int chunkNo;

    *sequenceNumber = 0;

    chunkNo = blockNo * dev->nChunksPerBlock;

    yflash_ReadChunkWithTagsFromNAND(dev,chunkNo,NULL,&tags);
    if(tags.blockBad)
    {
        *state = YAFFS_BLOCK_STATE_DEAD;
    }
    else if(!tags.chunkUsed)
    {
        *state = YAFFS_BLOCK_STATE_EMPTY;
    }
    else if(tags.chunkUsed)
    {
        *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;
        *sequenceNumber = tags.sequenceNumber;
    }
    return YAFFS_OK;
}

int yflash_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo)
{
    printf("!!!!!!! MarkNANDBlockBad!!!!! %d\n", blockNo);

    return YAFFS_OK;
}

int yflash_InitialiseNAND(yaffs_Device *dev)
{
    return YAFFS_OK;
}

void nand_all_blocks_erase ( void )
{
    int block;
    puts("Erasing all blocks...");

    for (block = 0; block < NAND_MAX_BLOCK_NUM; block++)
    {
        nand_block_erase(block);
    }
    puts("Done.");
}

/****************************/


Сообщение отредактировал primus - Jul 21 2009, 18:01
Go to the top of the page
 
+Quote Post
dch
сообщение Jul 22 2009, 02:17
Сообщение #11


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



я помню что там особенных проблемм не было, ориентироваться неплохо на NAND от самсунга а обычную память от микрона, другое дело что она у микрона иногда хуже или это у нас подделки или отбросы
Go to the top of the page
 
+Quote Post
Kadr
сообщение Nov 16 2011, 11:07
Сообщение #12





Группа: Новичок
Сообщений: 4
Регистрация: 10-04-08
Из: Минск
Пользователь №: 36 637



На ревизию D немного отличается распиновка ног. Надо присоединить к питанию дополнительно 34 и 39 ноги, а к земле 36 ногу микросхемы
Go to the top of the page
 
+Quote Post
Kadr
сообщение Nov 16 2011, 12:26
Сообщение #13





Группа: Новичок
Сообщений: 4
Регистрация: 10-04-08
Из: Минск
Пользователь №: 36 637



Цитата(Kadr @ Nov 16 2011, 14:07) *
На ревизию D немного отличается распиновка ног. Надо присоединить к питанию дополнительно 34 и 39 ноги, а к земле 36 ногу микросхемы

плюс еще ноги данных были поменяны местами
Go to the top of the page
 
+Quote Post

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

 


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


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