ILI9341 for layerOne 2017 , original Racoon's
Diff: spidma.cpp
- Revision:
- 0:8f8765c8b7bd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spidma.cpp Sun Nov 13 17:59:38 2016 +0000 @@ -0,0 +1,107 @@ +/*===================================================================*/ +/* */ +/* spidma.cpp : SPI DMA function */ +/* */ +/* 2016/1/20 Racoon */ +/* */ +/*===================================================================*/ + +#include "mbed.h" +#include "stm32f4xx_hal.h" + +SPI_HandleTypeDef SpiHandle; + +/*-------------------------------------------------------------------*/ +/* callback */ +/*-------------------------------------------------------------------*/ +extern "C" { + void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) + { + static DMA_HandleTypeDef hdma_tx; + + GPIO_InitTypeDef GPIO_InitStruct; + + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_SPI1_CLK_ENABLE(); + __HAL_RCC_DMA2_CLK_ENABLE(); + + GPIO_InitStruct.Pin = GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_7; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + hdma_tx.Instance = DMA2_Stream3; + hdma_tx.Init.Channel = DMA_CHANNEL_3; + hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_tx.Init.MemInc = DMA_MINC_ENABLE; + hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_tx.Init.Mode = DMA_NORMAL; + hdma_tx.Init.Priority = DMA_PRIORITY_HIGH; + hdma_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + hdma_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + hdma_tx.Init.MemBurst = DMA_MBURST_SINGLE; + hdma_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; + + HAL_DMA_Init(&hdma_tx); + + __HAL_LINKDMA(hspi, hdmatx, hdma_tx); + + HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 1); + HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); + } + + void DMA2_Stream3_IRQHandler(void) + { + HAL_DMA_IRQHandler(SpiHandle.hdmatx); + } + +} // extern "C" + +/*-------------------------------------------------------------------*/ +/* Write a byte data */ +/*-------------------------------------------------------------------*/ +void spi_write(uint8_t data) +{ + HAL_SPI_Transmit(&SpiHandle, &data, 1, 100); +} + +/*-------------------------------------------------------------------*/ +/* Write a word data */ +/*-------------------------------------------------------------------*/ +void spi_writew(uint16_t data) +{ + HAL_SPI_Transmit(&SpiHandle, (uint8_t *)&data, 2, 100); +} + +/*-------------------------------------------------------------------*/ +/* Initialize SPI DMA */ +/*-------------------------------------------------------------------*/ +void spi_init() +{ + SpiHandle.Instance = SPI1; + SpiHandle.Init.Mode = SPI_MODE_MASTER; + SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + SpiHandle.Init.Direction = SPI_DIRECTION_2LINES; + SpiHandle.Init.CLKPhase = SPI_PHASE_1EDGE; + SpiHandle.Init.CLKPolarity = SPI_POLARITY_HIGH; + SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SpiHandle.Init.CRCPolynomial = 7; + SpiHandle.Init.DataSize = SPI_DATASIZE_8BIT; + SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB; + SpiHandle.Init.NSS = SPI_NSS_SOFT; + SpiHandle.Init.TIMode = SPI_TIMODE_DISABLE; + + if (HAL_SPI_Init(&SpiHandle) != HAL_OK) + while(1); +} +