|
|
|
|
|
|
|
|
/* 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******************/
|
|
|
|