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

 
 
> Запись в SPI EEPROM M95640, Почему то не хочет писать свыше 32 байт (page write)
Дэм
сообщение Apr 21 2012, 03:46
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 47
Регистрация: 23-05-04
Из: Барнаул
Пользователь №: 18



Пытаюсь записать в SPI EEPROM M95640, сама EEPROM поддерживает запись блоками по 32 байта, если данных больше чем 32 байта я записываю блоками по 32 + остаток.

Но вот в чем беда, первые 32 байта записываются, но остальные никак не хотят писаться.
Привожу код на Си как я это делаю.
index - это количество байт записываемое в одном блоке, если данных 30 байт, а index = 10, то запишется только 10 байт, остальные нет.

Алгоритм на запись такой:
1. Начало.
2. Выбираем EEPROM.
3. Ожидаем пока бит RDY будет = 0 - запись разрешена.
4. НЕ выбираем EEPROM.

5. Выбираем EEPROM.
6. Посылаем инструкцию разрешения записи.
7. НЕ выбираем EEPROM.
8. Если бит WEN = 1 то запись разрешена, иначе запись запрещена и переходим на пункт 21.

9. Выбираем EEPROM.
10. Посылаем инструкцию записи WRITE.
11. Посылаем старший байт адреса.
12. Посылаем младший байт адреса.
13. Посылаем байт данных.
14. Уменьшаем счетчик записанных байт блока INDEX.
15. Уменьшаем общий счетчик записанных байт SIZE.
16. Если SIZE = 0 то все данные записаны, переходим на пункт 20.
17. Если INDEX не равно 0, то не все данные блока записаны, переходим на пункт 13.
18. НЕ выбираем EEPROM.

19. Проверяем SIZE равно 0 ??? Если да то все данные записаны - идем на пункт 21, иначе переходим на пункт 1.
20. НЕ выбираем EEPROM.
21. Выход.

В чем может быть проблема ???

Код
#define CMD_EE_WREN     0x06 // разрешение записи
#define CMD_EE_WRDI        0x04 // запрет записи
#define CMD_EE_RDSR        0x05 // регистр статуса чтения
#define CMD_EE_WRSR        0x01 // регистр статуса записи
#define CMD_EE_READ        0x03 // чтение данных массива памяти
#define CMD_EE_WRITE    0x02 // запись в массив памяти

#define RDY    (1 << 0) // тоже что и 0х01,  0 - устройство ожидает команды, 1 - идет цикл записи
#define WEN    (1 << 1) // тоже что и 0х02,  1 - запись в устройство разрешена

/*****************************************************************************
Блокирующая запись-чтение по SPI, с проверкой окончания операции чтения-записи
******************************************************************************/
volatile uint8_t spi_block_rw(uint8_t data)
{
  SPDR = data;                  
  while(!(SPSR & (1 << SPIF))){};
  return SPDR;
}

uint8_t EE_Get_StatusRW(void)
{
    uint8_t status;
    spi_block_rw(CMD_EE_RDSR);
    status = spi_block_rw(0xFF);
    return status;
}

void EE_Wait_RW(void)
{
    // Ожидаем пока закончится опирация записи в EEPROM
    while(EE_Get_StatusRW() & RDY);
}

/*****************************************************************************
Запись блока данных в EEPROM
******************************************************************************/
uint8_t EE_Write_Block(uint8_t *pbuf, uint16_t addr, uint8_t size)
{    
    uint8_t addr_count = 0;
    uint16_t addr1 = 0;
    
    do
    {
        uint8_t status = 0x00;
        uint8_t index = 0x1F; // Количество записываемых байт при PAGE WRITE
    
        EEPROM_SELECT();

        // Ожидаем пока закончится опирация записи в EEPROM
        EE_Wait_RW();
        EEPROM_DESELECT();
    
    
        EEPROM_SELECT();
        
        // Посылаем инструкцию разрешения записи
        spi_block_rw(CMD_EE_WREN);
        EEPROM_DESELECT();
        
        
        EEPROM_SELECT();
        spi_block_rw(CMD_EE_RDSR);
        status = spi_block_rw(0xFF);
        EEPROM_DESELECT();
        
        if(!(status & WEN)) return 0xAA; // Запись не разрешена
        
        EEPROM_SELECT();
        
        // Посылаем инструкцию записи
        spi_block_rw(CMD_EE_WRITE);
        
        addr1 = addr + (addr_count * index);
        
        // Записываем начальный адрес
        spi_block_rw((addr1 >> 8) & 0xFF);  // загружаем старший байт адреса
        spi_block_rw(addr1 & 0xFF); // загружаем младший байт адреса
    
        // начинаем цикл записи
        while(index)
        {    
            // записываем байт из буффера
            spi_block_rw(*pbuf);
            
            // Увеличиваем указатель на следующий байт
            pbuf++;
            
            index--; // Уменьшаем счетчик записанных байт текущей PAGE WRITE
            size--;     // Уменьшаем общий счетчик записанных байт  
            
            if(!size) break; // Все байты записанны выходим из функции
        };
    
        EEPROM_DESELECT();
    
        addr_count++;
        
    }while(size);

    return 0x01; // Запись произведена успешно
}


--------------------
Правильно заданный вопрос содержит половину ответа...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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