You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

276 lines
9.9 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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