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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ATSAM4S + память F-RAM FM25V20, Не читаются данные
Haamu
сообщение Apr 29 2014, 13:13
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Память подключена к шине SPI, ногх WP и HOLD установлены единицы. SPI Mode 0, частота 20Мгц (хотя пробовал и Mode 3 и частоту менял). Другая микросхема на той же шине SPI работает нормально.
Пробовал прочитать Status регистр и Devise ID, в результате читаются все нули.
Читаю, как написано в даташите, например для Status-регистра:
1)Отправляю 0x05
2)Отправляю 0xFF
3)Смотрю что пришло, а пришел 0.
Кто сталкивался с подобной памятью, подскажите, что я делаю не так? Может какие-то хитрости есть, которых я не увидел, читая даташит?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 29 2014, 13:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



что с чип селектом то?
у меня вот такая инициализация, это от другой фрамки и другого проца, но это не важно
CODE


//настройки FRAM, значение статусного регистра при инициализации
//записываем в регистр статуса 0х00
//ставим WPEN в 0, отключаем ножку защиты записи
//ставим BP1, BP0 в 0, все блоки F-RAM не защищены от записи
#define FRAM_STAT_REG 0x00

/****************************************************************
Функция инициализации F-RAM.
входные данные:
нет
выходные данные:
код ошибки
0 - нет ошибок
****************************************************************/
int FRAMInit(void)
{
//задержку перед первым обращением к FRAM после подания питания можно не делать, так как
//есть задержка перед пуском контроллера после установления питания, а она значительно больше

FRAM_CS_UP; //на всякий случай, этого можно и не делать, так как важен уровень а не фронт

FRAM_HOLD_UP; //убираем сигнал ХОЛД с F-RAM, не используем этот режим

//коммуникации с F-RAM может осуществляются через SPI, несколько байтными посылками.
//Чтобы коммуникация не была прервана прерываниями, в которых другие модули
//также могут задействовать SPI, и прервать текущую посылку, испортить данные,
//запрещаем прерывания на время посылки (время между чип селекати F-RAM).
//если SPI реализован программно на выделенных контактах, и прерывания не требуется запрещать
//можно не определять макрос SPI_CLEAR_GIF
#ifdef FRAM_CLEAR_GIF
//на случай если прерывания были уже запрещены к моменту вызову функции
//сохраним статус прерываний
char IntStat=FRAM_GET_GIF_STATUS;
FRAM_CLEAR_GIF; //запрещаем прерывания
#endif

//выбираем FRAM, чипселект в 0
FRAM_CS_DOWN;

SendFRAMByte(FRAM_WREN); //разрешение записи для записи регистра статуса
FRAM_CS_UP; //снимает выбор F-RAM, ставим чип селект в 1

//новая командная посылка, прерывания остаются запрещенными
FRAM_CS_DOWN; //выбираем F-RAM, ставим чипселект в 0
SendFRAMByte(FRAM_WRST); //режим записи регистра статуса
SendFRAMByte(FRAM_STAT_REG); //записываем статусный регистр

FRAM_CS_UP;//снимает выбор F-RAM, ставим чип селект в 1

#ifdef FRAM_CLEAR_GIF
//восстанавливаем значение флага прерываний на момент входа в функцию,
//на случай если флаг был снят в других модулях
FRAM_RESTORE_GIF(IntStat);
#endif

return 0;
}



и к этому такие чтение - запись

CODE
/****************************************************************
Функция записи данных во F-RAM.
входные данные:
Addr - адрес записи данных (адрес 16 бит, FRAM до 512 кБит)
Data - данные для записи
Length - длинна данных в байтах
выходные данные:
код ошибки
0 - нет ошибок
****************************************************************/
int WriteFRAM(unsigned long int Addr, char *Data, unsigned Length)
{
//коммуникации с F-RAM может осуществляются через SPI, несколько байтными посылками.
//Чтобы коммуникация не была прервана прерываниями, в которых другие модули
//также могут задействовать SPI, и прервать текущую посылку, испортить данные,
//запрещаем прерывания на время посылки (время между чип селекати F-RAM).
//если SPI реализован программно на выделенных контактах, и прерывания не требуется запрещать
//можно не определять макрос SPI_CLEAR_GIF
#ifdef FRAM_CLEAR_GIF
//на случай если прерывания были уже запрещены к моменту вызову функции
//сохраним статус прерываний
char IntStat=FRAM_GET_GIF_STATUS;
FRAM_CLEAR_GIF; //запрещаем прерывания
#endif

//выбираем FRAM, чипселект в 0
FRAM_CS_DOWN;

SendFRAMByte(FRAM_WREN); //разрешения запси
FRAM_CS_UP; //выбираем F-RAM, ставим чипселект в 0

//новая командная посылка, прерывания остаются запрещенными
FRAM_CS_DOWN; //выбираем F-RAM, ставим чипселект в 0
SendFRAMByte(FRAM_WRITE); //режим записи в память
//передаем адрес данных для записи
#ifdef FRAM_17BIT_ADDRES //если используется 17 битная адресация для FRAM>512Кбит
SendFRAMByte((Addr>>16)&0xFF); //старший байт адреса, используется младший бит
#endif
SendFRAMByte((Addr>>8)&0xFF); //второй байт адреса
SendFRAMByte(Addr&0xFF); //младший байт адреса

for(unsigned int i=0;i<Length;i++)//цикл записи по длине данных
SendFRAMByte(Data[i]);

FRAM_CS_UP;//снимает выбор F-RAM, ставим чип селект в 1

#ifdef FRAM_CLEAR_GIF
//восстанавливаем значение флага прерываний на момент входа в функцию,
//на случай если флаг был снят в других модулях
FRAM_RESTORE_GIF(IntStat);
#endif

return 0;
}

