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

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

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

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

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

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

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

 
Опции темы

stm32f4+FRAM spi (FM25xx)

Непрочитано 05.08.2018, 15:19  
vladisslav1
Прописка
 
Регистрация: 25.03.2013
Адрес: Глубокое замкадье
Сообщений: 216
Сказал спасибо: 3
Сказали Спасибо 71 раз(а) в 55 сообщении(ях)
vladisslav1 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Сообщение от aske12345 Посмотреть сообщение
провода может длинноваты
Согласующие резисторы какого номинала?
WP# к VCC притянут?
Реклама:
vladisslav1 вне форума  
Сказали "Спасибо" vladisslav1
aske12345 (06.08.2018)
Непрочитано 05.08.2018, 21:02  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

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

Сообщение от vladisslav1 Посмотреть сообщение
Согласующие резисторы какого номинала?
WP# к VCC притянут?
WP - сидит на Vcc наглухо, резисторы по 1кОм, пока вроде работает как надо
aske12345 вне форума  
Непрочитано 06.08.2018, 13:22  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Ещё возник вопрос пытаюсь записывать и считывать 16-битное значение из памяти. Для этого разбил его на 2 8-битных значения и пишу их и считываю и после считывания вновь собираю в одно 16-битное . При попытке считать число 0x0302 вижу что в переменной только 0x0002.(осциллом убедился, что на самом деле считывается 0x0302, ставил точки останова и убеждался, что в регистре DR в момент считывания 1-го байта 0x03, а 2-го байта 0x02, но вижу, что в rxbyte1 данные присваиваются не корректно). Видимо какая то ошибка в коде функции считывания. Просьба пнуть, если кто знает в чём тут дело.
Код:
uint16_t READ_FRAM_2byte(void)
{
uint16_t rxbyte1, rxbyte2;
	
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_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_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_FLAG_BSY SET
SPI_I2S_SendData(SPI3, 0x00);// пишем 0 для считывания
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
while (!(SPI3-›SR & SPI_SR_RXNE));
rxbyte1 = SPI3-›DR;
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется SPI_I2S_FLAG_BSY SET
SPI_I2S_SendData(SPI3, 0x00);// пишем 0 для считывания
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
while (!(SPI3-›SR & SPI_SR_RXNE));
rxbyte2 = SPI3-›DR;
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется SPI_I2S_FLAG_BSY SET
CS_FRAM_OFF();
return (((rxbyte1‹‹8)&(0xFF00))+(rxbyte2&0x00FF));
		}
aske12345 вне форума  
Непрочитано 06.08.2018, 14:02  
AR_Favorit
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Сообщение от aske12345 Посмотреть сообщение
Просьба пнуть, если кто знает в чём тут дело.
Посмотрите отладчиком на бит OVR регистра SPI3-›SR.

Отправив любой байт "туда", после передачи надо считать DR, даже если "оттуда" ничего не должно прилететь. Я на прошлой странице привел обрывок кода, в котором сделано именно так.

Не считывая DR после завершения отправки каждого байта (и одновременного приема - у вас же full duplex mode), вы попадаете в overrun, при котором новые входящие данные и должны теряться, пока не будет считан DR. Именно так и выглядит: с момента отправки байта с командой 0х03 регистр DR не считывался, там лежит нолик, полученный при отправке этой команды, все последующие байты игнорируются, и в конце концов вы считываете этот ноль в rxbyte1. Тем самым позволив поступать новым данным, которые уже принимаются, как ожидалось.



И еще: обратите внимание на примечание в даташите.

Note: Do not use the BSY flag to handle each data transmission or reception. It is better to use the TXE and RXNE flags instead.

Не надо использовать BSY, в общем, в процессе обмена. Окончание передачи совпадает с окончанием приема, и флаг RXNE выставляется всегда вовремя (а флаг BSY не во всех случаях корректно отображает состояние, могут быть нерпиятные сюрпризы).

