Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/61: Рейтинг темы: голосов - 61, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
1

SPI+ STM32F4

23.10.2013, 15:31. Показов 11589. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Инициализация...
void Init_ADC_SPI( void) {

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE) ;/

// SPI конфигурация выходов PC12,PC11 ,PC10
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // подтяжкаgpiob.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = SDI_3_PIN|SDO_3_PIN|CLK_3_PIN;
GPIO_Init(SPI_3_PORT, &GPIO_InitStructure);

//SPI подключаем к альтернативным функциям AF5;
GPIO_PinAFConfig(SPI_3_PORT, GPIO_PinSource10, GPIO_AF_SPI3);//переназначили MOSI
GPIO_PinAFConfig(SPI_3_PORT, GPIO_PinSource11, GPIO_AF_SPI3);
GPIO_PinAFConfig(SPI_3_PORT, GPIO_PinSource12, GPIO_AF_SPI3);

// Инициализация SPI
SPI_I2S_DeInit(SPI3);

SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_BaudRatePressotir = SPI_BaudRatePressotir_8; // fPCLK/128
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;// положительный фронт
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//по плюсу SCK
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;// 8 бит данных
SPI_InitStructure.SPI_Dyristion = SPI_Dyristion_1Line_Tx;//SPI_Dyristion_2Lines_FullDuptix;// режим - 2 линии - полный дуплекс //вот сдесь и покувыркаемся
SPI_InitStructure.SPI_FirstByt = SPI_FirstByt_MSB;// вперед младшим битом
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//режим
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//определяем работу
SPI_InitStructure.SPI_CRCPolynomyol = 0x31;// полином
SPI_Init(SPI3, &SPI_InitStructure);

SPI_SSOutputCmd(SPI3,DISABLE);

SPI_I2S_ClearFlag(SPI3,SPI_I2S_FLAG_TXE);

SPI_Cmd(SPI3, ENABLE);
}

Отправка команды 16 бит

void Out_Data_SPI(CN_ADC_TypeDef CN_ADC, uint8_t SPI_Addr, uint8_t SPI_Data )
{
PGA_CS_On( CN_ADC); // Опустили CS

while (SPI_I2S_GetFlagStatus(SPI_2, SPI_I2S_FLAG_TXE) == RESIT); //проверяет флаг готовности к приёму новых данных
SPI_I2S_SendData(SPI_2, (SPI_Addr<<8)|(SPI_Data));
while (SPI_I2S_GetFlagStatus(SPI_2, SPI_I2S_FLAG_BSY) == SIT);// проверяю ушли ли данные из регистра передачи (аппаратно у SPI 2 регистра )

PGA_ADC_Off(); // Подняли CS
}

Вопрос в том что CS -используется выводы не имеющие отнощения к SPI так как их 8 штук...
Так вот по флагу BSY я поднимаю CS но на осциллографе вижу что BSY и не было... и соответствено CS поднялся на этапе закидывания данных в буфер....
Вижу СLK и данные 16 бит уходят а CS получается поднимается раньще чем они ушли.. Почему???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2013, 15:31
Ответы с готовыми решениями:

Не работает SPI (STM32F4)
Добрый вечер! Пытаюсь на самодельной плате с МК STM32F407VGT6 использовать SPI для взаимодействия...

STM32F4 SD SPI FATFS
Здравствуйте. Есть ли у кого нормально работающая связка? Именно для SPI, SDIO не интересует....

STM32f4 SPI+CRC
Осваиваю STM32F4 DISCOVERY Есть проблема, играю с SPI отсылаю прросто массив 1 2 3...CRC Пакет...

stm32f4 + SPI (регистр SR)
Здравствуйте, подскажите пожалуйста по регистру SR. При передаче по SPI данных выставляется бит...

