2019-07-14 18:32发布
cknz 发表于 2018-8-16 09:15 你这个i--在while里面?你没有到DMA的接收完成中断?你最好检测两个频率下的miso和clk的区别.
最多设置5个标签!
本帖最后由 dh2964169 于 2018-3-6 10:31 编辑
谢谢您的关注和提醒。 确实,开始没有弄清DMA的功能,认为i=DMA缓冲区的大小,让SPI运行i次即获得data组采样数据;并且以为i--的运行不会对运行过程产生明显的影响(现在回想,这是一种麻烦的做法)。现在在您的提示下,改用了DMA传输完成进行中断。
但是,和以前的结果一样;我贴出两种情况的代码 和 SCLK与MISO图。请帮再看看为什么还是不能在16分频采样到准确的波形呢?
一 使用 i-- 未使用中断方式
SPIx_Init(); //SPI初始化
GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置1
Rheostat_DMA_Mode_Config(); //DMA初始化
MyDMA_Enable(RHEOSTAT_ADC_DMA_STREAM,numlength); //使能DMA
SPI_I2S_DMACmd (AD_SPI,SPI_I2S_DMAReq_Rx,ENABLE); //SPI_DMA功能使能
while (1)
{
GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置0
Delay(5);
SPI_Cmd(AD_SPI, ENABLE); //SPI开启
data=SPIx_ReadWriteByte(); //产生16个周期的读取数据
SPI_Cmd(AD_SPI, DISABLE); //SPI关闭
Delay(140); //延时时间稍长,为的是让CS=1前,关闭SPI,否则CS=1与sck有重合
GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置1
i--;
Delay(5);
}
二 去掉i--,并使用DMA中断传输完成中断,在中断服务函数打印缓存数据
SPIx_Init(); //SPI初始化
GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置1
Rheostat_DMA_Mode_Config(); //DMA初始化
DMAxx_NVIC(); //DMA中断配置
DMA_ITConfig(RHEOSTAT_ADC_DMA_STREAM,DMA_IT_TC,ENABLE ); //传输完成中断使能
MyDMA_Enable(RHEOSTAT_ADC_DMA_STREAM,numlength); //使能DMA
SPI_I2S_DMACmd (AD_SPI,SPI_I2S_DMAReq_Rx,ENABLE); //SPI_DMA功能使能
while (i)
{
GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置0
Delay(5);
SPI_Cmd(AD_SPI, ENABLE); //SPI开启
data=SPIx_ReadWriteByte(); //产生16个周期的读取数据
SPI_Cmd(AD_SPI, DISABLE); //SPI关闭
Delay(140); //延时时间稍长,为的是让CS=1前,关闭SPI,否则CS=1与sck有重合
GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置1
Delay(5);
}
///////////////////////////中断服务函数//////////////////////////////////
void DMA1_Stream0_IRQHandler(void)
{
for (j=numlength;j>1;j--)
{
printf("%d ",ADC_ConvertedValue[j]);
}
DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_TCIF0); //清除完成中断标志位
}
结果图:
一周热门 更多>