|
замена AT45DB161B-RI на AT45DB161D-SU, проблема с отсутствием ноги RDY/~BUSY |
|
|
|
 |
Ответов
|
Nov 17 2006, 12:41
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(plombir @ Nov 17 2006, 19:33)  Доброго дня, Господа! ... ... Если кто сталкивался с программным опросом м/с flash AT45 через регистр, подскажите пожалуйста последовательность действий при ожидании занятости. Буквально на днях нацарапал вот такую подпрограммку - работает) Код /***************************************************************************** Биты регистра состояния ******************************************************************************/
/* Bit 7 = "1" (RDY) indicates the device is ready. Bit 7 = "0" indicates the write cycle is in progress. */ #define AT45_SREG_RDY 7
/* Bit 6 = "0" data in the main memory page matches the data in the buffer. Bit 6 = "1" at least one bit of the data in the main memory page not match the data in the buffer. */ #define AT45_SREG_COMP 6
/* маска идентификатора чипа, сдвинутая в право на два бита */ #define AT45_DEVICE_ID_MASK (0x0F << 2)
/***************************************************************************** Инициализация SPI драйвера и тестирование МС памяти Возвращает TRUE, если нет ошибок памяти, иначе FALSE ******************************************************************************/ BOOL SPIMEM_Init(void) { SPI_Init(); /* инициализируем порт SPI */
/* ждем установки памяти в рабочее состояние */ ULONG start = g_SysTIME_ms; while(AT45_STARTUP_TIME > (g_SysTIME_ms - start));
/* читаем регистр статуса МС */ UCHAR status = SPIMEM_GetStatus(); if(AT45_DEVICE_ID != (status & AT45_DEVICE_ID_MASK)) return FALSE; /* ошибка! не совпал ID установленной МС */
/* тестируем внутренние буферы МС */ UCHAR test = 0x55; /* тест-байт */ for(UCHAR j = 0; j < 2; j++) { for(UINT i = 0; i < AT45_PAGE_SIZE; i++) { /* пишем тест-байт в оба буфера */ SPIMEM_BufWrite(AT45_BUFFER1_WRITE, i, 1, &test); SPIMEM_BufWrite(AT45_BUFFER2_WRITE, i, 1, &test); /* проверяем прочитанный байт на равенство тест-байту */ SPIMEM_BufRead(AT45_BUFFER1_READ, i, 1, &status); if(test != status) return FALSE; SPIMEM_BufRead(AT45_BUFFER2_READ, i, 1, &status); if(test != status) return FALSE; } test = 0xAA; /* инвертируем тест-байт */ }
/* OK */ return TRUE; }
/***************************************************************************** Чтение регистра статуса AT45_STATUS_READ ******************************************************************************/ UCHAR SPIMEM_GetStatus(void) { SPI_SlaveSelect(); /* выбираем чип */ SPI_Write(AT45_STATUS_READ); /* посылаем команду */ UCHAR status = SPI_Read(); /* читаем статус */ SPI_SlaveDeselect(); /* освобождаем чип */ return status; }
/***************************************************************************** Чтение порта SPI ******************************************************************************/ UCHAR SPI_Read(void) { SPDR = 0xff; /* загружаем SPI данными */ while(!(SPSR & (1<<SPIF))); /* ждем окончания передачи */ return SPDR; /* возвращаем принятые данные */ }
/***************************************************************************** Запись в порт SPI ******************************************************************************/ void SPI_Write(UCHAR data) { SPDR = data; /* загружаем SPI данными */ while(!(SPSR & (1<<SPIF))); /* ждем окончания передачи */ }
/***************************************************************************** Чтение буфера AT45_BUFFER1(2)_READ = 0x54(0x56) Вход: command - команда чтения буфера №1 или №2 buf_pos - адрес начала читаемого блока в буфере size - размер блока trg - буфер для записи ******************************************************************************/ void SPIMEM_BufRead(UCHAR command, UINT buf_pos, UINT size, UCHAR *trg) { /* сылаем команду */ SPIMEM_Tx5(command, 0, buf_pos);
/* читаем массив */ while(size--) *trg++ = SPI_Read();
/* освобождаем чип */ SPI_SlaveDeselect(); }
/***************************************************************************** Запись в буфер AT45_BUFFER1(2)_WRITE = 0x84(0x87) Вход: command - команда записи в буфер №1 или №2 buf_pos - адрес начала читаемого блока в буфере size - размер блока src - буфер для чтения ******************************************************************************/ void SPIMEM_BufWrite(UCHAR command, UINT buf_pos, UINT size, UCHAR *src) { /* посылаем команду */ SPIMEM_Tx4(command, 0, buf_pos);
/* пишем массив */ while(size--) SPI_Write(*src++);
/* освобождаем чип */ SPI_SlaveDeselect(); }
/***************************************************************************** 4-х байтная посылка: Вход: command - команда page_addr - адрес страницы buf_pos - позиция в буфере
!!! Кроме этого производит выборку кристалла МС !!! ******************************************************************************/ void SPIMEM_Tx4(UCHAR command, UINT page_addr, UINT buf_pos) { SPI_SlaveSelect(); page_addr <<= 1; SPI_Write(command); SPI_Write(HIBYTE(page_addr)); SPI_Write(LOBYTE(page_addr) | HIBYTE(buf_pos)); SPI_Write(LOBYTE(buf_pos)); }
/***************************************************************************** 5-и байтная посылка: Установка адреса дополняется посылкой 1-го пустого байта
!!! Кроме этого производит выборку кристалла МС !!! ******************************************************************************/ void SPIMEM_Tx5(UCHAR command, UINT page_addr, UINT buf_pos) { SPIMEM_Tx4(command, page_addr, buf_pos); SPI_Write(0); }
--------------------
|
|
|
|
Сообщений в этой теме
plombir замена AT45DB161B-RI на AT45DB161D-SU Nov 17 2006, 12:33 VDG Цитата(plombir @ Nov 17 2006, 15:33) Если... Nov 17 2006, 12:42 prottoss Раз уж создана тема про ДатаФлэш, хотелось бы спро... Nov 17 2006, 15:14 zltigo Цитата(prottoss @ Nov 17 2006, 17:14) Раз... Nov 17 2006, 19:36 rezident Цитата(prottoss @ Nov 17 2006, 20:14) Раз... Nov 17 2006, 20:23  prottoss Цитата(rezident @ Nov 18 2006, 03:23) На ... Nov 18 2006, 16:17 vesago Я из экономии ног и 28 ноговую db161 опрашивал чер... Nov 17 2006, 19:29 Ykidia ЦитатаНичего сложного там нет. Читаете даташит и с... Mar 28 2007, 12:41 Сергей Борщ Цитата(Ykidia @ Mar 28 2007, 11:41) Так ч... Mar 28 2007, 13:05 Ykidia Спасибо за ответ. У меня примерно такой же код (со... Mar 28 2007, 13:25 Сергей Борщ Цитата(Ykidia @ Mar 28 2007, 12:25) однак... Mar 28 2007, 13:47 add Работал с AT45DB041 в soic8 корпусе. Там нет ножк... Mar 28 2007, 13:35 Ykidia Да, фиктивную передачу делаю, иначе просто бит око... Mar 28 2007, 14:38 Сергей Борщ Цитата(Ykidia @ Mar 28 2007, 13:38) Да, ф... Mar 29 2007, 13:46 Itch Насколько я понял из даташита, читать весь статусн... Mar 28 2007, 21:42 Artem_Petrik Цитатаdo {
DF_ChipSelect_Start();
... Mar 28 2007, 22:30 Ykidia Вот они:
Код#define SPI_MODE 0x38 // MSTR CPOL... Mar 30 2007, 10:17 Сергей Борщ Цитата(Ykidia @ Mar 30 2007, 09:17) Вот о... Mar 30 2007, 12:53 sensor_ua ЦитатаЕдинственное, у меня IAR строчки вида S0SPSR... Mar 31 2007, 10:00 Сергей Борщ Цитата(sensor_ua @ Mar 31 2007, 09:00) Вс... Mar 31 2007, 13:24  zltigo Цитата(Сергей Борщ @ Mar 31 2007, 12:24) ... Mar 31 2007, 16:32   Сергей Борщ Цитата(zltigo @ Mar 31 2007, 15:32) Да не... Mar 31 2007, 16:45    zltigo Цитата(Сергей Борщ @ Mar 31 2007, 15:45) ... Mar 31 2007, 17:03 Ykidia ЦитатаВы же данные не тем концом суете.
Вообще-то ... Mar 31 2007, 20:59 Сергей Борщ Цитата(Ykidia @ Mar 31 2007, 19:59) Ну а ... Mar 31 2007, 22:57 defunct Цитата(Ykidia @ Mar 31 2007, 19:59) Вообщ... Apr 1 2007, 04:56  zltigo Цитата(defunct @ Apr 1 2007, 03:56) Я бы ... Apr 1 2007, 09:18 sensor_ua ЦитатаЯ бы так ни в жизнь не написал
А меня задолб... Apr 1 2007, 08:27 Ykidia ЦитатаЯ бы попробовал с таким максимально простым ... Apr 1 2007, 23:48 defunct Цитата(Ykidia @ Apr 1 2007, 22:48) и оказ... Apr 2 2007, 00:08 Ykidia Доброе утро!
ЦитатаV32 это естьtypedef volati... Apr 2 2007, 00:18 Ykidia Господа! Прошу простить меня за беспокойство... Apr 3 2007, 16:37 Ykidia Забыл сказать всем ответившим - большое спасибо за... Apr 3 2007, 22:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|