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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 3,686
Сказал спасибо: 986
Сказали Спасибо 1,138 раз(а) в 832 сообщении(ях)
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.RU
 
Регистрация: 13.03.2010
Сообщений: 5,349
Сказал спасибо: 509
Сказали Спасибо 2,641 раз(а) в 1,338 сообщении(ях)
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.RU
 
Регистрация: 13.03.2010
Сообщений: 5,349
Сказал спасибо: 509
Сказали Спасибо 2,641 раз(а) в 1,338 сообщении(ях)
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 (SPI1ENABLE); 
Вроде бы от вашей отличается только полярностью 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.RU
 
Регистрация: 13.03.2010
Сообщений: 5,349
Сказал спасибо: 509
Сказали Спасибо 2,641 раз(а) в 1,338 сообщении(ях)
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 код Выкл.

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто-нибудь работал с RF модулями nRF2401A? Easyrider83 Автоматика и аппаратура связи 1444 13.06.2018 00:49
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 160 04.06.2018 18:25
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, время: 00:07.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot