Перейти к содержанию
    

Работа с внешней памятью

Привет всем ГУРУ программирования МК.

 

Возникла такая проблемка. Есть внешняя память FM25L256. Почитал pdf на эту микросхему, вроде бы все понятно. Решил поработать. Написал алгоритм инициализации микросхемы, функции чтения и записи. Но, при выполнении этих функций, они работают, но результата никакого. Т.е. вроде бы пишет, вроде бы читает, но в массиве одни нули. Подскажите где что не так делаю? Просто уже несколько дней с этим мучаюсь, а результата ноль. Микруха подцеплина через SPI, он настроен корректно, вроде. Вот и чешу в затылке. К тому же я человек в этом деле новый, много не знаю. Прошу, пожалуйста, помогите.

 

Заранее всем спасибо.

С уважением, Александр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первое, что приходит в голову: проверьте настройку SPI - в смысле фазы данных и клока. Не поможет - надо смотреть код. У меня есть опыт с M25P32 - это вроде из одного класса. Проблем не было...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня тут вот какой вопрос родился. Какие действия в какой последовательности должны проходить. Я, например, делаю так:

1. Chip Select

2. Передача команды на разрешение записи в память

3. Передача команды записи данных

4. Передача адреса, с которого нужно начинать писать

5. Передача данных

6. После передачи сбросить Chip Select.

 

Естественно до этого происходит настройка SPI всех необходимых портов.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...4. Передача адреса, с которого нужно начинать писать...

 

Важен порядок передачи байтов - начинать со старшего. Ну и обязательно дождаться статуса окончания записи. И еще пин разрешеня записи сбросить в "0".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините пожалуйста, а что значит "...обязательно дождаться статуса окончания записи..." И когда сбрасывать пин разрешения записи?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня тут вот какой вопрос родился. Какие действия в какой последовательности должны проходить. Я, например, делаю так:

1. Chip Select

2. Передача команды на разрешение записи в память

3. Передача команды записи данных

4. Передача адреса, с которого нужно начинать писать

5. Передача данных

6. После передачи сбросить Chip Select.

Неправильно. После пункта 2 надо деактивировать CS, а перед пунктом 3 - вновь активировать.

 

 

Извините пожалуйста, а что значит "...обязательно дождаться статуса окончания записи..."

Для рамтроновской памяти это не требуется, запись выполняется мгновенно.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неправильно. После пункта 2 надо деактивировать CS, а перед пунктом 3 - вновь активировать.

/quote]

 

Да, конечно, не заметил... :laughing:

 

Таймаут вроде не нужен, хватает команд, естественно выполняемых между операциями. А вот без проверки статуса при многостраничной записи не обойтись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще тогда вопрос, а как читать? Порядок действий тот же или нет?

 

Тот же. Только CS дважды дергать не надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е.

1. Chip Select

2. Передача команды на разрешение чтения

4. Передача адреса, с которого нужно начинать читать

5. Чтение данных

6. После всего сбросить Chip Select.

 

Правильно???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Таймаут вроде не нужен, хватает команд, естественно выполняемых между операциями. А вот без проверки статуса при многостраничной записи не обойтись.

Для рамтроновской памяти - не нужно, запись выполняется мгновенно, и бит готовности всегда равен нулю.

Изменено пользователем rx3apf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для рамтроновской памяти - не нужно, запись выполняется мгновенно, и бит готовности всегда равен нулю.

 

Посмотрел сейчас даташит - действительно, Вы правы. Я пользовал Numonyx, а там совсем даже не ноль...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ребята ничего не понимаю, вроде написано все как говорите, но ничего не происходит. Точнее запись вроде есть, а вот прочитать не могу. Где что не так?

Функции записи чтения прилагаю:

 

void WriteFM25L256(unsigned int adress, char *mass, int nbyte)

{

unsigned int a;

 

// OFF_HOLD_FRAM(); //продолжить передачу данных из FRAM

// OFF_WP_FRAM(); //отключить защиту записи

CS_FRAM(); //чип-селект для FRAM

 

while (!(IFG1 & UTXIFG0));//провека готовности ТХ-буфера

U0TXBUF = WREN_FM25L; //разрешение записи в FM25L256

while(!(U0TCTL & TXEPT));

// __no_operation();

// __no_operation();

// __no_operation();

// __no_operation();

OFF_CS_FRAM(); //сброс чипселекта FRAM

CS_FRAM(); //чип-селект для FRAM

while (!(IFG1 & UTXIFG0));//провека готовности ТХ-буфера

U0TXBUF = WRITE_FM25L; //разрешение записи в FM25L256

while(!(U0TCTL & TXEPT));

while (!(IFG1 & UTXIFG0));//провека готовности ТХ-буфера

U0TXBUF = adress >> 8; //запись старшего байта адреса

while(!(U0TCTL & TXEPT));

while (!(IFG1 & UTXIFG0));//провека готовности ТХ-буфера

U0TXBUF = adress; //запись младшего байта адреса

while(!(U0TCTL & TXEPT));

for(a = 0; a < nbyte; a++)

{

// while (!(IFG1 & UTXIFG0)); //провека готовности ТХ-буфера

// U0TXBUF = mass[a] >> 8; //передать старший байт элемента массива

while (!(IFG1 & UTXIFG0)); //провека готовности ТХ-буфера

U0TXBUF = mass[a]; //передать младший байт элемента массива

while(!(U0TCTL & TXEPT));

};

// while(!(U0TCTL & TXEPT)); //пусты ли регистры TX

// WP_FRAM(); //включить защиту записи

OFF_CS_FRAM(); //сброс чипселекта FRAM

}

 

void ReadFM25L256(unsigned int adress, char *mass, int nbyte)

{

unsigned int a;

CS_FRAM(); //чип-селект для FRAM

 

while (!(IFG1 & UTXIFG0));//провека готовности ТХ-буфера

U0TXBUF = READ_FM25L; //команда //разрешение чтения из FM25L256

while(!(U0TCTL & TXEPT));

while (!(IFG1 & UTXIFG0)); //провека готовности ТХ-буфера

U0TXBUF = adress >> 8; //запись старшего байта адреса

while(!(U0TCTL & TXEPT));

while (!(IFG1 & UTXIFG0)); //провека готовности ТХ-буфера

U0TXBUF = adress; //запись младшего байта адреса

while(!(U0TCTL & TXEPT));

for(a = 0; a < nbyte; a++)

{

while (!(IFG1 & UTXIFG0)); //ожидание готовности TX-буфера

U0TXBUF = 0x40; //тактирование FRAM

while(!(U0TCTL & TXEPT));

while (!(IFG1 & URXIFG0)); //ожидание готовности RХ-буфера

mass[a] = U0RXBUF; //считывание из RX-буфера в массив страшего байта

while(!(U0TCTL & TXEPT));

}

//while(!(U0TCTL & TXEPT)); //пусты ли регистры TX

OFF_CS_FRAM(); //сброс чипселекта FRAM

}/* конец определения ------------------------------------------------------------------*/

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...