Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись в SPI EEPROM M95640
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Цифровые схемы, высокоскоростные ЦС
Дэм
Пытаюсь записать в 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; // Запись произведена успешно
}
Дэм
Наверное понял в чем косяк, адрес то не увеличиваю то biggrin.gif , вот в тоже место то и пишет.
Не нифига инкремент адреса не помогает crying.gif

Получается вот так
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F

заполнил массив от 0 до 2F и записал его получается что с 20 по 2F перезаписывает от 0 до 0F
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.