void GPIO_Configuration(void) { GPIO_InitType GPIO_InitStructure; RCC_EnableAPB2PeriphClk(SPI_MASTER_GPIO_CLK | RCC_APB2_PERIPH_AFIO, ENABLE); GPIO_InitStruct(&GPIO_InitStructure); /* Configure SPI_MASTER pins: SCK ,MISO and MOSI */ GPIO_InitStructure.Pin = SPI_MASTER_PIN_SCK | SPI_MASTER_PIN_MOSI; GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_HIGH; GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL; GPIO_InitStructure.GPIO_Alternate = SPI_MASTER_GPIO_AF; GPIO_InitPeripheral(SPI_MASTER_GPIO, &GPIO_InitStructure); }
void DMA_SPI_Configuration(void) { DMA_InitType DMA_InitStructure; RCC_EnableAHBPeriphClk(SPI_MASTER_DMA_CLK, ENABLE); /* SPI_MASTER_TX_DMA_CHANNEL configuration */ DMA_DeInit(SPI_MASTER_TX_DMA_CHANNEL); DMA_InitStructure.PeriphAddr = (uint32_t)&SPI_MASTER->DAT; DMA_InitStructure.MemAddr = (uint32_t)SPI_Master_Tx_Buffer; DMA_InitStructure.Direction = DMA_DIR_PERIPH_DST; DMA_InitStructure.BufSize = BUFFER_SIZE; DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE; DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE; DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_BYTE; DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.CircularMode = DMA_MODE_NORMAL; DMA_InitStructure.Priority = DMA_PRIORITY_HIGH; DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE; DMA_Init(SPI_MASTER_TX_DMA_CHANNEL, &DMA_InitStructure); DMA_RequestRemap(SPI_MASTER_TX_DMA_REMAP, DMA, SPI_MASTER_TX_DMA_CHANNEL, ENABLE); }
void SPI_Configuration(void) { SPI_InitType SPI_InitStructure; RCC_EnableAPB2PeriphClk(SPI_MASTER_CLK, ENABLE); SPI_I2S_DeInit(SPI_MASTER); /* SPI_MASTER configuration * ------------------------------------------------*/ SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX; SPI_InitStructure.SpiMode = SPI_MODE_MASTER; SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS; SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH; SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE; SPI_InitStructure.NSS = SPI_NSS_SOFT; SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_32; SPI_InitStructure.FirstBit = SPI_FB_MSB; SPI_InitStructure.CRCPoly = CRC_POLYNOMIAL; SPI_Init(SPI_MASTER, &SPI_InitStructure); /* Enable SPI_MASTER */ SPI_Enable(SPI_MASTER, ENABLE); }
void SPI_Write_DMA(SPI_Module* SPIx, uint8_t* writePtr, uint16_t len) { uint32_t timeOut = 0x1000; while ((SPI_I2S_GetStatus(SPIx, SPI_I2S_BUSY_FLAG) != RESET) && (timeOut--)) __NOP(); // Wait BUSY // SPI_I2S_ReceiveData(SPIx); // CLear RNE SPI_I2S_EnableDma(SPIx, SPI_I2S_DMA_TX, DISABLE); // Disable DMA request DMA_EnableChannel(SPI_MASTER_TX_DMA_CHANNEL, DISABLE); // Disable DMA SPI_MASTER_TX_DMA_CHANNEL->MADDR = (uint32_t)writePtr; SPI_MASTER_TX_DMA_CHANNEL->TXNUM = len; DMA_EnableChannel(SPI_MASTER_TX_DMA_CHANNEL, ENABLE); // Enable DMA SPI_I2S_EnableDma(SPIx, SPI_I2S_DMA_TX, ENABLE); // DMA Start Work }
int main(void) { log_init(); log_info("\n this is a SPI master DMA Demo.\n"); GPIO_Configuration(); DMA_SPI_Configuration(); SPI_Configuration(); log_info("\n DMA Transfer start.\n"); for (int i = 0; i < 3; i++) { SPI_Write_DMA(SPI_MASTER, SPI_Master_Tx_Buffer, BUFFER_SIZE); while (!DMA_GetFlagStatus(SPI_MASTER_TX_DMA_FLAG, SPI_MASTER_DMA)) __NOP(); } log_info("\n DMA Transfer end.\n"); while (1) { } }
使用特权
发表回复 本版积分规则 回帖后跳转到最后一页
13
51
1
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号