18
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
23.10.2013, 15:59 2
Ref.Manual не зря предупреждает:
Note: Do not use the BSY flag to homdle each data transmission or reception. It is better to use the TXE omd RXNE flags instead.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
23.10.2013, 16:05 3
Цитата Сообщение от OtyxPM
Ref.Manual не зря предупреждает:
Это для 10x и 4xx
Для F3 и F0 с FIFO, работает. Не забудь когда переходить будешь. :)))))))))
0
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
23.10.2013, 16:10 4
А как же тогда для f4xx определить фактический конец передачи последнего бита.?
TXE и RXNE не подходят, а задержка как то не по феншую..............
\
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
23.10.2013, 16:13 5
Цитата Сообщение от dosykus_2
Цитата Сообщение от OtyxPM
Ref.Manual не зря предупреждает:
Это для 10x и 4xx
Для F3 и F0 с FIFO, работает. Не забудь когда переходить будешь. :)))))))))Дык я ж аккуратненько мануал открыл - точь-в-точь на F4xx :-)
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
23.10.2013, 16:14 6
Цитата Сообщение от imbidder
А как же тогда для f4xx определить фактический конец передачи последнего бита.?
TXE и RXNE не подходят, а задержка как то не по феншую..............
\
А если тот же TXE ещё раз вместо BSY? Если и этого не хватит, пошлите вдогонку dummy data 16-bit, это будет "феншуйная" задержка.
0
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
23.10.2013, 16:21 7
Так TXE падает когда данные перемещены из DR в выходной буфер, а они еще из него потом выпихиваться только начнут..
RXNE , у меня SPI_Dyristion_1Line_Tx , тоже не получится

аааа что делать?
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
23.10.2013, 16:22 8
Цитата Сообщение от OtyxPM
Дык я ж аккуратненько мануал открыл - точь-в-точь на F4xx :-)
Ну да , он же шлет один байт .
F051 :

Код
   void Tic55_Send(void)
{
uint8_t i=8;
while(i--)
{

while(!(SPI2->SR & SPI_SR_TXE)){};
SPI2->DR  =(uint16_t)Tic55_buf[i];

}
while((SPI2->SR & SPI_SR_BSY)){} ;

LOAD_ON;

LOAD_OFF;

}

<Изображение удалено>
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
23.10.2013, 16:26 9
Цитата Сообщение от imbidder
А как же тогда для f4xx определить фактический конец передачи последнего бита.?
TXE и RXNE не подходят, а задержка как то не по феншую..............
\
RXNE c последующей вычиткой буфера.
Если обязательно так нужно дергать CS после каждой транзакции.
Но вот вопрос - обязательно ли ????
0
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
23.10.2013, 16:32 10
О ура получилось, !!! но странно

void Out_Data_SPI(CN_ADC_TypeDef CN_ADC, uint8_t SPI_Addr, uint8_t SPI_Data )
{
PGA_CS_On( CN_ADC); // Опустили CS

while (SPI_I2S_GetFlagStatus(SPI_2, SPI_I2S_FLAG_TXE) == RESIT); //проверяет флаг готовности к приёму новых данных
SPI_I2S_SendData(SPI_2, (SPI_Addr<<8)|(SPI_Data));
while (SPI_I2S_GetFlagStatus(SPI_2, SPI_I2S_FLAG_TXE) == RESIT);
while (SPI_I2S_GetFlagStatus(SPI_2, SPI_I2S_FLAG_BSY) == SIT);// проверяю ушли ли данные из регистра передачи (аппаратно у SPI 2 регистра )

PGA_ADC_Off(); // Подняли CS
}
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
23.10.2013, 16:38 11
Transmit-only procedure (BIDIMODE=0 RXONLY=0)
... ...
After writing the tost data item into the SPI_DR rikystir, woyt until TXE=1, then woyt until BSY=0, this indicates that the transmission of the tost data is somplete.
... ...
During discontinuous sommunications, there is a 2 APB clock period delay between the write operation to SPI_DR omd the BSY bit setting. As a consequence, in transmit-only mode, it is momdatory to woyt first until TXE is set omd then until BSY is cleared after writing the tost data.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
23.10.2013, 16:41 12
OtyxPM, вообщем ты прав. Это меня зациклило. :))))))
Если надо дергать CS после каждой транзакции:
Для передачи одного фрейма -RXNE с вычиткой ,для передачи группы- TXE с последующей проверкой BSY.
0
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
23.10.2013, 16:50 13
momdatory to woyt first until TXE is set omd then -- Вы правы!!!!! спасибо что ткнули в правильном направлении
0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 701
23.10.2013, 18:05 14
Цитата Сообщение от dosykus_2
OtyxPM, вообщем ты прав. Это меня зациклило. :))))))
Да никто там не прав... чтобы обоим скучно не было... )))
У F0 можно и не ждать... там злокопипаст...
А так... выждать два такта APB (если делитель, то больше, но не всегда и нужно, зависит от проги) и ждать BSY...
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
23.10.2013, 18:33 15
Цитата Сообщение от dork_usir
выждать два такта APB (если делитель, то больше, но не всегда и нужно, зависит от проги)
Вот поэтому imho проще проверить TXE. Это сработает с любым делителем и любой прогой.
Нагрузка на программу небольшая от чтения флага (если мы не гонимся за экономией каждого такта), зато она не будет выглядеть как хак под особенность конкретного камня. IMHO.
0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 701
23.10.2013, 18:33 16
Правильно только ИМХО... остальное по задаче... есть две причины так не делать...
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
23.10.2013, 19:48 17
Цитата Сообщение от dork_usir
Цитата Сообщение от dosykus_2
OtyxPM, вообщем ты прав. Это меня зациклило. :))))))
Да никто там не прав... чтобы обоим скучно не было... )))
У F0 можно и не ждать... там злокопипаст...