/****************************************************************
Функция чтения данных из F-RAM.
входные данные:
Addr - адрес чтения данных (адрес 16 бит, FRAM до 512 кБит)
Data - буфер данных для сохранения прочитанных данных
Length - длинна данных в байтах
выходные данные:
код ошибки
0 - нет ошибок
****************************************************************/
int ReadFRAM(unsigned long int Addr, char *Data, unsigned Length)
{
//коммуникации с F-RAM может осуществляются через SPI, несколько байтными посылками.
//Чтобы коммуникация не была прервана прерываниями, в которых другие модули
//также могут задействовать SPI, и прервать текущую посылку, испортить данные,
//запрещаем прерывания на время посылки (время между чип селекати F-RAM).
//если SPI реализован программно на выделенных контактах, и прерывания не требуется запрещать
//можно не определять макрос SPI_CLEAR_GIF
#ifdef FRAM_CLEAR_GIF
//на случай если прерывания были уже запрещены к моменту вызову функции
//сохраним статус прерываний
char IntStat=FRAM_GET_GIF_STATUS;
FRAM_CLEAR_GIF; //запрещаем прерывания
#endif

//выбираем FRAM, чипселект в 0
FRAM_CS_DOWN;

SendFRAMByte(FRAM_READ); //режим чтения памяти
//передаем адрес данных для чтения
#ifdef FRAM_17BIT_ADDRES //если используется 17 битная адресация для FRAM>512Кбит
SendFRAMByte((Addr>>16)&0xFF); //старший байт адреса, используется младший бит
#endif
SendFRAMByte((Addr>>8)&0xFF); //второй байт адреса
SendFRAMByte(Addr&0xFF); //младший байт адреса
for(unsigned int i=0;i<Length;i++)//цикл чтения по длинне данных
ReadFRAMByte(&Data[i]);

FRAM_CS_UP;//снимает выбор F-RAM, ставим чип селект в 1

#ifdef FRAM_CLEAR_GIF
//восстанавливаем значение флага прерываний на момент входа в функцию,
//на случай если флаг был снят в других модулях
FRAM_RESTORE_GIF(IntStat);
#endif

return 0;
}





Go to the top of the page
 
+Quote Post
Haamu
сообщение Apr 29 2014, 13:28
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Всё как положено, перед передачей опускаю в ноль, в конце передачи поднимаю обратно в единицу. Для уверенности даже мультиметром проверил.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 29 2014, 13:34
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

кстати ответ на запрос статуса может быть и 0 на самом деле... вот с ID да... там что-то другое должно быть
не фигню сказал, оба не 0 должны быть
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Apr 29 2014, 13:36
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Haamu @ Apr 29 2014, 16:13) *
3)Смотрю что пришло, а пришел 0.
Кто сталкивался с подобной памятью, подскажите, что я делаю не так? Может какие-то хитрости есть, которых я не увидел, читая даташит?

Если мсх не отвечает, должны читаться 1. SO подтянут? Смотрите времена TpowerUp и Trecovery(сомнительно), они довольно значительные.
Go to the top of the page
 
+Quote Post
Haamu
сообщение Apr 29 2014, 13:51
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Цитата(DmitryM @ Apr 29 2014, 17:36) *
Если мсх не отвечает, должны читаться 1. SO подтянут?

А должен быть подтянут? К питанию? У меня не подтянут. Попробовал подтянуть к питанию, ничего не изменилось. Разве что теперь не нули читаются а единицы.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Apr 29 2014, 13:55
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Haamu @ Apr 29 2014, 16:13) *
Кто сталкивался с подобной памятью, подскажите, что я делаю не так? Может какие-то хитрости есть, которых я не увидел, читая даташит?


