遇到的问题是这样, HC32F460 使用SPI4驱动2寸屏,
spi 初始化
void SPI_Config(void)
{
GPIO_SetDebugPort(GPIO_PIN_SWO, DISABLE);
GPIO_SetFunc(GPIO_PORT_B,GPIO_PIN_03,GPIO_FUNC_47);//SPI4-SCK
GPIO_SetFunc(GPIO_PORT_B,GPIO_PIN_05,GPIO_FUNC_44);//SPI4-MOSI
stc_spi_init_t stcSpiInit;
stc_spi_delay_t stcSpiDelay;
stc_irq_signin_config_t stcIrqSignConfig;
/* Enable SPI4 clock */
FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_SPI4, ENABLE);
/************************* Configure SPI4***************************/
SPI_StructInit(&stcSpiInit);
stcSpiInit.u32WireMode = SPI_3_WIRE; //SPI_4_WIRE;
stcSpiInit.u32TransMode = SPI_SEND_ONLY;
stcSpiInit.u32MasterSlave = SPI_MASTER;
stcSpiInit.u32SpiMode = SPI_MD_0;
stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV2;
stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT;
stcSpiInit.u32FirstBit = SPI_FIRST_MSB;
stcSpiInit.u32SuspendMode = SPI_COM_SUSP_FUNC_OFF;
stcSpiInit.u32FrameLevel = SPI_1_FRAME;
(void)SPI_Init(CM_SPI4, &stcSpiInit);
SPI_DelayStructInit(&stcSpiDelay);
stcSpiDelay.u32IntervalDelay = SPI_INTERVAL_TIME_1SCK;
stcSpiDelay.u32ReleaseDelay = SPI_RELEASE_TIME_1SCK;
stcSpiDelay.u32SetupDelay = SPI_SETUP_TIME_1SCK;
(void)SPI_DelayTimeConfig(CM_SPI4, &stcSpiDelay);
SPI_Cmd(CM_SPI4, ENABLE);
}
,
DMA初始化
void spi_dma_config(void)
{
stc_dma_init_t stcDmaInit;
stc_irq_signin_config_t stcIrqSignConfig;
/* DMA configuration */
FCG_Fcg0PeriphClockCmd((FCG0_PERIPH_DMA1 | FCG0_PERIPH_AOS), ENABLE);
(void)DMA_StructInit(&stcDmaInit);
stcDmaInit.u32BlockSize = 1UL;
stcDmaInit.u32TransCount = 65536;
stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
/* Configure TX */
stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;
stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
stcDmaInit.u32SrcAddr = (uint32_t)(&dis_buf[0]);
stcDmaInit.u32DestAddr = (uint32_t)(&CM_SPI4->DR);
if (LL_OK != DMA_Init(CM_DMA1, DMA_CH0, &stcDmaInit)) {
for (;;) {
}
}
AOS_SetTriggerEventSrc(AOS_DMA1_0, EVT_SRC_SPI4_SPTI);
/* DMA receive NVIC configure */
stcIrqSignConfig.enIntSrc = INT_SRC_DMA1_TC0;
stcIrqSignConfig.enIRQn = INT000_IRQn;
stcIrqSignConfig.pfnCallback = &DMA_TransCompleteCallback;
(void)INTC_IrqSignIn(&stcIrqSignConfig);
NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);
/* Enable DMA and channel */
DMA_Cmd(CM_DMA1, ENABLE);
DMA_ChCmd(CM_DMA1, DMA_CH0, ENABLE);
}
void DMA_ReloadConfig(void)
{
DMA_SetSrcAddr(CM_DMA1, DMA_CH0, (uint32_t)(&dis_buf[0]));
DMA_SetTransCount(CM_DMA1, DMA_CH0, 65535);
/* Enable DMA channel */
DMA_ChCmd(CM_DMA1, DMA_CH0, ENABLE);
}
按DDL里面的例子, main() 里面这样写的
SPI_Cmd(CM_SPI4, DISABLE);
spi_dma_config();
DMA_ReloadConfig();
SPI_Cmd(CM_SPI4, ENABLE);
实际结果是 spi 没有任何动作, , ,
请教大家, 怎么配置好了SPI 和DMA之后, 触发DMA给SPI搬运数据?
谢谢 |