test
Dependencies: SDFileSystem mbed-dev
Fork of Nucleo_Ex06_EMU by
TFT/spidma.cpp
- Committer:
- charliex
- Date:
- 2017-05-27
- Revision:
- 4:53ef91c87d74
- Parent:
- 3:8d6e6aec9b01
File content as of revision 4:53ef91c87d74:
/*===================================================================*/ /* */ /* 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_FREQ_VERY_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" uint8_t spi_read(void) { uint8_t recvBuf; //while (SpiHandle.State != HAL_SPI_STATE_READY); HAL_SPI_Receive(&SpiHandle, &recvBuf, 1, 100); // while(HAL_SPI_GetState(&SpiHandle) == HAL_SPI_STATE_BUSY); return recvBuf; } /*-------------------------------------------------------------------*/ /* Write a byte data */ /*-------------------------------------------------------------------*/ void spi_write(uint8_t data) { while (SpiHandle.State != HAL_SPI_STATE_READY); HAL_SPI_Transmit(&SpiHandle, &data, 1, 100); while(HAL_SPI_GetState(&SpiHandle) == HAL_SPI_STATE_BUSY); } /*-------------------------------------------------------------------*/ /* Write a word data */ /*-------------------------------------------------------------------*/ void spi_writew(uint16_t data) { while (SpiHandle.State != HAL_SPI_STATE_READY); HAL_SPI_Transmit(&SpiHandle, (uint8_t *)&data, 2, 100); while(HAL_SPI_GetState(&SpiHandle) == HAL_SPI_STATE_BUSY); } /*-------------------------------------------------------------------*/ /* Initialize SPI DMA */ /*-------------------------------------------------------------------*/ void spi_init() { SPI pad_spi(PC_12, PC_11, PC_10); // MOSI(should pullup), MISO, SCK 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); }