Здравствуйте! Прошу помощи ! Столкнулся со следующей проблемой пытаюсь подключить к контроллеру по spi память FRAM FM25CL64 ,компилятор keil , пытаюсь записать одно число и его же считать, а осциллографом вижу, что считывается не то, что записывал. Пытался в разные ячейки памяти разные числа - считываются разные числа, но не те. Пишу 0x2F считывается 0x1С, пишу 0xFF считывается 0xFE, пишу 0x99 считывается 0x20 - ерунда какая то.
//проверим FRAM начало запись 1 байта CS_FRAM_ON();// while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){}; SPI_I2S_SendData(SPI3, 0x06);//Set Write Enable Latch 6 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){}; while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется CS_FRAM_OFF(); delay_us(3); //на самом деле задержка выходит около 500нс
контакты вроде все пересмотрел, думал провода может длинноваты, клок spi настраивал на разную частоту уменьшал до 1МГц - не влияет, пробовал делать паузу между командой WREN и командой записи 15мс, а записью и считыванием 20мс, всё то же самое не помогло..
Осциллограмма всех посылок WREN, WITE, READ (тактовый сигнал ch1 и miso FRAM ch2) (синий луч отношения к делу не имеет)
Осциллограмма команды WREN (тактовый сигнал ch1 и miso FRAM ch2)(синий луч отношения к делу не имеет)
Осциллограмма команды WITE (тактовый сигнал ch1 и miso FRAM ch2)
Осциллограмма считанного значения записывал 0x2F, считал 0x1C (тактовый сигнал ch1 и mosi FRAM ch2)
Как раз на днях писал либу для SST25LF040A под STM32F103 с HAL. Тоже поначалу не хотело работать как надо. Пришлось вкуривать даташит, где попалось, в частности, и такое СпойлерThe Enable-Write-Status-Register (EWSR) instruction arms the Write-Status-Register (WRSR) instruction and opens the status register for alteration. The Enable-Write- Status-Register instruction does not have any effect and will be wasted, if it is not followed immediately by the Write- Status-Register (WRSR) instruction. CE# must be driven low before the EWSR instruction is entered and must be driven high before the EWSR instruction is executed.
Причем делать это надо перед каждым новым байтом, если пишем побайтово.
После добавления этой процедуры в код все заработало. Ах да, и еще, таких вот
конструкций лучше избегать. Задержки не люблю, но в данной ситуации они меньшее зло. Функцию delay_us под армовский таймер написал первым делом, кстати.
конструкций лучше избегать. Задержки не люблю, но в данной ситуации они меньшее зло. Функцию delay_us под армовский таймер написал первым делом, кстати.
Чтобы избегать их надо делать на DMA, а в данном случае задержки - совершенно неприемлемы...
Задержки не для тактирования SPI, а для того чтобы внешняя флешка успевала распихивать данные по ячейкам. Ничто не мешает заменить задержки автоматом состояний в конечной версии.
philosoraptor, вы свой первый пост в этой ветке перечитайте вдумчиво. Заодно проштудируйте RM, а кокретно работу модуля SPI, возможно до вас дойдет что задержки там и на не вперлись. А для отслеживания "распихивания данных" в спи флэш есть BUSy...
Забавно, но написанная мной за пару вечеров программка читает и записывает данные на флеш с usb-cdc безупречно. Ну а так вообще ваше мнение мне очень интересно, конечно.
Еще как забавно. Некоторые даже родный язык, -тся/ться в частности освоить не в состоянии, even less likely they'd study K&R the way it should be studied.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения