Перейти к содержанию
    

помогите с spi в STM32F411VET6U

Недавно начал заниматься программированием микроконтроллеров stm32

приобрел плату discovery f4 (STM32F411VET6U)

 

использую stm32cube и uVision 5

 

пытаюсь разобраться с SPI, хочу для начала научится передавать и принимать, использую встроенные spi1,2 как master и slave

 

понял что нужно соединить между собой

 

SCK—SCK,

MOSI—MOSI,

MISO—MISO

 

___

 

в кубе активизировал SPi1 Full-Duplex Master и SPi2 Full-Duplex Slave

 

1- подскажите что еще в кубе выбрать для правильной генерации кода? (рис1)

2- нужно что-то менять в clock configuration или оставить все по default? (рис2)

3- а в самих настройках SPi1 Master и Slave нужно что-то менять ? (рис3,4)

 

помогите пожалуйста разобраться с stm32cube чтобы перейти дальше к uVision 5

мне реально нужно за пару дней освоить spi, прошу

post-99973-1512145423_thumb.png

post-99973-1512145427_thumb.png

post-99973-1512145432_thumb.png

post-99973-1512145436_thumb.png

Изменено пользователем haker_fox
Уточнил название темы, добавил теги, переместил в нужный раздел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пытаюсь разобраться с SPI, хочу для начала научится передавать и принимать, использую встроенные spi1,2 как master и slave

хотите разобраться - разбирайтесь, примеров для 4 полно

и самое главное, вначале удалите с компьютера куб

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а что конкретно не работает?

 

ну собственно, не знаю что дальше делать

 

а в чем проблема куба?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну собственно, не знаю что дальше делать

 

а в чем проблема куба?

 

Проблема куба в том что вы так и не научитесь сами разбираться, что у вас не работает.

Вот я для вас поискал пример - http://easystm32.ru/interfaces/45-spi-interface-part-2 , там нет куба , но имхо всё понятно и без него .

Заодно узнаете из скольких сигналов шина SPI состоит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а в чем проблема куба?

не получится научиться ходить, а тем более бегать на костылях

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SCK—SCK,

MOSI—MOSI,

MISO—MISO

 

Что-то мне кажется, что должно быть

 

SCK—SCK,

MOSI—MISO

MISO—MOSI

:rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверное, еще и CS добавить, иначе как синхронизировать?

Хотя вот это:

"Недавно начал заниматься программированием микроконтроллеров stm32 ....мне реально нужно за пару дней освоить spi, прошу"

очень напрягает, т.к. без вдумчивого понимания происходящих процессов что-то более-менее работоспособное сделать, имхо, невозможно.

Или это очередной студент и а-ля курсовая по информатике?

Для таких в библиотеках от STM есть уже готовые примеры прошивок и кода для обмена между двумя процессорами на демобоардах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то мне кажется, что должно быть

MOSI—MISO

MISO—MOSI

:rolleyes:

нет , так быть не должно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет , так быть не должно.

Да, тупанул, извиняюсь

 

Проверьте,есть ли в void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) строка

__HAL_I2C_ENABLE(i2cHandle);

Изменено пользователем A.Lex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите почему не работает все выходные читал интернет

 

это я пытаюсь spi2 c spi3 соединить!

 

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_hal.h"

/* USER CODE BEGIN Includes */
#define spi_enable HAL_GPIO_WritenPin(GPIOC, GPIO_PIN_RESET)
#define spi_disable HAL_GPIO_WritenPin(GPIOC, GPIO_PIN_SET)

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi2;
SPI_HandleTypeDef hspi3;
DMA_HandleTypeDef hdma_spi3_rx;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_SPI2_Init(void);
static void MX_SPI3_Init(void);

uint8_t send_data=32, receive_data=0;


/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

int main(void)
{

 /* USER CODE BEGIN 1 */

 /* USER CODE END 1 */

 /* MCU Configuration----------------------------------------------------------*/

 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();

 /* USER CODE BEGIN Init */

 /* USER CODE END Init */

 /* Configure the system clock */
 SystemClock_Config();

 /* USER CODE BEGIN SysInit */

 /* USER CODE END SysInit */

 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_DMA_Init();
 MX_SPI2_Init();
 MX_SPI3_Init();

 /* USER CODE BEGIN 2 */
HAL_SPI_Receive_DMA(&hspi3,&receive_data,1);
 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 /* USER CODE END WHILE */

spi_enable;
	HAL_SPI_Transmit_IT(&hspi2,&receive_data,1);
	send_data++;
	HAL_Delay (100);

 /* USER CODE BEGIN 3 */

 }
 /* USER CODE END 3 */

}

void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
if (hspi->Instance==hspi2.Instance)
{	
	spi_disable;
}
}		

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

 RCC_OscInitTypeDef RCC_OscInitStruct;
 RCC_ClkInitTypeDef RCC_ClkInitStruct;

/**Configure the main internal regulator output voltage 
*/
 __HAL_RCC_PWR_CLK_ENABLE();

 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

