高中生
最后登录1970-1-1
在线时间 小时
注册时间2017-9-12
|

楼主 |
发表于 2018-3-7 22:08:37
|
显示全部楼层
本帖最后由 钓鱼村 于 2018-3-8 08:32 编辑
您好,前一段时间请教过您的问题,现在还没有解决,再次向您请教些问题。谢谢
总体描述:使用SPI+DMA中断方式接收AD芯片的采样100KHz的正弦信号采样数据,并在DMA中断传输完成服务函数中打印ADC_ConvertedValue[500]采样数据;
问题描述:(1)采样SPI的32分频(1.4MHz)可以恢复100KHz正弦信号,而16分频(2.8MHz)则不能恢复出完整正弦信号?(后面附上采样图)
(2)是否是数据覆盖,或者SPI速度太快,数据未能及时处理呢?
主要程序:
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\n",ADC_ConvertedValue[j]);
}
DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_TCIF0); //清除完成中断标志位
}
|
-
SPI的32分频采样波形
-
SPI的16分频采样波形
|