/* Includes ------------------------------------------------------------------*/ #include "ALLinclude.h" #define DATA_LENGTH 15 /* Private variables ---------------------------------------------------------*/ SPI_HandleTypeDef Spi2Handle; uint8_t TxBuff[15] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; uint8_t RxBuff[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; DMA_HandleTypeDef HdmaCh2; // DMA_HandleTypeDef HdmaCh3; void Driver_SPIInit(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); /* Enable GPIOB clock */ __HAL_RCC_GPIOA_CLK_ENABLE(); /* Enable GPIOA clock */ __HAL_RCC_SYSCFG_CLK_ENABLE(); /* Enable SYSCFG clock */ __HAL_RCC_SPI2_CLK_ENABLE(); /* Enable SPI2 clock */ __HAL_RCC_DMA1_CLK_ENABLE(); /* Enable DMA clock */ /*SCK*/ GPIO_InitStruct.Pin = GPIO_PIN_13; if (Spi2Handle.Init.CLKPolarity == SPI_POLARITY_LOW) { GPIO_InitStruct.Pull = GPIO_PULLDOWN; } else { GPIO_InitStruct.Pull = GPIO_PULLUP; } GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF3_SPI2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* SPI NSS*/ GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF3_SPI2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* GPIO configured as SPI:MISO/MOSI*/ // GPIO_InitStruct.Pin = GPIO_PIN_15 | GPIO_PIN_14; GPIO_InitStruct.Pin = GPIO_PIN_15 ; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF3_SPI2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Interrupt configuration */ HAL_NVIC_SetPriority(SPI2_IRQn, 1, 0); HAL_NVIC_EnableIRQ(SPI2_IRQn); /* DMA_CH1 configuration */ HdmaCh2.Instance = DMA1_Channel1; HdmaCh2.Init.Direction = DMA_MEMORY_TO_PERIPH; HdmaCh2.Init.PeriphInc = DMA_PINC_DISABLE; HdmaCh2.Init.MemInc = DMA_MINC_ENABLE; if (Spi2Handle.Init.DataSize <= SPI_DATASIZE_8BIT) { HdmaCh2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; HdmaCh2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; } else { HdmaCh2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; HdmaCh2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; } HdmaCh2.Init.Mode = DMA_NORMAL; HdmaCh2.Init.Priority = DMA_PRIORITY_VERY_HIGH; /* Initialize DMA */ //HAL_DMA_DeInit(&HdmaCh2); HAL_DMA_Init(&HdmaCh2); __HAL_LINKDMA(&Spi2Handle, hdmatx, HdmaCh2); /* Set DMA channel map. */ HAL_DMA_ChannelMap(&HdmaCh2, DMA_CHANNEL_MAP_SPI2_WR); /* SPI1_TX DMA1_CH2 */ /* DMA handle is associated with SPI handle */ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); /* De-Initialize the SPI peripheral */ Spi2Handle.Instance = SPI2; /* SPI2 */ Spi2Handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; /* prescaler :256 */ Spi2Handle.Init.Direction = SPI_DIRECTION_2LINES; /* full duplex */ Spi2Handle.Init.CLKPolarity = SPI_POLARITY_LOW; /* SPI Clock Polarity: low */ Spi2Handle.Init.CLKPhase = SPI_PHASE_1EDGE ; /* Data sampling starts at the first clock edge */ Spi2Handle.Init.DataSize = SPI_DATASIZE_8BIT; /* SPI Data Size is 8 bit */ Spi2Handle.Init.FirstBit = SPI_FIRSTBIT_MSB; /* SPI MSB Transmission */ Spi2Handle.Init.NSS = SPI_NSS_HARD_OUTPUT; /* NSS Hardware mode */ Spi2Handle.Init.Mode = SPI_MODE_MASTER; /* Configure as host */ Spi2Handle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; /* The CRC check is disabled */ /* Spi1Handle.Init.CRCPolynomial = 1; */ /* CRC polynomial value */ if (HAL_SPI_DeInit(&Spi2Handle) != HAL_OK) { APP_ErrorHandler(); } /* Initialize SPI peripheral */ if (HAL_SPI_Init(&Spi2Handle) != HAL_OK) { APP_ErrorHandler(); } /* Transmit and Receive an amount of data in non-blocking mode with DMA */ //HAL_SPI_Transmit_DMA // if (HAL_SPI_Transmit_DMA(&Spi2Handle, (uint8_t *)TxBuff, DATA_LENGTH) != HAL_OK) // //if (HAL_SPI_TransmitReceive_DMA(&Spi2Handle, (uint8_t *)TxBuff, (uint8_t *)RxBuff, DATA_LENGTH) != HAL_OK) // { // APP_ErrorHandler(); // } } /** * @brief Initialize SPI related MSP */ //void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) //{ // GPIO_InitTypeDef GPIO_InitStruct = {0}; // /* Initialize SPI1 */ // if (hspi->Instance == SPI2) // { // __HAL_RCC_GPIOB_CLK_ENABLE(); /* Enable GPIOB clock */ // __HAL_RCC_GPIOA_CLK_ENABLE(); /* Enable GPIOA clock */ // __HAL_RCC_SYSCFG_CLK_ENABLE(); /* Enable SYSCFG clock */ // __HAL_RCC_SPI2_CLK_ENABLE(); /* Enable SPI2 clock */ // __HAL_RCC_DMA1_CLK_ENABLE(); /* Enable DMA clock */ // // /* // PB13-SCK (AF3) // //PB14-MISO(AF3) // PB15-MOSI(AF3) // PB12-NSS(AF3) // */ // /*SCK*/ // GPIO_InitStruct.Pin = GPIO_PIN_13; // if (hspi->Init.CLKPolarity == SPI_POLARITY_LOW) // { // GPIO_InitStruct.Pull = GPIO_PULLDOWN; // } // else // { // GPIO_InitStruct.Pull = GPIO_PULLUP; // } // GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // GPIO_InitStruct.Alternate = GPIO_AF3_SPI2; // HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // /* SPI NSS*/ // GPIO_InitStruct.Pin = GPIO_PIN_12; // GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; // GPIO_InitStruct.Pull = GPIO_PULLUP; // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // GPIO_InitStruct.Alternate = GPIO_AF3_SPI2; // HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // /* GPIO configured as SPI:MISO/MOSI*/ // // GPIO_InitStruct.Pin = GPIO_PIN_15 | GPIO_PIN_14; // GPIO_InitStruct.Pin = GPIO_PIN_15 ; // GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // GPIO_InitStruct.Alternate = GPIO_AF3_SPI2; // HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // /* Interrupt configuration */ // HAL_NVIC_SetPriority(SPI2_IRQn, 1, 0); // HAL_NVIC_EnableIRQ(SPI2_IRQn); // /* DMA_CH2 configuration */ // HdmaCh2.Instance = DMA1_Channel2; // HdmaCh2.Init.Direction = DMA_MEMORY_TO_PERIPH; // HdmaCh2.Init.PeriphInc = DMA_PINC_DISABLE; // HdmaCh2.Init.MemInc = DMA_MINC_ENABLE; // if (hspi->Init.DataSize <= SPI_DATASIZE_8BIT) // { // HdmaCh2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // HdmaCh2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // } // else // { // HdmaCh2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; // HdmaCh2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; // } // HdmaCh2.Init.Mode = DMA_NORMAL; // HdmaCh2.Init.Priority = DMA_PRIORITY_VERY_HIGH; // /* Initialize DMA */ // //HAL_DMA_DeInit(&HdmaCh2); // HAL_DMA_Init(&HdmaCh2); // /* Set DMA channel map. */ // HAL_DMA_ChannelMap(&HdmaCh2, DMA_CHANNEL_MAP_SPI2_WR); /* SPI1_TX DMA1_CH2 */ // /* DMA handle is associated with SPI handle */ // __HAL_LINKDMA(hspi, hdmatx, HdmaCh2); //#if 0 // /* DMA_CH3 configuration */ // HdmaCh3.Instance = DMA1_Channel3; // HdmaCh3.Init.Direction = DMA_PERIPH_TO_MEMORY; // HdmaCh3.Init.PeriphInc = DMA_PINC_DISABLE; // HdmaCh3.Init.MemInc = DMA_MINC_ENABLE; // if (hspi->Init.DataSize <= SPI_DATASIZE_8BIT) // { // HdmaCh3.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // HdmaCh3.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // } // else // { // HdmaCh3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; // HdmaCh3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; // } // HdmaCh3.Init.Mode = DMA_NORMAL; // HdmaCh3.Init.Priority = DMA_PRIORITY_LOW; // /* Initialize DMA*/ // HAL_DMA_Init(&HdmaCh3); // /* DMA handle is associated with SPI handle*/ // __HAL_LINKDMA(hspi, hdmarx, HdmaCh3); //#endif // /* Set DMA channel map. */ // //HAL_DMA_ChannelMap(&HdmaCh2, DMA_CHANNEL_MAP_SPI2_WR); /* SPI2_TX DMA1_CH2 */ // //HAL_DMA_ChannelMap(&HdmaCh3, DMA_CHANNEL_MAP_SPI2_RD); /* SPI2_RX DMA1_CH3 */ // // /* DMA interrupt configuration*/ // // HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 1, 0); // // HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn); // HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 1, 0); // HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); // } //} /** * @brief Deinit SPI MSP */ //void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) //{ // if (hspi->Instance == SPI2) // { // /* Reset SPI peripheral */ // __HAL_RCC_SPI2_FORCE_RESET(); // __HAL_RCC_SPI2_RELEASE_RESET(); // /* Disable SPI and GPIO clock */ // /* Deinit SPI SCK */ // HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_15); // HAL_NVIC_DisableIRQ(SPI2_IRQn); // HAL_DMA_DeInit(&HdmaCh2); // HAL_NVIC_DisableIRQ(DMA1_Channel2_IRQn); // } //} #if 1 void SPItest(void *pvParamters) { uint8_t i = 0; for(;;) { for(i = 0;i<15;i++) { TxBuff[i] = i+1; } HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_7); HAL_SPI_Transmit_DMA(&Spi2Handle, &TxBuff[0], DATA_LENGTH); // HAL_SPI_Transmit(&Spi2Handle, &TxBuff[0],DATA_LENGTH, 5000); vTaskDelay(100); } } #endif /************************ (C) COPYRIGHT MS *****END OF FILE******************/