Но вот в чем беда, первые 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; // Запись произведена успешно
}
#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; // Запись произведена успешно
}