Кто любит 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. Тоже поначалу не хотело работать как надо. Пришлось вкуривать даташит, где попалось, в частности, и такое
Спойлер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.


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

После добавления этой процедуры в код все заработало. Ах да, и еще, таких вот
Код:
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

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