|
ATSAM4S + память F-RAM FM25V20, Не читаются данные |
|
|
|
Apr 29 2014, 13:13
|
Частый гость
 
Группа: Участник
Сообщений: 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. Кто сталкивался с подобной памятью, подскажите, что я делаю не так? Может какие-то хитрости есть, которых я не увидел, читая даташит?
|
|
|
|
|
Apr 29 2014, 13:23
|
Гуру
     
Группа: Свой
Сообщений: 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; }
|
|
|
|
|
Apr 29 2014, 13:51
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587

|
Цитата(DmitryM @ Apr 29 2014, 17:36)  Если мсх не отвечает, должны читаться 1. SO подтянут? А должен быть подтянут? К питанию? У меня не подтянут. Попробовал подтянуть к питанию, ничего не изменилось. Разве что теперь не нули читаются а единицы.
|
|
|
|
|
Apr 29 2014, 14:58
|
Знающий
   
Группа: Участник
Сообщений: 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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|