Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
05.08.2018, 15:19
|
|
Прописка
Регистрация: 25.03.2013
Адрес: Глубокое замкадье
Сообщений: 216
Сказал спасибо: 3
Сказали Спасибо 71 раз(а) в 55 сообщении(ях)
|
Re: stm32f4+FRAM spi (FM25xx)
Сообщение от aske12345
|
провода может длинноваты
|
Согласующие резисторы какого номинала?
WP# к VCC притянут?
|
|
|
Сказали "Спасибо" vladisslav1
|
|
|
05.08.2018, 21:02
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: stm32f4+FRAM spi (FM25xx)
Сообщение от AR_Favorit
|
И я бы посмотрел на реальную паузу между установкой CS и началом тактовых импульсов. Маловероятно, но вдруг там таки нет даташитных 10нс...
|
В общем, как я понял дело было в не очень коротких проводах или колебаниях на фронтах сlk и mosi мк, по крайней мере после того как я в рассечку проводов clk и mosi поставил по резистору 1к всё стало работать адекватно (читается то, что пишется), ну по крайней мере пока адекватно, спасибо большое за помощь
|
|
|
|
06.08.2018, 11:33
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: stm32f4+FRAM spi (FM25xx)
Сообщение от vladisslav1
|
Согласующие резисторы какого номинала?
WP# к VCC притянут?
|
WP - сидит на Vcc наглухо, резисторы по 1кОм, пока вроде работает как надо
|
|
|
|
06.08.2018, 13:22
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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));
} |
|
|
|
|
06.08.2018, 14:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
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.
|
|
|
|
07.08.2018, 11:06
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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 МК, что данные не считываются
|
|
|
|
07.08.2018, 12:32
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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();
} |
|
|
|
|
07.08.2018, 14:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
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
|
|
|
07.08.2018, 14:37
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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;
} |
|
|
|
|
07.08.2018, 14:40
|
|
Частый гость
Регистрация: 11.09.2008
Сообщений: 14
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: stm32f4+FRAM spi (FM25xx)
Сообщение от AR_Favorit
|
PS и, наверное, настало время уточнить - какой именно STM32F4 используется?
|
STM32F407VGT6
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:46.
|
|