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

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

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

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

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

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

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

Закрытая тема
Опции темы
Непрочитано 05.08.2018, 15:19   #11
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   #12
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   #13
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   #14
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   #15
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 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   #16
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   #17
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   #18
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 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   #19
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   #20
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, время: 02:35.


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