Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.08.2018, 16:06
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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)
|
|
|
|
04.08.2018, 16:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,051
Сказал спасибо: 3,041
Сказали Спасибо 3,211 раз(а) в 2,181 сообщении(ях)
|
Re: stm32f4+FRAM spi (FM25xx)
1. Может в регистре статуса что-то не то? Что бит WEL показывает, команда WREN принята?
2.
Сообщение от aske12345
|
SPI_I2S_SendData(SPI3, 0x00);// пишем 0 для считывания
|
И ничего не делаем с результатом. Только по овцелографу, что-ль смотришь?
__________________
Экзорцист 40-го уровня.
|
|
|
|
04.08.2018, 16:38
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: stm32f4+FRAM spi (FM25xx)
Сообщение от ForcePoint
|
1. Может в регистре статуса что-то не то? Что бит WEL показывает, команда WREN принята?
2.
И ничего не делаем с результатом. Только по овцелографу, что-ль смотришь?
|
бит WEL 0 после команды WREN , да пока только по осцилу
|
|
|
|
04.08.2018, 16:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
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 байтами)))?
|
|
|
|
04.08.2018, 17:16
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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 ещё есть прерывания, которые , происходят в промежутке, но не думаю, что дело в этой паузе, из даташита по крайней мере не видно каких то жестких требований, которые я мог нарушить..
|
|
|
|
04.08.2018, 17:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
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.
|
|
|
|
04.08.2018, 17:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: stm32f4+FRAM spi (FM25xx)
И я бы посмотрел на реальную паузу между установкой CS и началом тактовых импульсов. Маловероятно, но вдруг там таки нет даташитных 10нс...
|
|
|
Сказали "Спасибо" AR_Favorit
|
|
|
04.08.2018, 18:22
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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;
работает одинаково, считывается но не то, что записывал
|
|
|
|
04.08.2018, 19:11
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: stm32f4+FRAM spi (FM25xx)
Сообщение от AR_Favorit
|
И я бы посмотрел на реальную паузу между установкой CS и началом тактовых импульсов. Маловероятно, но вдруг там таки нет даташитных 10нс...
|
Уже собирался fram перепаивать), наконец то нашёл хоть какой то косячек и ведь смотрел же)) - CS у команды на WREN рвется на фронте последнего клока а не после него(хотя у остальных команд всё гуд), спасибо огромное, надеюсь заработает как поправлю)
|
|
|
|
04.08.2018, 19:28
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: stm32f4+FRAM spi (FM25xx)
Сообщение от AR_Favorit
|
И я бы посмотрел на реальную паузу между установкой CS и началом тактовых импульсов. Маловероятно, но вдруг там таки нет даташитных 10нс...
|
Поторопился, не понятно как это влияет-но при увеличении частоты clk spi сигнал CS стал нормальным и в результате считывается не то, что записано даже при нормальных задержках между фронтами/срезами CS и концами/началами передач, короче по прежнему не понятно в чем дело..
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:52.
|
|