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

 
 
> Пример работы с AT25DF641., Может у кого есть готовый исходник?
tMauzer
сообщение May 21 2010, 13:44
Сообщение #1





Группа: Участник
Сообщений: 3
Регистрация: 22-03-10
Пользователь №: 56 121



Не поможет ли кто примерчиком общения с AT25DF641 флэшкой?

Хочется побыстрее её запустуть, потому что дальше интереснее... но не получается.

Взял пример от Атмела для АТ26, но он не работает. AT26_ReadJedecId(&at26); всегда возвращает 0.

Вроде как всё просто, но как-то глухо laughing.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
yurmala
сообщение Sep 7 2011, 11:12
Сообщение #2


Участник
*

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



Да. Получилось. Спасибо.

А как тогда эта система работает при чтении/записи произвольных данных?

Ведь там надо еще 3 байта адреса передавать + 2 dummy байта?
Как это будет выглядеть? Так что ли?
Чтение данных с адреса Х
Код
spi_rw(0x1B);
spi_rw(X >> 16);
spi_rw(X >> 8);
spi_rw(X);
spi_rw(0); //dummy 1
spi_rw(0); //dummy 2
for (...)
   {
   buf++ = spi_rw(0);
   }


Сообщение отредактировал yurmala - Sep 7 2011, 11:19
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 7 2011, 11:16
Сообщение #3


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

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



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


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


Участник
*

Группа: Свой
Сообщений: 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
Сообщение #5


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

Группа: Свой
Сообщений: 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
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 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
Сообщение #7


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

Группа: Свой
Сообщений: 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
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- tMauzer   Пример работы с AT25DF641.   May 21 2010, 13:44
- - zltigo   Цитата(tMauzer @ May 21 2010, 16:44) Хоче...   May 21 2010, 14:10
- - tMauzer   Железо - это практически копия at91sam7x-ek. На SP...   May 21 2010, 14:36
- - AHTOXA   Цитата(tMauzer @ May 21 2010, 19:44) Не п...   May 21 2010, 14:46
- - tMauzer   AHTOXA, ОГРОМНОЕ СПАСИБО!!! А в амело...   May 21 2010, 14:51
|- - GrigaN   Цитата(tMauzer @ May 21 2010, 20:51) AHTO...   Dec 4 2010, 18:05
- - Genadi Zawidowski   at91lib_20100901_softpack_1_9_v_1_0_svn_v15011.zip...   Dec 4 2010, 20:37
- - yurmala   Здравствуйте! Не буду создавать новую тему, сп...   Sep 7 2011, 06:47
|- - AHTOXA   Не устану повторять: SPI - такая штука: Чтобы что-...   Sep 7 2011, 07:58
|- - yurmala   Цитата(AHTOXA @ Sep 7 2011, 13:58) Не уст...   Sep 7 2011, 08:23
|- - AHTOXA   Именно!   Sep 7 2011, 09:02
- - yurmala   Как-то странно все пока... Поменял код: Кодvolatil...   Sep 7 2011, 09:06
- - yurmala   Получилось вот с таким кодом. Но не могу понять от...   Sep 7 2011, 10:27
|- - AHTOXA   Цитата(yurmala @ Sep 7 2011, 16:27) Может...   Sep 7 2011, 10:53


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

 


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


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