AHTOXA 18 7 сентября, 2011 Опубликовано 7 сентября, 2011 · Жалоба Да, именно. (В четвёртом сообщении темы есть пример) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба Да, именно. (В четвёртом сообщении темы есть пример) Я его изначально за основу и взял, если честно. Но неопределенность с функциями spi_r8 и spi_w привела в тупик. Вот сейчас не получается добиться того чтобы прочитать из микросхемы записанный ранее байт. Функция записи получилась такая: uint8_t ssp_rw(uint8_t b) { SSP1DR = b; // передаём while ( !(SSP1SR & SSPSR_RNE) ); // ждём пока примется return SSP1DR; } void at25_command(char cmd) { at25_SSEL_low(AT25_CS); ssp_rw(cmd); } void at25_write_byte(uint32_t adr, uint8_t data) { at25_command(EE_WREN); at25_SSEL_high(AT25_CS); // toggle CS, necessary for WREN at25_command(EE_WRITE); ssp_rw(adr >> 16); ssp_rw(adr >> 8); ssp_rw(adr); ssp_rw(data); at25_SSEL_high(AT25_CS); while (at25_read_status()& SS_WRITING); } Функция at25_write_byte() вроде отрабатывает без ошибок. Но при чтении этого байта - вместо мною записанного байта возвращается 0xFF Функция чтения: uint8_t at25_read_byte(uint32_t adr) { uint8_t result; at25_command(EE_READ); ssp_rw(adr >> 16); ssp_rw(adr >> 8); ssp_rw(adr); result = ssp_rw(0); at25_SSEL_high(AT25_CS); return result; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба Да вроде правильно всё... Может, ножка WP случайно на землю попала? ЗЫ. Обратите внимание, пример - для EEPROM, а у вас - FLASH. В EEPROM можно писать данные поверх старых значений, а FLASH надо стирать перед записью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба Да вроде правильно всё... Может, ножка WP случайно на землю попала? это нет. у нас WP аппаратно висит на 3.3V ЗЫ. Обратите внимание, пример - для EEPROM, а у вас - FLASH. В EEPROM можно писать данные поверх старых значений, а FLASH надо стирать перед записью. Вот как у меня выполняется: ... at25_erase_4kb(0); at25_write_byte(0,22); read_byte = at25_read_byte(0); ... void at25_erase_4kb(uint32_t adr) { at25_command(EE_WREN); at25_SSEL_high(AT25_CS); // toggle CS, necessary for WREN at25_command(EE_ERASE4); // 0х20 ssp_rw(adr >> 16); ssp_rw(adr >> 8); ssp_rw(adr); at25_SSEL_high(AT25_CS); while (at25_read_status()& SS_WRITING); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба Не вижу ошибок. Unprotect Sector - вряд ли. Global Protect/Unprotect - тем более. Остаётся посмотреть осциллографом, может всё-таки функция ssp_rw() как-то не так работает. (Или дождаться того, кто работал с LPC2468) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба Не вижу ошибок. Unprotect Sector - вряд ли. Global Protect/Unprotect - тем более. Остаётся посмотреть осциллографом, может всё-таки функция ssp_rw() как-то не так работает. (Или дождаться того, кто работал с LPC2468) AHTOXA, ты прав. Sector Protect Register выдал мне 0xFF - сектор защищен. Unprotect Sector помог. Спасибо тебе огромное. Добавленные функции: uint8_t at25_read_protect_register(uint32_t adr) { uint8_t result; at25_command(EE_RDPR); ssp_rw(adr >> 16); ssp_rw(adr >> 8); result = ssp_rw(adr); result = ssp_rw(0); at25_SSEL_high(AT25_CS); return result; } void at25_Unprotect_Sector(uint32_t adr) { at25_command(EE_WREN); at25_SSEL_high(AT25_CS); // toggle CS, necessary for WREN at25_command(EE_UNPROTECT); ssp_rw(adr >> 16); ssp_rw(adr >> 8); ssp_rw(adr); at25_SSEL_high(AT25_CS); while (at25_read_status()& SS_WRITING); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться