Пытаюсь записать страницу (32 байта) в EEPROM с помощью atmega128.
Если коротко, то код отвечающий за запись значений в EEPROM такой
CODE
EEPROM.write_byte(0xAA, 0x520); /* 1 */
_delay_ms(10);
EEPROM.write_byte(0xAA, 0x600); /* 2 */
_delay_ms(10);
EEPROM.write_word(0xA5A5, 0x700); /* 3 */
_delay_ms(10);
EEPROM.write_word(0xA5A5, 0x800); /* 4 */
_delay_ms(10);
uint8_t temp_value[16];
for (i=0; i<15; i++)
temp_value[i] = 0xB5;
EEPROM.write_page(0x900, temp_value, 16); /* 5 */
_delay_ms(10);
for (i=0; i<15; i++)
temp_value[i] = 0xB6;
EEPROM.write_page(0x1000, temp_value, 16); /* 6 */
_delay_ms(10);
вариант 1 и 2, а также 3 и 4, записываются нормально, вариант 5 и 6 вроде пишутся, но по непонятным адресам. Дамп памяти выглядит следующим образом (звездочка ("*") значит что значения не меняются).
CODE
*
00000500 05 10 55 55 55 55 55 55 55 55 55 55 55 55 55 55 |..UUUUUUUUUUUUUU|
00000510 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 |UUUUUUUUUUUUUUUU|
00000520 aa 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 |.UUUUUUUUUUUUUUU|
00000530 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 |UUUUUUUUUUUUUUUU|
*
00000600 aa 55 55 55 55 55 55 55 55 00 b5 b5 b5 b5 b5 b5 |.UUUUUUUU.......|
00000610 00 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 |................|
00000620 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 |UUUUUUUUUUUUUUUU|
*
00000700 a5 a5 55 55 55 55 55 55 55 55 55 55 55 55 55 55 |..UUUUUUUUUUUUUU|
00000710 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 |UUUUUUUUUUUUUUUU|
*
00000800 a5 a5 55 55 55 55 55 55 55 55 55 55 55 55 55 55 |..UUUUUUUUUUUUUU|
00000810 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 |UUUUUUUUUUUUUUUU|
*
вся память, изначально, заполнена значениями 0x55. Как видно из приведенного фрагмента (результат команды hexdump), значения пишутся по адресам 0x609-0x61F, хотя должны были по 0x900 и 0x1000. Еще не совсем понятно от куда взялись нули (0x00).
Исходный текст функции write_page():
CODE
uint8_t at24c64::write_page(const uint16_t addr,
const uint8_t * message,
const uint8_t size_of_message)
{
uint8_t i;
start_i2c();
/* Микросхема не на линии */
if (false == write_i2c(i2c_address)) {
stop_i2c();
return EXIT_FAILURE;
}
(void)write_i2c(i2c_address);
(void)write_i2c((uint8_t)(addr >> 8));
(void)write_i2c((uint8_t)addr);
for (i=0; i < size_of_message; i++, message++) {
(void)write_i2c(*message);
}
stop_i2c();
return EXIT_SUCCESS;
}
Развернутое описание класса at24c64 и Iic приводится в прикрепленном файле (исходники в utf8)
В чем может быть проблема?
П.С. Спасибо что дочитали до конца!:-))
Прикрепленные файлы
files.zip ( 3.34 килобайт )
Кол-во скачиваний: 21