Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

stm32f4+FRAM spi (FM25xx)

Непрочитано 04.08.2018, 16:06  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию stm32f4+FRAM spi (FM25xx)

Здравствуйте! Прошу помощи ! Столкнулся со следующей проблемой пытаюсь подключить к контроллеру по spi память FRAM FM25CL64 ,компилятор keil , пытаюсь записать одно число и его же считать, а осциллографом вижу, что считывается не то, что записывал. Пытался в разные ячейки памяти разные числа - считываются разные числа, но не те. Пишу 0x2F считывается 0x1С, пишу 0xFF считывается 0xFE, пишу 0x99 считывается 0x20 - ерунда какая то.



Куски кода привел ниже:
Код:
int main(void)
{
	
	SystemCoreClockUpdate();
	SysTick_Config(SystemCoreClock/1000);//1ms
	LEDs_ini();
	Button_ini();
	SPI3_FRAM_ini();
        delay_ms(50);

	//проверим 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нс
      
        CS_FRAM_ON();	
	while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};
	SPI_I2S_SendData(SPI3, 0x02);// Write 	

        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется

	SPI_I2S_SendData(SPI3, 0x10);// 13 битный адрес
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется	
	SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется
	SPI_I2S_SendData(SPI3, 0x2F);// данные 
        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нс
        //проверим FRAM конец запись  1 байта

        //проверим FRAM начало чтение 1 байта
        CS_FRAM_ON();//
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};

	SPI_I2S_SendData(SPI3, 0x03);// Read 	

        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется

	SPI_I2S_SendData(SPI3, 0x10);// 13 битный адрес
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется	
	SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется
	SPI_I2S_SendData(SPI3, 0x00);// пишем 0 для считывания
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется
        CS_FRAM_OFF();

//проверим FRAM конец чтение 1 байта	
	
	//LED1_OFF;
	
	while(1)
	{
настройки spi:
Код:
SPI_Init_user3.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
	SPI_Init_user3.SPI_Mode = SPI_Mode_Master;
	SPI_Init_user3.SPI_DataSize = SPI_DataSize_8b;
	SPI_Init_user3.SPI_CPOL = SPI_CPOL_High;//SPI_CPOL_Low
	SPI_Init_user3.SPI_CPHA = SPI_CPHA_2Edge;
	SPI_Init_user3.SPI_NSS = SPI_NSS_Soft;
	SPI_Init_user3.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//4
	SPI_Init_user3.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_Init_user3.SPI_CRCPolynomial = 7;
	
	SPI_Init(SPI3, &SPI_Init_user3);
контакты вроде все пересмотрел, думал провода может длинноваты, клок 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)
Миниатюры:
Нажмите на изображение для увеличения
Название: IMG_20180804_123750.jpg
Просмотров: 0
Размер:	1.93 Мб
ID:	131493   Нажмите на изображение для увеличения
Название: IMG_20180804_123911.jpg
Просмотров: 0
Размер:	2.04 Мб
ID:	131494   Нажмите на изображение для увеличения
Название: IMG_20180804_125142.jpg
Просмотров: 0
Размер:	2.15 Мб
ID:	131495  

Нажмите на изображение для увеличения
Название: IMG_20180804_125420.jpg
Просмотров: 0
Размер:	2.17 Мб
ID:	131496  
Реклама:
aske12345 вне форума  
Непрочитано 04.08.2018, 16:28  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,458
Сказал спасибо: 3,227
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

1. Может в регистре статуса что-то не то? Что бит WEL показывает, команда WREN принята?
2.
Сообщение от aske12345 Посмотреть сообщение
SPI_I2S_SendData(SPI3, 0x00);// пишем 0 для считывания
И ничего не делаем с результатом. Только по овцелографу, что-ль смотришь?
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 04.08.2018, 16:38  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Сообщение от ForcePoint Посмотреть сообщение
1. Может в регистре статуса что-то не то? Что бит WEL показывает, команда WREN принята?
2.

И ничего не делаем с результатом. Только по овцелографу, что-ль смотришь?
бит WEL 0 после команды WREN , да пока только по осцилу
aske12345 вне форума  
Непрочитано 04.08.2018, 16:55  
AR_Favorit
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

SPI_I2S_SendData(SPI3, 0x02);// Write
SPI_I2S_SendData(SPI3, 0x10);// 13 битный адрес
SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес
SPI_I2S_SendData(SPI3, 0x2F);// данные

1)Только мне кажется, что на 3 осциллограмме вместо второго отправленного байта 0х00?
2) откуда пауза между 2 и 3 байтом (или, если угодно, почему ее нет между 1 и 2, а также между 3 и 4 байтами)))?
AR_Favorit вне форума  
Непрочитано 04.08.2018, 17:16  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Сообщение от AR_Favorit Посмотреть сообщение
SPI_I2S_SendData(SPI3, 0x02);// Write
SPI_I2S_SendData(SPI3, 0x10);// 13 битный адрес
SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес
SPI_I2S_SendData(SPI3, 0x2F);// данные

