I have ported my old project “pNesX” game console emulator to the nucleo.

Dependencies:   SDFileSystem mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers spidma.cpp Source File

spidma.cpp

00001 /*===================================================================*/
00002 /*                                                                   */
00003 /*  spidma.cpp : SPI DMA function                                    */
00004 /*                                                                   */
00005 /*  2016/1/20  Racoon                                                */
00006 /*                                                                   */
00007 /*===================================================================*/
00008 
00009 #include "mbed.h"
00010 #include "stm32f4xx_hal.h"
00011 
00012 SPI_HandleTypeDef SpiHandle;
00013 
00014 /*-------------------------------------------------------------------*/
00015 /*  callback                                                         */
00016 /*-------------------------------------------------------------------*/
00017 extern "C" {
00018     void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
00019     {
00020         static DMA_HandleTypeDef hdma_tx;
00021 
00022         GPIO_InitTypeDef GPIO_InitStruct;
00023 
00024         __HAL_RCC_GPIOA_CLK_ENABLE();
00025         __HAL_RCC_SPI1_CLK_ENABLE();
00026         __HAL_RCC_DMA2_CLK_ENABLE();
00027 
00028         GPIO_InitStruct.Pin       = GPIO_PIN_5;
00029         GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
00030         GPIO_InitStruct.Pull      = GPIO_PULLUP;
00031         GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;
00032         GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
00033         HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
00034 
00035         GPIO_InitStruct.Pin = GPIO_PIN_6;
00036         HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
00037 
00038         GPIO_InitStruct.Pin = GPIO_PIN_7;
00039         HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
00040 
00041         hdma_tx.Instance                 = DMA2_Stream3;
00042         hdma_tx.Init.Channel             = DMA_CHANNEL_3;
00043         hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
00044         hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
00045         hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;
00046         hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
00047         hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
00048         hdma_tx.Init.Mode                = DMA_NORMAL;
00049         hdma_tx.Init.Priority            = DMA_PRIORITY_HIGH;
00050         hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
00051         hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
00052         hdma_tx.Init.MemBurst            = DMA_MBURST_SINGLE;
00053         hdma_tx.Init.PeriphBurst         = DMA_PBURST_SINGLE;
00054 
00055         HAL_DMA_Init(&hdma_tx);
00056 
00057         __HAL_LINKDMA(hspi, hdmatx, hdma_tx);
00058 
00059         HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 1);
00060         HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
00061     }
00062 
00063     void DMA2_Stream3_IRQHandler(void)
00064     {
00065         HAL_DMA_IRQHandler(SpiHandle.hdmatx);
00066     }
00067 
00068 } // extern "C"
00069 
00070 /*-------------------------------------------------------------------*/
00071 /*  Write a byte data                                                */
00072 /*-------------------------------------------------------------------*/
00073 void spi_write(uint8_t data)
00074 {
00075     HAL_SPI_Transmit(&SpiHandle, &data, 1, 100);
00076 }
00077 
00078 /*-------------------------------------------------------------------*/
00079 /*  Write a word data                                                */
00080 /*-------------------------------------------------------------------*/
00081 void spi_writew(uint16_t data)
00082 {
00083     HAL_SPI_Transmit(&SpiHandle, (uint8_t *)&data, 2, 100);
00084 }
00085 
00086 /*-------------------------------------------------------------------*/
00087 /*  Initialize SPI DMA                                               */
00088 /*-------------------------------------------------------------------*/
00089 void spi_init()
00090 {
00091     SpiHandle.Instance               = SPI1;
00092     SpiHandle.Init.Mode              = SPI_MODE_MASTER;
00093     SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
00094     SpiHandle.Init.Direction         = SPI_DIRECTION_2LINES;
00095     SpiHandle.Init.CLKPhase          = SPI_PHASE_1EDGE;
00096     SpiHandle.Init.CLKPolarity       = SPI_POLARITY_HIGH;
00097     SpiHandle.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
00098     SpiHandle.Init.CRCPolynomial     = 7;
00099     SpiHandle.Init.DataSize          = SPI_DATASIZE_8BIT;
00100     SpiHandle.Init.FirstBit          = SPI_FIRSTBIT_MSB;
00101     SpiHandle.Init.NSS               = SPI_NSS_SOFT;
00102     SpiHandle.Init.TIMode            = SPI_TIMODE_DISABLE;
00103 
00104     if (HAL_SPI_Init(&SpiHandle) != HAL_OK)
00105         while(1);
00106 }
00107