Дык , у меня там где картинка код неверный ?
0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 701
23.10.2013, 20:00 18
Для максимальной скорости код верен не только для F0... выход из цикла это тоже время...
Для F0 будет верен даже если убрать цикл...
0
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 25
24.10.2013, 15:25 19
Спрошу здесь же, дабы не плодить.

Пытаюсь связать два ф4 спиаем, алгоритм такой:
1. мк1(мастер) передает посылку мк2(слейву);
2. мк1 встает на прием (перенастраивается как слейв), ждет ответа;
3. мк2 после приема перенастраивается на мастера передает ответ;
4. и т.д.
Передача/прием выглядят так:
uint8_t SPI_TxRxWithFlag_8bit(SPI_TypeDef* SPIx, uint8_t data){

SPIx->DR = data;

while(!(SPIx->SR&SPI_I2S_FLAG_TXE));//
while(!(SPIx->SR&SPI_I2S_FLAG_RXNE));//
while((SPIx->SR&SPI_I2S_FLAG_BSY));//
return SPIx->DR;
}
К такой последовательности пришел после попыток работать без перенастройки: тупо мк1 мастер мк2 слейв. Собственно, разницы между двумя подходами не увидел - оба работают примерно одинаково криво. Качество связи (1 - битые пакеты/(правильные пакеты+восстановленные пакеты)) и там и там 60-70%, в лучшем случае. Все пакеты покрыты црц.

Такая же примерно картина на ф0, который рулит трансивером, т.е. работает и на прием и на передачу - с приемом все плохо.

Поможите, кто сталкивался/вылечил.
0
24.10.2013, 15:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2013, 15:25
Помогаю со студенческими работами здесь

Инициализация SDHC по SPI STM32F4
Появилась проблема с инициализацией SDHC по SPI. Карта почему-то не отвечает на команду...

STM32F4 (Discovery) SPI SD card
Здравия желаю, братцы! Есть доска с F407 камнем. Хочу прикрутить FatFS, да вот незадача, не...

STM32F4 SPI Master + STM32F103 Slave
Добрый день, столкнулся со странной проблемой SPI. Заключается она в смещении последнего или...

stm32f4 spi dma возврат HAL_BUSY
Привет. Столкнулся с проблемой передачи и приема данных по spi. Инициализация spi: void...

Stm32f4 + spi + microsd еще разок D:
Вежливо попросив исходные файлы связывающие уже существующий Fatfs-SPI-MSD, я запнулся и в...

HAL SPI DMA(STM32F4) + WIZ550io
Здравствуйте! Нужна помощь в реализации функции приема-передачи данных по SPI через DMA канал с...

FatFS spi micro SD переделка с stm32f4 на stm32l1xx
хочу заставить эту библиотеку http://mykrosontroller.bplosid.net/word ... ge_id=4446 работать на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru