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

 
 
> замена AT45DB161B-RI на AT45DB161D-SU, проблема с отсутствием ноги RDY/~BUSY
plombir
сообщение Nov 17 2006, 12:33
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



Доброго дня, Господа!

Так как м/с flash AT45DB161B-RI (28 ног) снята с производства, решено заменить её на 8-и ножечную. Так, вот, проблема возникла при написании кода определения занятости м/с. Если раньше сигнал проверялся на ноге RDY/~BUSY и проблем не было, то здесь она отсутствует и приходится проверять через "Регистр Статуса" 7-ой бит. Что то не получается... Перепробовал по разному и по всякому. Начинает работать если ставится задержка из цикла NOP-ов вместо ожидания.

Если кто сталкивался с программным опросом м/с flash AT45 через регистр, подскажите пожалуйста последовательность действий при ожидании занятости.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prottoss
сообщение Nov 17 2006, 12:41
Сообщение #2


Гуру
******

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


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 12:26
Рейтинг@Mail.ru


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