Последний раз редактировалось AR_Favorit; 06.08.2018 в 14:09.
AR_Favorit вне форума  
Непрочитано 07.08.2018, 11:06  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Сообщение от AR_Favorit Посмотреть сообщение
Посмотрите отладчиком на бит OVR регистра SPI3-›SR.
смотрел - он сброшен
Сообщение от AR_Favorit Посмотреть сообщение
Отправив любой байт "туда", после передачи надо считать DR, даже если "оттуда" ничего не должно прилететь. Я на прошлой странице привел обрывок кода, в котором сделано именно так.
Переделал код, сделав его для приема одного байта, а не двух,считываю значение 0x03.
Сделал как у Вас в коде - считываю после каждой посылки, даже если ничего не принимается, в отладчике ставлю точку останова в строчке "return rxbyte1;" и вижу, что в "SPI3-›DR" значение 0x03, а в "rxbyte1" все равно 0x00, может надо как то по-другому его от туда считывать?
Код:
uint16_t READ_FRAM_1byte(void)
{
uint16_t rxbyte1, rxbyte2;
	
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 (!(SPI3-›SR & SPI_SR_RXNE));
rxbyte2 = SPI3-›DR;
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется SPI_I2S_FLAG_BSY SET
SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес
//while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
while (!(SPI3-›SR & SPI_SR_RXNE));
rxbyte2 = SPI3-›DR;
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется SPI_I2S_FLAG_BSY SET
SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес
//while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
while (!(SPI3-›SR & SPI_SR_RXNE));
rxbyte2 = SPI3-›DR;
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется SPI_I2S_FLAG_BSY SET
SPI_I2S_SendData(SPI3, 0x00);// пишем 0 для считывания
//while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
while (!(SPI3-›SR & SPI_SR_RXNE));
rxbyte1 = ((SPI3-›DR));
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется SPI_I2S_FLAG_BSY SET
CS_FRAM_OFF();

return rxbyte1;
		}

Сообщение от AR_Favorit Посмотреть сообщение
Не надо использовать BSY, в общем, в процессе обмена. Окончание передачи совпадает с окончанием приема, и флаг RXNE выставляется всегда вовремя (а флаг BSY не во всех случаях корректно отображает состояние, могут быть нерпиятные сюрпризы).
Пока не получается его не использовать - как я только пытаюсь использовать только RXNE вижу осциллографом на ноге miso МК, что данные не считываются
aske12345 вне форума  
Непрочитано 07.08.2018, 12:32  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Сообщение от AR_Favorit Посмотреть сообщение
И еще: обратите внимание на примечание в даташите.

Note: Do not use the BSY flag to handle each data transmission or reception. It is better to use the TXE and RXNE flags instead.

Не надо использовать BSY, в общем, в процессе обмена. Окончание передачи совпадает с окончанием приема, и флаг RXNE выставляется всегда вовремя (а флаг BSY не во всех случаях корректно отображает состояние, могут быть нерпиятные сюрпризы).
Отсюда наверно напрашивается вывод, что у меня что то не так настроено или не разрешено в настройках spi?
моя полная процедура инициализации
Код:
void SPI3_FRAM_ini(void)
{
	GPIO_InitTypeDef GPIO_init_spi3;
	SPI_InitTypeDef SPI_Init_user3;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);	

	GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI3);
	

	GPIO_init_spi3.GPIO_Mode = GPIO_Mode_AF;
	GPIO_init_spi3.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_init_spi3.GPIO_OType = GPIO_OType_PP;
	GPIO_init_spi3.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_init_spi3.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;	
		
	GPIO_Init(GPIOC, &GPIO_init_spi3);
	
	GPIO_init_spi3.GPIO_Mode = GPIO_Mode_AF;
	GPIO_init_spi3.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_init_spi3.GPIO_OType = GPIO_OType_PP;
	GPIO_init_spi3.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_init_spi3.GPIO_Pin = GPIO_Pin_5;	
		
	GPIO_Init(GPIOB, &GPIO_init_spi3);
	
	
	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_Low;//SPI_CPOL_Low
	SPI_Init_user3.SPI_CPHA = SPI_CPHA_1Edge;
	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_Cmd(SPI3, ENABLE);
	
	SPI_NSSInternalSoftwareConfig(SPI3, SPI_NSSInternalSoft_Set);
	
        GPIO_init_spi3.GPIO_Pin = GPIO_Pin_11;
	GPIO_init_spi3.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_init_spi3.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_init_spi3.GPIO_OType = GPIO_OType_PP;
	GPIO_init_spi3.GPIO_PuPd = GPIO_PuPd_NOPULL;
	
	GPIO_Init(GPIOB, &GPIO_init_spi3);
	CS_FRAM_OFF();
		
}
aske12345 вне форума  
Непрочитано 07.08.2018, 14:23  
AR_Favorit
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Да никакого криминала не вижу в инициализации.

