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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Работа с внешней памятью
SidAlex
сообщение Feb 28 2011, 14:38
Сообщение #1


Участник
*

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



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

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

Заранее всем спасибо.
С уважением, Александр.
Go to the top of the page
 
+Quote Post
Axel
сообщение Feb 28 2011, 16:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Первое, что приходит в голову: проверьте настройку SPI - в смысле фазы данных и клока. Не поможет - надо смотреть код. У меня есть опыт с M25P32 - это вроде из одного класса. Проблем не было...
Go to the top of the page
 
+Quote Post
SidAlex
сообщение Mar 1 2011, 10:17
Сообщение #3


Участник
*

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



У меня тут вот какой вопрос родился. Какие действия в какой последовательности должны проходить. Я, например, делаю так:
1. Chip Select
2. Передача команды на разрешение записи в память
3. Передача команды записи данных
4. Передача адреса, с которого нужно начинать писать
5. Передача данных
6. После передачи сбросить Chip Select.

Естественно до этого происходит настройка SPI всех необходимых портов.
Go to the top of the page
 
+Quote Post
Axel
сообщение Mar 1 2011, 10:36
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(SidAlex @ Mar 1 2011, 14:17) *
...4. Передача адреса, с которого нужно начинать писать...


Важен порядок передачи байтов - начинать со старшего. Ну и обязательно дождаться статуса окончания записи. И еще пин разрешеня записи сбросить в "0".
Go to the top of the page
 
+Quote Post
SidAlex
сообщение Mar 1 2011, 10:44
Сообщение #5


Участник
*

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



Извините пожалуйста, а что значит "...обязательно дождаться статуса окончания записи..." И когда сбрасывать пин разрешения записи?
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 1 2011, 10:45
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(SidAlex @ Mar 1 2011, 13:17) *
У меня тут вот какой вопрос родился. Какие действия в какой последовательности должны проходить. Я, например, делаю так:
1. Chip Select
2. Передача команды на разрешение записи в память
3. Передача команды записи данных
4. Передача адреса, с которого нужно начинать писать
5. Передача данных
6. После передачи сбросить Chip Select.

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


Цитата(SidAlex @ Mar 1 2011, 13:44) *
Извините пожалуйста, а что значит "...обязательно дождаться статуса окончания записи..."

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

Go to the top of the page
 
+Quote Post
SidAlex
сообщение Mar 1 2011, 10:48
Сообщение #7


Участник
*

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



А тогда подскажите пожалуйста, нужен ли между этими действиями таймаут или нет???
Go to the top of the page
 
+Quote Post
Axel
сообщение Mar 1 2011, 10:55
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



[quote name='rx3apf' date='Mar 1 2011, 14:45' post='892940']
Неправильно. После пункта 2 надо деактивировать CS, а перед пунктом 3 - вновь активировать.
/quote]

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

Таймаут вроде не нужен, хватает команд, естественно выполняемых между операциями. А вот без проверки статуса при многостраничной записи не обойтись.
Go to the top of the page
 
+Quote Post
SidAlex
сообщение Mar 1 2011, 11:05
Сообщение #9


Участник
*

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



И еще тогда вопрос, а как читать? Порядок действий тот же или нет?
Go to the top of the page
 
+Quote Post
Axel
сообщение Mar 1 2011, 11:09
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(SidAlex @ Mar 1 2011, 15:05) *
И еще тогда вопрос, а как читать? Порядок действий тот же или нет?


Тот же. Только CS дважды дергать не надо.
Go to the top of the page
 
+Quote Post
SidAlex
сообщение Mar 1 2011, 11:13
Сообщение #11


Участник
*

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



т.е.
1. Chip Select
2. Передача команды на разрешение чтения
4. Передача адреса, с которого нужно начинать читать
5. Чтение данных
6. После всего сбросить Chip Select.

Правильно???
Go to the top of the page
 
+Quote Post
Axel
сообщение Mar 1 2011, 11:15
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(SidAlex @ Mar 1 2011, 15:13) *
Правильно???


100% biggrin.gif
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 1 2011, 11:18
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Axel @ Mar 1 2011, 13:55) *
Таймаут вроде не нужен, хватает команд, естественно выполняемых между операциями. А вот без проверки статуса при многостраничной записи не обойтись.

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

Сообщение отредактировал rx3apf - Mar 1 2011, 11:18
Go to the top of the page
 
+Quote Post
Axel
сообщение Mar 1 2011, 11:29
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(rx3apf @ Mar 1 2011, 15:18) *
Для рамтроновской памяти - не нужно, запись выполняется мгновенно, и бит готовности всегда равен нулю.


Посмотрел сейчас даташит - действительно, Вы правы. Я пользовал Numonyx, а там совсем даже не ноль...
Go to the top of the page
 
+Quote Post
SidAlex
сообщение Mar 1 2011, 11:44
Сообщение #15


Участник
*

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



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

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
}/* конец определения ------------------------------------------------------------------*/
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 - 22:34
Рейтинг@Mail.ru


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