| 
 
| 本帖最后由 reptt 于 2025-4-8 18:14 编辑 
 代码如下,恳请大佬们帮助#include "bsp_spi.h"
 static void INT_SRC_DMA1_TC0_IrqCallback(void);
 //SPIx Config
 void bsp_SPIxCfg(void)
 {
 stc_spi_init_t stcSpiInit;
 stc_spi_delay_t stcSpiDelay;
 
 stc_gpio_init_t stcGpioInit;
 
 (void)GPIO_StructInit(&stcGpioInit);
 stcGpioInit.u16PinDrv       = PIN_HIGH_DRV;
 (void)GPIO_Init(GPIO_PORT_A, GPIO_PIN_04,  &stcGpioInit);
 (void)GPIO_Init(GPIO_PORT_A, GPIO_PIN_05, &stcGpioInit);
 (void)GPIO_Init(GPIO_PORT_A, GPIO_PIN_07, &stcGpioInit);
 
 GPIO_SetFunc(GPIO_PORT_A,GPIO_PIN_04,GPIO_FUNC_41);//SPI1-MISO
 
 GPIO_SetFunc(GPIO_PORT_A,GPIO_PIN_05,GPIO_FUNC_40);//SPI1-MOSI
 
 GPIO_SetFunc(GPIO_PORT_A,GPIO_PIN_07,GPIO_FUNC_43);//SPI1-SCK
 
 /* Enable SPI1 clock */
 FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_SPI1, ENABLE);
 /************************* Configure SPI1***************************/
 SPI_StructInit(&stcSpiInit);
 stcSpiInit.u32WireMode = SPI_3_WIRE;
 stcSpiInit.u32TransMode = SPI_SEND_ONLY;
 stcSpiInit.u32MasterSlave = SPI_MASTER;
 stcSpiInit.u32SpiMode = SPI_MD_1;
 stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV256;
 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_SPI1, &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_SPI1, &stcSpiDelay);
 
 /* Enable SPI1 */
 SPI_Cmd(CM_SPI1, ENABLE);
 
 }
 
 static void Spi_DmaCfg(void)
 {
 
 /* DMA1 FCG enable */
 FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_DMA1, ENABLE);
 /* AOS FCG enable */
 FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE);
 
 stc_dma_init_t stcDmaInit;
 
 /* Base Config */
 (void)DMA_StructInit(&stcDmaInit);
 
 stcDmaInit.u32IntEn = DMA_INT_ENABLE;
 stcDmaInit.u32BlockSize = 1UL;
 stcDmaInit.u32TransCount = 0UL;
 stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
 
 stcDmaInit.u32DestAddr = (uint32_t)(&CM_SPI1->DR);
 stcDmaInit.u32SrcAddr = 0;
 stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;
 stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
 (void)DMA_Init(CM_DMA1, DMA_CH0, &stcDmaInit);
 /* DMA1_CH0 Config */
 AOS_SetTriggerEventSrc(AOS_DMA1_0, EVT_SRC_SPI1_SPRI);
 /* IRQ sign-in */
 
 stc_irq_signin_config_t stcIrq;
 stcIrq.enIntSrc = INT_SRC_DMA1_TC0;
 stcIrq.enIRQn = INT038_IRQn;
 stcIrq.pfnCallback = &INT_SRC_DMA1_TC0_IrqCallback;
 (void)INTC_IrqSignIn(&stcIrq);
 /* NVIC config */
 NVIC_ClearPendingIRQ(stcIrq.enIRQn);
 NVIC_SetPriority(stcIrq.enIRQn, DDL_IRQ_PRIO_15);
 NVIC_EnableIRQ(stcIrq.enIRQn);
 
 /* DMA module enable */
 DMA_Cmd(CM_DMA1, ENABLE);
 /* DMA channel enable */
 (void)DMA_ChCmd(CM_DMA1, DMA_CH0, ENABLE);
 DMA_ClearTransCompleteStatus(CM_DMA1, DMA_INT_BTC_CH0);
 
 }
 
 /**
 * @brief  SPI configure.
 * @param  None
 * @retval None
 */
 void SPI_DMA_SEND(uint8_t * buf,uint8_t len)
 {
 
 while(DMA_GetTransCompleteStatus(CM_DMA1,DMA_INT_BTC_CH0)==SET){};
 DMA_SetSrcAddr(CM_DMA1, DMA_CH0, (uint32_t)(&buf));
 DMA_SetTransCount(CM_DMA1, DMA_CH0, len);
 /* Enable DMA channel */
 DMA_ChCmd(CM_DMA1, DMA_CH0, ENABLE);
 
 }
 
 /* INT_SRC_DMA1_BTC0 Callback. */
 static void INT_SRC_DMA1_TC0_IrqCallback(void)
 {
 //add your codes here
 DMA_ClearTransCompleteStatus(CM_DMA1, DMA_INT_TC_CH0);//DMA_INT_TC_CH0,DMA_INT_BTC_CH0
 
 
 }
 
 void bsp_spi_init(void)
 {
 bsp_SPIxCfg();
 Spi_DmaCfg();
 }
 
 | 
 
  |