Давайте перепишем считывание байта без HAL/SPL.

PHP код:
uint8_t READ_FRAM_1byte(void)
{
    volatile uint8_t rxbyte;

    //исключим влияние предыдущих передач 
    //без сопутствующего чтения - если
    //поднят бит OVR, сбрасываем его 
    //согласно даташиту путем
    //последовательного чтения DR и SR
    if (SPI3-›SR & SPI_SR_OVR)
    {
        rxbyte = SPI3-›DR;
        rxbyte = SPI3-›SR;
    }
    
    CS_FRAM_ON();

    //Задержки зло, но в целях разобраться - 
    //пусть пока будет для надежности
    delay_us(1);
    
    //Передаем байт команды
    while (!(SPI3-›SR & SPI_SR_TXE) {};
    SPI3-›DR = 0x03;    
    while (!(SPI3-›SR & SPI_SR_RXNE)) {};
    rxbyte = SPI3-›DR;
    
    //Передаем старший байт адреса
    while (!(SPI3-›SR & SPI_SR_TXE) {};
    SPI3-›DR = 0x00;    
    while (!(SPI3-›SR & SPI_SR_RXNE)) {};
    rxbyte = SPI3-›DR;
    
    //Передаем младший байт адреса
    while (!(SPI3-›SR & SPI_SR_TXE) {};
    SPI3-›DR = 0x00;    
    while (!(SPI3-›SR & SPI_SR_RXNE)) {};
    rxbyte = SPI3-›DR;
    
    //Считываем байт по переданному адресу
    while (!(SPI3-›SR & SPI_SR_TXE) {};
    SPI3-›DR = 0x00;    
    while (!(SPI3-›SR & SPI_SR_RXNE)) {};
    rxbyte = SPI3-›DR;
    
    CS_FRAM_OFF();

    return rxbyte;
} 
PS и, наверное, настало время уточнить - какой именно STM32F4 используется?

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

Сообщение от AR_Favorit Посмотреть сообщение
Да никакого криминала не вижу в инициализации.

Давайте перепишем считывание байта без HAL/SPL.


if (SPI3-›SR & SPI_SR_OVR)
{
rxbyte = SPI3-›DR;
rxbyte = SPI3-›SR;
}
По ходу в том фишка была, что надо было сначала считывать, а потом всё остальное делать, я сделал вот так и всё заработало и без всяких BUSY)):
Код:
uint16_t READ_FRAM_1byte(void)
{
uint16_t rxbyte1, rxbyte2;
	
CS_FRAM_ON();//
//while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};
rxbyte2 = SPI_I2S_ReceiveData(SPI3);
SPI_I2S_SendData(SPI3, 0x03);// Read 	

//while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
//while (!(SPI3-›SR & SPI_SR_RXNE));
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE)== RESET){};
rxbyte2 = SPI_I2S_ReceiveData(SPI3);
//while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется SPI_I2S_FLAG_BSY SET

SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес
//while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};
//while (!(SPI3-›SR & SPI_SR_RXNE));
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE)== RESET){};
rxbyte2 = SPI_I2S_ReceiveData(SPI3);
//while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется SPI_I2S_FLAG_BSY SET
SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE)== RESET){};
//while (!(SPI3-›SR & SPI_SR_RXNE));
//SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET
rxbyte2 = SPI_I2S_ReceiveData(SPI3);
//while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется 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_RXNE)== RESET){};
rxbyte1 = SPI_I2S_ReceiveData(SPI3);
//while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется SPI_I2S_FLAG_BSY SET
CS_FRAM_OFF();
return rxbyte1;
		}
aske12345 вне форума  
Непрочитано 07.08.2018, 14:40  
aske12345
Частый гость
 
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
aske12345 на пути к лучшему
По умолчанию Re: stm32f4+FRAM spi (FM25xx)

Сообщение от AR_Favorit Посмотреть сообщение
PS и, наверное, настало время уточнить - какой именно STM32F4 используется?
STM32F407VGT6
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, время: 20:00.


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