реклама на сайте
подробности

 
 
> stm32 SPI, коннект между двумя чипами от st по spi
Connor
сообщение Apr 21 2018, 07:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-05-17
Пользователь №: 97 309



Есть две борды борда 1(Б1) (stm32f407vgt) и борда 2(Б2) (stm32f303vet), между которыми необходимо обеспечить связь по SPI, вот настройка SPI для Б1 и Б2:
Б1 (Slave):
CODE
/* SPI2 De Initialization */
SPI_I2S_DeInit(SPI2);

/* SPI2 configuration */
SPI_InitTypeDef SPI2_InitStructure;

SPI2_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI2_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI2_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI2_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI2_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI2_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI2_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI2_InitStructure.SPI_CRCPolynomial = 7;
SPI2_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;

SPI_Init(SPI2, &SPI2_InitStructure);

/* FIFO threshold */
SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_HF);

/* Interrupt handler priority */
NVIC_InitTypeDef NVIC_SPI2_InitStructure;

NVIC_SPI2_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_SPI2_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_SPI2_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_SPI2_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_SPI2_InitStructure);

/* RXNE interrupt enable */
NVIC_EnableIRQ(SPI2_IRQn);
SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);

/* Enable DMA Tx requests */
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);

/* Enable SPI2 */
SPI_Cmd(SPI2, ENABLE);



Б2(Master):

CODE
/*SPI3 configuration structure*/
SPI_InitTypeDef SPI3_InitStructure;

/*Default parameters*/
SPI_StructInit(&SPI3_InitStructure);

/*Configure SPI3*/
SPI3_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI3_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI3_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI3_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI3_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI3_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI3_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
SPI3_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI3_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI3, &SPI3_InitStructure);

/*Enable SPI3*/
SPI_Cmd(SPI3, ENABLE);


между ними необходимо передавать данные нижеописанным образом:
1. Б2, который мастер, шлёт 16-битный флаг SPI_FLAG (0x0001);
2. Срабатывает прерывание по RXNE в Б1, Б1 читает принятую посылку, сравнивает с нужным значением и включает DMA_Stream, который запускает передачу данных в Б2
Код
void SPI2_IRQHandler()
{
    SPI_FLAG = SPI_I2S_ReceiveData16(SPI2);
    
    if(SPI_FLAG == 0x0001)
    {
         DMA_Cmd(DMA1_Channel5, ENABLE);
    }
}

Частота на шине APB1, где находится SPI3 Мастера 32MГц, с baudrateprescaler = 64 частота обмена 500Кбит/c .

Теперь о проблемах, SPI_FLAG слэйвом я принимаю, а вот данные отправить ни как не получается, только если напрямую в коде где-то написать SPI_I2S_SendData, т.е. из прерывания я не могу отправить данные даже таким способом. Может я неправильно понимаю работу SPI? Подскажите пожалуйста в чём может быть проблема.

Лично я грешу на софтовый NSS, я так понимаю при отправке данных слэйвом мастеру, мастер не генерит SCK, может ли помочь решить проблему использование хардварного NSS? Спасибо

Сообщение отредактировал IgorKossak - Apr 21 2018, 18:52
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Connor   stm32 SPI   Apr 21 2018, 07:13
- - VladislavS   Проблему элементарно решает подключение логическог...   Apr 21 2018, 09:11
- - Сергей Борщ   QUOTE (Connor @ Apr 21 2018, 09:13) я так...   Apr 21 2018, 09:19
- - Connor   а как это можно реализовать с помощью DMA? По DMA ...   Apr 21 2018, 10:06
|- - Сергей Борщ   QUOTE (Connor @ Apr 21 2018, 12:06) а как...   Apr 21 2018, 10:22
|- - Connor   Цитата(Сергей Борщ @ Apr 21 2018, 04:22) ...   Apr 21 2018, 10:54
- - Connor   А ещё такой вопрос, есть ли необходимость софтовог...   Apr 21 2018, 12:14
- - k155la3   Я предлагаю Вам для старта упростить задачу. Прове...   Apr 21 2018, 14:02
|- - Connor   Цитата(k155la3 @ Apr 21 2018, 08:02) Я пр...   Apr 23 2018, 05:38
|- - Сергей Борщ   QUOTE (Connor @ Apr 23 2018, 07:38) вопро...   Apr 23 2018, 07:33
||- - Connor   Цитата(Сергей Борщ @ Apr 23 2018, 01:33) ...   Apr 23 2018, 07:47
||- - k155la3   Цитата(Connor @ Apr 23 2018, 10:47) Я это...   Apr 24 2018, 15:21
|- - SSerge   Цитата(Connor @ Apr 23 2018, 12:38) кольц...   Apr 23 2018, 11:03
- - Connor   Получилось у меня реализовать обмен по дма между м...   Apr 23 2018, 13:46
|- - AVI-crak   Неужели так важна нулевая задержка между сообщения...   Apr 23 2018, 14:58
- - AlanDrakes   Таки странно. У меня в проекте было настроено так:...   Apr 23 2018, 14:45
- - Connor   Всем спасибо за ответы, очень помогли К слову раб...   Apr 24 2018, 05:59
- - AlanDrakes   Частота обмена ВСЕГДА зависит от частоты мастера. ...   Apr 24 2018, 12:58
|- - Connor   Цитата(AlanDrakes @ Apr 24 2018, 06:58) Ч...   Apr 25 2018, 06:02
|- - k155la3   Цитата(Connor @ Apr 25 2018, 09:02) . . ....   Apr 26 2018, 14:40
|- - AVI-crak   Цитата(k155la3 @ Apr 26 2018, 20:40) Если...   Apr 26 2018, 18:18
|- - k155la3   Цитата(AVI-crak @ Apr 26 2018, 21:18...   Apr 27 2018, 08:20
|- - AVI-crak   Цитата(k155la3 @ Apr 27 2018, 14:20) Если...   Apr 27 2018, 10:37
|- - Alechek   Цитата(AVI-crak @ Apr 27 2018, 15:37...   May 7 2018, 12:43
- - rudy_b   Я сделал так. Одну ногу мастера использую как CS....   Apr 25 2018, 19:39


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.0166 секунд с 7
ELECTRONIX ©2004-2016