/**Initializes the CPU, AHB and APB busses clocks 
*/
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 RCC_OscInitStruct.PLL.PLLM = 8;
 RCC_OscInitStruct.PLL.PLLN = 336;
 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
 RCC_OscInitStruct.PLL.PLLQ = 8;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
_Error_Handler(__FILE__, __LINE__);
 }

/**Initializes the CPU, AHB and APB busses clocks 
*/
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
						  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
 {
_Error_Handler(__FILE__, __LINE__);
 }

/**Configure the Systick interrupt time 
*/
 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

/**Configure the Systick 
*/
 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 /* SysTick_IRQn interrupt configuration */
 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* SPI2 init function */
static void MX_SPI2_Init(void)
{

 /* SPI2 parameter configuration*/
 hspi2.Instance = SPI2;
 hspi2.Init.Mode = SPI_MODE_MASTER;
 hspi2.Init.Direction = SPI_DIRECTION_2LINES;
 hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
 hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
 hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
 hspi2.Init.NSS = SPI_NSS_SOFT;
 hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
 hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
 hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
 hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 hspi2.Init.CRCPolynomial = 10;
 if (HAL_SPI_Init(&hspi2) != HAL_OK)
 {
_Error_Handler(__FILE__, __LINE__);
 }

}

/* SPI3 init function */
static void MX_SPI3_Init(void)
{

 /* SPI3 parameter configuration*/
 hspi3.Instance = SPI3;
 hspi3.Init.Mode = SPI_MODE_SLAVE;
 hspi3.Init.Direction = SPI_DIRECTION_2LINES;
 hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
 hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
 hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
 hspi3.Init.NSS = SPI_NSS_HARD_INPUT;
 hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
 hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
 hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 hspi3.Init.CRCPolynomial = 10;
 if (HAL_SPI_Init(&hspi3) != HAL_OK)
 {
_Error_Handler(__FILE__, __LINE__);
 }

}

/** 
 * Enable DMA controller clock
 */
static void MX_DMA_Init(void) 
{
 /* DMA controller clock enable */
 __HAL_RCC_DMA1_CLK_ENABLE();

 /* DMA interrupt init */
 /* DMA1_Stream0_IRQn interrupt configuration */
 HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);

}

/** Configure pins as 
	* Analog 
	* Input 
	* Output
	* EVENT_OUT
	* EXTI
*/
static void MX_GPIO_Init(void)
{

 GPIO_InitTypeDef GPIO_InitStruct;

 /* GPIO Ports Clock Enable */
 __HAL_RCC_GPIOH_CLK_ENABLE();
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();

 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);

 /*Configure GPIO pin : PC6 */
 GPIO_InitStruct.Pin = GPIO_PIN_6;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
 * @brief  This function is executed in case of error occurrence.
 * @param  None
 * @retval None
 */
void _Error_Handler(char * file, int line)
{
 /* USER CODE BEGIN Error_Handler_Debug */
 /* User can add his own implementation to report the HAL error return state */
 while(1) 
 {
 }
 /* USER CODE END Error_Handler_Debug */ 
}

#ifdef USE_FULL_ASSERT

/**
  * @brief Reports the name of the source file and the source line number
  * where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
 /* USER CODE BEGIN 6 */
 /* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
 /* USER CODE END 6 */

}

#endif

 

там где spi_enable; стоит предупреждение warning: implicit declaration of function "HAL_GPIO_WritenPin" is invalid in C99

 

а потом ошибку

 

SPI2\SPI2.axf: Error: L6200E: Symbol HAL_SPI_MspInit multiply defined (by stm32f4xx_hal_msp.o and main.o).

Изменено пользователем IgorKossak
[codebox] для длинного кода. [code]-для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите почему не работает все выходные читал интернет

вы что, мазохист ? вам же сказано - убейте куб и нагуглите исходники на spl

 

это я пытаюсь spi2 c spi3 соединить!

соедините для начала spi2 с spi2

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

HAL_SPI_Receive_DMA(&hspi3,&receive_data,1);

...

HAL_SPI_Transmit_IT(&hspi2,&receive_data,1);

...

передача и прием одного и того же буфера, логично что он не будет изменяться.

 

warning: implicit declaration of function "HAL_GPIO_WritenPin" is invalid in C99

смотрим заголовочный файл stm32f4x_hal_gpio.h, функция записи пина выглядит несколько иначе:

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

 

Symbol HAL_SPI_MspInit multiply defined (by stm32f4xx_hal_msp.o and main.o).

HAL_SPI_MspInit имеет множественное определение... а именно в файлах stm32f4xx_hal_msp и main. что то нужно удалить)

 

В каком режиме работает ДМА? нормальный или циркулярный?

 

вы что, мазохист ? вам же сказано - убейте куб и нагуглите исходники на spl

ну не знаю... по моему мазохизм это настраивать всю периферию через регистры :biggrin:

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите почему не работает все выходные читал интернет

 

это я пытаюсь spi2 c spi3 соединить!\

Откройте описание регистров и посмотрите настроено ли все так как нужно. Запустите циклическую передачу и посмотрите осциллографом сигналы. Ну курочка по зернышку клюет... так и Вы по шажкам. А там и понимание придет. Думаю за час-два...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...