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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Пример работы с AT25DF641., Может у кого есть готовый исходник?
AHTOXA
сообщение Sep 7 2011, 11:16
Сообщение #16


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да, именно. (В четвёртом сообщении темы есть пример)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
yurmala
сообщение Sep 8 2011, 04:41
Сообщение #17


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814



Цитата(AHTOXA @ Sep 7 2011, 17:16) *
Да, именно. (В четвёртом сообщении темы есть пример)

Я его изначально за основу и взял, если честно. Но неопределенность с функциями 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;
}

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 8 2011, 05:21
Сообщение #18


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да вроде правильно всё... Может, ножка WP случайно на землю попала?

ЗЫ. Обратите внимание, пример - для EEPROM, а у вас - FLASH. В EEPROM можно писать данные поверх старых значений, а FLASH надо стирать перед записью.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
yurmala
сообщение Sep 8 2011, 05:34
Сообщение #19


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814



Цитата(AHTOXA @ Sep 8 2011, 11:21) *
Да вроде правильно всё... Может, ножка WP случайно на землю попала?

это нет. у нас WP аппаратно висит на 3.3V
Цитата(AHTOXA @ Sep 8 2011, 11:21) *
ЗЫ. Обратите внимание, пример - для 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);
}

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 8 2011, 06:04
Сообщение #20


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Не вижу ошибок. Unprotect Sector - вряд ли. Global Protect/Unprotect - тем более.
Остаётся посмотреть осциллографом, может всё-таки функция ssp_rw() как-то не так работает. (Или дождаться того, кто работал с LPC2468)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
yurmala
сообщение Sep 8 2011, 06:28
Сообщение #21


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814



Цитата(AHTOXA @ Sep 8 2011, 12:04) *
Не вижу ошибок. 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);
}
Go to the top of the page
 
+Quote Post

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

 


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


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