STM32H743 利用定时器DMA触发SPI发送和 接收数据,发现接收的前面5个都不变化, SPI的芯片是一个ADC芯片,触发后,直接可以从MISO上获取到数据。 初始化程序,CH2 是 RX, CH4是TX,定义了两个全局的buf - volatile uint32_t DMARxBuf[32]= {0};
- volatile uint32_t SPI1DMARxBuf[32] = {0};
复制代码定时器的初始化代码如下 - void SPI_ZJC2001_Init(void)
- {
- LL_DMA_SetMemoryAddress(DMA1, LL_DMA_STREAM_1, (uint32_t)(&clk_word) );
- LL_DMA_SetPeriphAddress(DMA1, LL_DMA_STREAM_1, (uint32_t)(&SPI_ZJC2001_NUM->TXDR));
- LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_1, 1);
- LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_1);
-
- // LL_DMA_SetMemoryAddress(DMA2, LL_DMA_STREAM_0, (uint32_t)DMARxBuf );
- LL_DMA_SetMemoryAddress(DMA2, LL_DMA_STREAM_0, (uint32_t)SPI1DMARxBuf );
- LL_DMA_SetPeriphAddress(DMA2, LL_DMA_STREAM_0, (uint32_t)(&SPI_ZJC2001_NUM->RXDR));
- LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_0, 14);
- LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_0);
- LL_TIM_CC_EnableChannel(TIME_ZJC2001_NUM, LL_TIM_CHANNEL_CH2); //触发
- LL_TIM_CC_EnableChannel(TIME_ZJC2001_NUM, LL_TIM_CHANNEL_CH3); //pwm 控制 CS
- LL_TIM_CC_EnableChannel(TIME_ZJC2001_NUM, LL_TIM_CHANNEL_CH4); //触发
- LL_TIM_EnableDMAReq_CC2(TIME_ZJC2001_NUM);
- LL_TIM_EnableDMAReq_CC4(TIME_ZJC2001_NUM);
- LL_TIM_EnableDMAReq_UPDATE(TIME_ZJC2001_NUM);
-
- LL_SPI_Enable(SPI_ZJC2001_NUM); //使能SPI外设
- LL_SPI_StartMasterTransfer(SPI_ZJC2001_NUM);
-
- LL_TIM_SetCounter(TIME_ZJC2001_NUM, 0); //清0,重新计数
- LL_TIM_EnableCounter(TIME_ZJC2001_NUM);//TIME_ZJC2001_NUM 计数使能
- }
复制代码现象就是,我使用0X240049AC这个地址的变量DMARxBuf,前面5个数据,就不会变化,只会变化后面的。 
而我如果使用 SPI1DMARxBuf ,地址是 0X24004A2C ,则发现,数据读写就正常。 
优化等级,设置的是LEVEL 0, ICACHE 和 DCHACHE 都是enable的; 对于这个现象,百思不得其解,求助大佬指点
|