Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

stm32f4+FRAM по spi (FM25CL64)

Сб авг 04, 2018 13:14:01

Здравствуйте! Прошу помощи :cry: ! Столкнулся со следующей проблемой пытаюсь подключить к контроллеру по 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)
Изображение

Re: stm32f4+FRAM по spi (FM25CL64)

Сб сен 08, 2018 08:43:39

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

Re: stm32f4+FRAM по spi (FM25CL64)

Пн сен 10, 2018 10:42:49

Как раз на днях писал либу для SST25LF040A под STM32F103 с HAL. Тоже поначалу не хотело работать как надо. Пришлось вкуривать даташит, где попалось, в частности, и такое


Причем делать это надо перед каждым новым байтом, если пишем побайтово.

После добавления этой процедуры в код все заработало. Ах да, и еще, таких вот
Код:
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};

конструкций лучше избегать. Задержки не люблю, но в данной ситуации они меньшее зло. Функцию delay_us под армовский таймер написал первым делом, кстати.

Re: stm32f4+FRAM по spi (FM25CL64)

Пн сен 17, 2018 09:45:23

Ах да, и еще, таких вот конструкций лучше избегать.
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};


Почему ?

Re: stm32f4+FRAM по spi (FM25CL64)

Пн сен 17, 2018 09:51:43

Ах да, и еще, таких вот
Код:
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};

конструкций лучше избегать. Задержки не люблю, но в данной ситуации они меньшее зло. Функцию delay_us под армовский таймер написал первым делом, кстати.



Чтобы избегать их надо делать на DMA, а в данном случае задержки - совершенно неприемлемы...

Re: stm32f4+FRAM по spi (FM25CL64)

Пт сен 21, 2018 17:52:17

Ах да, и еще, таких вот конструкций лучше избегать.
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};


Почему ?


Потому что бесконечные циклы и так зло, а бесконечные циклы в ожидании внешнего события это уже просто за гранью.

в данном случае задержки - совершенно неприемлемы

В данном случае вполне приемлемы, более того, при прототайпинге и отладке вообще оптимальны.

Re: stm32f4+FRAM по spi (FM25CL64)

Сб сен 22, 2018 13:07:35

philosoraptor, вы утверждаете что задержки вместо ожидания флага не чушь собачья?
Вы окончательно в это уверовали?

Re: stm32f4+FRAM по spi (FM25CL64)

Сб сен 22, 2018 13:27:58

Именно так. Sue me.

Re: stm32f4+FRAM по spi (FM25CL64)

Сб сен 22, 2018 14:15:16

Угу , подобрали задержки, получили кое-какой результат теперь измените скорость SPI...

Re: stm32f4+FRAM по spi (FM25CL64)

Сб сен 22, 2018 19:34:52

Задержки не для тактирования SPI, а для того чтобы внешняя флешка успевала распихивать данные по ячейкам. Ничто не мешает заменить задержки автоматом состояний в конечной версии.

Re: stm32f4+FRAM по spi (FM25CL64)

Сб сен 22, 2018 20:18:27

philosoraptor, вы свой первый пост в этой ветке перечитайте вдумчиво.
Заодно проштудируйте RM, а кокретно работу модуля SPI, возможно до вас дойдет что задержки там и на не вперлись.
А для отслеживания "распихивания данных" в спи флэш есть BUSy...

Re: stm32f4+FRAM по spi (FM25CL64)

Сб сен 22, 2018 20:43:17

Забавно, но написанная мной за пару вечеров программка читает и записывает данные на флеш с usb-cdc безупречно. Ну а так вообще ваше мнение мне очень интересно, конечно.

Re: stm32f4+FRAM по spi (FM25CL64)

Сб сен 22, 2018 21:06:48

Ну да, забавно.
USB-CDC и SPI флэш, чего только не наг.кодиться на калокубе.


Изучайте...
http://cxem.net/mc/mc430.php
http://cxem.net/mc/mc432.php
http://cxem.net/mc/mc433.php

Re: stm32f4+FRAM по spi (FM25CL64)

Сб сен 22, 2018 21:20:40

Еще как забавно. Некоторые даже родный язык, -тся/ться в частности освоить не в состоянии, even less likely they'd study K&R the way it should be studied.

Re: stm32f4+FRAM по spi (FM25CL64)

Сб сен 22, 2018 21:26:50

Вы читайте, читайте...
Ответить