1)Только мне кажется, что на 3 осциллограмме вместо второго отправленного байта 0х00?
2) откуда пауза между 2 и 3 байтом (или, если угодно, почему ее нет между 1 и 2, а также между 3 и 4 байтами)))?
1) ссори это я просто уже с разными адресами игрался, осциллограммы сняты для случая, когда адрес:
SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес
SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес
SPI_I2S_SendData(SPI3, 0x2F);// данные
2) пауза там на самом деле есть и между 1 и 2 и между 3 и 4, она там просто мала по сравнению с периодом clk,почему между 2 и 3 больше - программе кроме работы с FRAM ещё есть прерывания, которые , происходят в промежутке, но не думаю, что дело в этой паузе, из даташита по крайней мере не видно каких то жестких требований, которые я мог нарушить..
aske12345 вне форума  
Непрочитано 04.08.2018, 17:30  
AR_Favorit
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Я бы прерывания-то поотключал для начала... Влиять не должны, но хоть датаграммы будут внятные.

Вот 100% рабочая настройка SPI из моего первого проекта на STM32F, когда я только разбирался с ним и использовал SPL. Тоже с FRAM.

PHP код:
//Конфигурация SPI1
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd (SPI1, ENABLE); 
Вроде бы от вашей отличается только полярностью CPOL/CPHA (ну и скорость, но дело не в ней, раз снижали).

А, да, еще там у меня окончание передачи определяется не по BSY, а по взводу RXNE, но это как бы тоже влиять не должно в данном случае...

PHP код:
//передача с одновременным приемом байта по SPI1
uint8_t send_spi1_byte(uint8_t byte)
{  
uint8_t rxbyte;
while (!(SPI1-›SR & SPI_SR_TXE));
SPI1-›DR = byte;
while (!(SPI1-›SR & SPI_SR_RXNE));
rxbyte = SPI1-›DR;
return rxbyte;
} 
ЗЫ настройка SPI в другом проекте уместилась в одну строчку (с учетом значений регистров после сброса):
SPI2-›CR1 = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_BR_1 | SPI_CR1_SPE;

Последний раз редактировалось AR_Favorit; 04.08.2018 в 17:43.
AR_Favorit вне форума  
Непрочитано 04.08.2018, 17:40  
AR_Favorit
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

И я бы посмотрел на реальную паузу между установкой CS и началом тактовых импульсов. Маловероятно, но вдруг там таки нет даташитных 10нс...
AR_Favorit вне форума  
Сказали "Спасибо" AR_Favorit
aske12345 (04.08.2018)
Непрочитано 04.08.2018, 18:22  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Сообщение от AR_Favorit Посмотреть сообщение
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
[/php]

Вроде бы от вашей отличается только полярностью CPOL/CPHA (ну и скорость, но дело не в ней, раз снижали).
пробовал и так:
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
и так:
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
работает одинаково, считывается но не то, что записывал
aske12345 вне форума  
Непрочитано 04.08.2018, 19:11  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Сообщение от AR_Favorit Посмотреть сообщение
И я бы посмотрел на реальную паузу между установкой CS и началом тактовых импульсов. Маловероятно, но вдруг там таки нет даташитных 10нс...
Уже собирался fram перепаивать), наконец то нашёл хоть какой то косячек и ведь смотрел же)) - CS у команды на WREN рвется на фронте последнего клока а не после него(хотя у остальных команд всё гуд), спасибо огромное, надеюсь заработает как поправлю)
aske12345 вне форума  
Непрочитано 04.08.2018, 19:28  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Сообщение от AR_Favorit Посмотреть сообщение
И я бы посмотрел на реальную паузу между установкой CS и началом тактовых импульсов. Маловероятно, но вдруг там таки нет даташитных 10нс...
Поторопился, не понятно как это влияет-но при увеличении частоты clk spi сигнал CS стал нормальным и в результате считывается не то, что записано даже при нормальных задержках между фронтами/срезами CS и концами/началами передач, короче по прежнему не понятно в чем дело..
aske12345 вне форума  
 

Метки
fram, spi, stm32
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Кто-нибудь работал с RF модулями nRF2401A? Easyrider83 Автоматика и аппаратура связи 1481 04.09.2021 23:24
stm32f4 spi dma nss Alex_golubev ARM 0 20.11.2016 15:55
Atmega16 - много переферийных устройств SPI pavned AVR 21 23.01.2013 07:00
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


Часовой пояс GMT +4, время: 08:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.