В документации хитростей не обнаружено. Подобная микросхема fm25cl64 с идентичным набором команд (в ней отсутствует только команда SLEEP) работает без проблем.
Проверьте время после активации CS и до начала передачи данных. Маловероятно, но может быть память находится в слипе и её необходимо выдерживать время выхода из слипа после активации. Также стоит проверить режим работы SPI и временные параметры тактирования. Естественно всё с помощью осциллографа, а не тестера.
Там у Вас действительно 20МГц? У памяти предел 40 - может где ошиблись в настройках SPI.
Go to the top of the page
 
+Quote Post
Jury093
сообщение Apr 29 2014, 14:58
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(Haamu @ Apr 29 2014, 17:51) *
А должен быть подтянут? К питанию? У меня не подтянут. Попробовал подтянуть к питанию, ничего не изменилось. Разве что теперь не нули читаются а единицы.

SI/SO местами не попутаны?
задвигаете MSB вперед?
это учитываете:
Код
The device detects the SPI mode from the status of the SCK pin
when the device is selected by bringing the CS pin LOW.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Apr 29 2014, 17:02
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Haamu @ Apr 29 2014, 16:51) *
А должен быть подтянут? К питанию? У меня не подтянут. Попробовал подтянуть к питанию, ничего не изменилось. Разве что теперь не нули читаются а единицы.

А что будет на висящем в воздухе входе мк? Ведь когда нет общения с мсх памяти у неё SO в Hi-Z состоянии. Конечно нужно PullUp (или внешний или внутренний в мк).
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Apr 29 2014, 18:51
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(DmitryM @ Apr 29 2014, 18:02) *
А что будет на висящем в воздухе входе мк?

Наводки. Разброд и шатание. Встроенные диоды должны защитить от пробоя от накопления заряда, но посадить висящий конец на какой-либо потенциал будет по-пацански.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 29 2014, 22:04
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



какая разница что на висящем конце (глупо звучит), если он отпущен, то там ничего никому не нужно, а когда нужны данные то там появиться правильный сигнал (ну кроме экзотических случаев, которые должны быть описаны в инструкции). Потому стоит начать с понижения частот, и контроля происходящего оссцилографом, а подтяжки это чисто для определенности, по-пацански как сказали...
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Apr 30 2014, 04:45
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Golikov A. @ Apr 30 2014, 01:04) *
какая разница что на висящем конце (глупо звучит), если он отпущен


в оригинале было "входе мк". Потом можно не удивляться повышенному энергопотреблению и проч.
Go to the top of the page
 
+Quote Post
Haamu
сообщение Apr 30 2014, 06:06
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Не уверен, кто именно подтягивает (у меня помимо памяти на шине SPI еще ЦАП висит и развязывающая микросхема (к ней потом будет подключаться еще другая плата)), но в спокойном состоянии и MISO и MOSI находятся в высоком состоянии.
Смотрел осциллографом. В настройках сейчас Mode 0, 1МГц. Всё как должно быть, по первому восходящему фронту клока по линии MOSI передаются данные, старшим битом впереед, в это время на линии MISO ноль...
Попробовал паузы делать после установки CS и между байтами в 1-2 мкс. Пробовал на другой точно такой же плате. Даже на всякий случай попробовал развернуть зеркально байт команды. И ничего не изменилось...

Сообщение отредактировал Haamu - Apr 30 2014, 06:55
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Apr 30 2014, 07:34
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Haamu @ Apr 30 2014, 09:06) *
Попробовал паузы делать после установки CS и между байтами в 1-2 мкс. Пробовал на другой точно такой же плате. Даже на всякий случай попробовал развернуть зеркально байт команды. И ничего не изменилось...


Обращаться к других устройствам SPI пробовали? Если остальные устройства на этой шине работают, а не работает только память, то вероятно проблема в памяти. Может быть у Вас ВСЕ микросхемы памяти битые изначально. Или подделки. Или её убили при сборке на всех платах. Если вместо FRAM на проводках припаять любую DATA FLASH и протестировать? Может быть у Вас несколько CS активируется?
Мой опыт общения с FRAM показал что на её освоение тратится не более часа (при наличии опыта работы с любой DATA FLASH) и работает она с пол пинка. Так что я склоняюсь к тому, что микросхемы битые (при условии что остальные SPI-устройства действительно не мешают работе памяти).
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 30 2014, 11:07
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а конфликтов осцилом не видно? может правда двойной CS где пролез?
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 - 14:58
Рейтинг@Mail.ru


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