SidAlex 0 28 февраля, 2011 Опубликовано 28 февраля, 2011 · Жалоба Привет всем ГУРУ программирования МК. Возникла такая проблемка. Есть внешняя память FM25L256. Почитал pdf на эту микросхему, вроде бы все понятно. Решил поработать. Написал алгоритм инициализации микросхемы, функции чтения и записи. Но, при выполнении этих функций, они работают, но результата никакого. Т.е. вроде бы пишет, вроде бы читает, но в массиве одни нули. Подскажите где что не так делаю? Просто уже несколько дней с этим мучаюсь, а результата ноль. Микруха подцеплина через SPI, он настроен корректно, вроде. Вот и чешу в затылке. К тому же я человек в этом деле новый, много не знаю. Прошу, пожалуйста, помогите. Заранее всем спасибо. С уважением, Александр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 28 февраля, 2011 Опубликовано 28 февраля, 2011 · Жалоба Первое, что приходит в голову: проверьте настройку SPI - в смысле фазы данных и клока. Не поможет - надо смотреть код. У меня есть опыт с M25P32 - это вроде из одного класса. Проблем не было... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SidAlex 0 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба У меня тут вот какой вопрос родился. Какие действия в какой последовательности должны проходить. Я, например, делаю так: 1. Chip Select 2. Передача команды на разрешение записи в память 3. Передача команды записи данных 4. Передача адреса, с которого нужно начинать писать 5. Передача данных 6. После передачи сбросить Chip Select. Естественно до этого происходит настройка SPI всех необходимых портов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба ...4. Передача адреса, с которого нужно начинать писать... Важен порядок передачи байтов - начинать со старшего. Ну и обязательно дождаться статуса окончания записи. И еще пин разрешеня записи сбросить в "0". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SidAlex 0 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба Извините пожалуйста, а что значит "...обязательно дождаться статуса окончания записи..." И когда сбрасывать пин разрешения записи? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба У меня тут вот какой вопрос родился. Какие действия в какой последовательности должны проходить. Я, например, делаю так: 1. Chip Select 2. Передача команды на разрешение записи в память 3. Передача команды записи данных 4. Передача адреса, с которого нужно начинать писать 5. Передача данных 6. После передачи сбросить Chip Select. Неправильно. После пункта 2 надо деактивировать CS, а перед пунктом 3 - вновь активировать. Извините пожалуйста, а что значит "...обязательно дождаться статуса окончания записи..." Для рамтроновской памяти это не требуется, запись выполняется мгновенно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SidAlex 0 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба А тогда подскажите пожалуйста, нужен ли между этими действиями таймаут или нет??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба Неправильно. После пункта 2 надо деактивировать CS, а перед пунктом 3 - вновь активировать. /quote] Да, конечно, не заметил... :laughing: Таймаут вроде не нужен, хватает команд, естественно выполняемых между операциями. А вот без проверки статуса при многостраничной записи не обойтись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SidAlex 0 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба И еще тогда вопрос, а как читать? Порядок действий тот же или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба И еще тогда вопрос, а как читать? Порядок действий тот же или нет? Тот же. Только CS дважды дергать не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SidAlex 0 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба т.е. 1. Chip Select 2. Передача команды на разрешение чтения 4. Передача адреса, с которого нужно начинать читать 5. Чтение данных 6. После всего сбросить Chip Select. Правильно??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба Правильно??? 100% Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 1 марта, 2011 Опубликовано 1 марта, 2011 (изменено) · Жалоба Таймаут вроде не нужен, хватает команд, естественно выполняемых между операциями. А вот без проверки статуса при многостраничной записи не обойтись. Для рамтроновской памяти - не нужно, запись выполняется мгновенно, и бит готовности всегда равен нулю. Изменено 1 марта, 2011 пользователем rx3apf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба Для рамтроновской памяти - не нужно, запись выполняется мгновенно, и бит готовности всегда равен нулю. Посмотрел сейчас даташит - действительно, Вы правы. Я пользовал Numonyx, а там совсем даже не ноль... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SidAlex 0 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба Ребята ничего не понимаю, вроде написано все как говорите, но ничего не происходит. Точнее запись вроде есть, а вот прочитать не могу. Где что не так? Функции записи чтения прилагаю: 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 }/* конец определения ------------------------------------------------------------------*/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться