打印

AD+SPI+DMA提高采样率后,采集的数据不正确,望大家给与指...

[复制链接]
3178|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 钓鱼村 于 2018-1-17 09:46 编辑

总体思路:1.使用AD7357芯片,4.2MSPS,可同时采集双通道信号,14bit的一款芯片(后附时序图),要求采集10k~500k的信号;                                                               2.由STM32F429的SPI来传输AD采集到的数据,同时SPI的sck与AD芯片的时钟引脚相连,即SPI实现传输数据的同时提供AD的采样频率;
                3.通过DMA来传输SPI的ad返回值。故SPI只需要CS,SCLK,MISO;

7357时序图,代码下附


遇到的麻烦:1. 当SPI的SCK设置为分频即1.4MHz时,能准确采集100KHz正弦信号。但是当分频系数取16,即sck为2.8MHz时钟,这时就不能得到准确的数据了?                 
                   2.通过设置32分频和16分频可以看出波形,16分频的sck空闲时没有像32分频空闲时那样置1,而是一个上升过程,这会不会是影响数据错误的原因呢?
                   3.会不会是sck频率变高以后,导致传输采集的AD数据中,发生了数据的覆盖或者丢失导致,输出数据不能得到原始波形呢?

         两种情况的波形如下:第一幅图是16分频的,sck和cs信号;第二幅图是32分频;










16分频.jpg (524.43 KB )

16分频.jpg

32分频.jpg (561.79 KB )

32分频.jpg

7357.png (172.56 KB )

7357.png

相关帖子

沙发
钓鱼村|  楼主 | 2018-1-17 09:45 | 只看该作者
int main()
{               
        AD9833_GPIO_Init();           
        AD9833_reset();                        
        AD9833_Init(100000);        //  AD9833输出设置
        
        Debug_USART_Config();
        IO_GPIO_Init();               
        IO_Enalbel();                  

        SPIx_Init();                                                                           //SPI初始化
        GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);                       //CS置位
        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(10);                                                              //
               
          SPI_Cmd(AD_SPI, ENABLE);                                               //  spi使能
               data=SPIx_ReadWriteByte();                                         //  spi发送数据到主控   
   // while(DMA_GetFlagStatus(DMA1_Stream0,DMA_FLAG_TCIF0)==RESET ){};               
                 SPI_Cmd(AD_SPI, DISABLE);                                        //   spi使能   

           //    Delay(10);
        
                SPI_Cmd(AD_SPI, ENABLE);                                        //spi使能
                data=SPIx_ReadWriteByte();                                       // spi发送数据到主控                     
        //  while(DMA_GetFlagStatus(DMA1_Stream0,DMA_FLAG_TCIF0)==RESET ){};               
                 SPI_Cmd(AD_SPI, DISABLE);                                      //spi失能

                    Delay(120);                                                            //延时,保证时序正确

                GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);             //cs置1
                    i--;
                    Delay(5);                                 
        }
/**************打印DMA传输的数据,双通道数据输出***************/
        for (j=numlength;j>1;j=j-2)
{        
                printf("%d,%d\n",ADC_ConvertedValue[j],ADC_ConvertedValue[j-1]);
                 Delay(10);  
}
}

/////////////////////////////////////////////////////////////spi的配置//////////////////////////////////////////////////////////////
#include "dsp_spi.h"
//SPI3
void SPIx_Init(void)
{   
                SPI_InitTypeDef   SPI_InitStructure;   
                GPIO_InitTypeDef  GPIO_InitStructure;   
        
               
                RCC_AHB1PeriphClockCmd(AD_SPI_SCK_GPIO_CLK|AD_SPI_MISO_GPIO_CLK|AD_SPI_MOSI_GPIO_CLK|AD_CS_GPIO_CLK, ENABLE);
               AD_SPI_CLK_INIT(AD_SPI_CLK,ENABLE);           
        
    GPIO_PinAFConfig(AD_SPI_SCK_GPIO_PORT,AD_SPI_SCK_PINSOURCE,AD_SPI_SCK_AF);   //PC10¸′óÃSPI3μÄSCLK
    GPIO_PinAFConfig(AD_SPI_MISO_GPIO_PORT,AD_SPI_MISO_PINSOURCE,AD_SPI_MISO_AF);  //PC11¸′óÃSPI3μÄMISO
   // GPIO_PinAFConfig(AD_SPI_MOSI_GPIO_PORT,AD_SPI_MOSI_PINSOURCE,AD_SPI_MOSI_AF);  //PC12¸′óÃSPI3μÄMOSI

        //  GPIO_PinAFConfig(GPIOA,AD_CS_PIN,GPIO_AF_SPI3);      //PA4 ¸′óÃSPI3μÄCS
               

                        GPIO_InitStructure.GPIO_Pin = AD_SPI_SCK_PIN;
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;         
                    //  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      
                        GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;   
                        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;      
                GPIO_Init(AD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);  

            GPIO_InitStructure.GPIO_Pin = AD_SPI_MISO_PIN;
    GPIO_Init(AD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
                     
        GPIO_InitStructure.GPIO_Pin = AD_CS_PIN;        
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT ;         
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;              
          GPIO_InitStructure.GPIO_Speed=GPIO_Fast_Speed;         
    GPIO_Init(AD_CS_GPIO_PORT, &GPIO_InitStructure);      

    GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);        

    //
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;  //只接受模式
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                       //主模式
    SPI3->CR1|=1<<10;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;                   //每次传输16位
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                           //sck空闲时保持高电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                        //奇数边沿采样
    SPI_InitStructure.SPI_NSS  = SPI_NSS_Soft;                               //NSSóéó2¼t»1êÇèí¼t¿ØÖÆ
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //SPI分频系数,和scK时钟频率设置
        
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;         
    SPI_InitStructure.SPI_CRCPolynomial = 7;                    
    SPI_Init(AD_SPI, &SPI_InitStructure);                                    
}   


u16 SPIx_ReadWriteByte(void)
{  
        u8 retry=0;         
                        
                while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_RXNE) == RESET)
        {
                retry++;
                if(retry>200)
                        return 0;
        }                 
                        return SPI_I2S_ReceiveData(AD_SPI);
        
}









使用特权

评论回复
板凳
钓鱼村|  楼主 | 2018-1-17 09:47 | 只看该作者
困了好长一段时间,希望能给与指点,谢谢好心的大家

使用特权

评论回复
地板
mmuuss586| | 2018-1-17 10:18 | 只看该作者
不用DMA看下是否可以;
先判断是不是SPI设置太高问题;

使用特权

评论回复
5
钓鱼村|  楼主 | 2018-1-17 10:22 | 只看该作者
mmuuss586 发表于 2018-1-17 10:18
不用DMA看下是否可以;
先判断是不是SPI设置太高问题;

这个尝试过,直接将数据存放在内存中,然而数据还没有DMA的数据准确。所以不是DMA导致的吧。谢谢@mmuuss586

使用特权

评论回复
6
钓鱼村|  楼主 | 2018-1-17 10:27 | 只看该作者
钓鱼村 发表于 2018-1-17 10:22
这个尝试过,直接将数据存放在内存中,然而数据还没有DMA的数据准确。所以不是DMA导致的吧。谢谢@mmuuss5 ...

我把DMA全部关了,再看SCK波形,依然和上面16分频的一样

使用特权

评论回复
7
钓鱼村|  楼主 | 2018-1-20 12:49 | 只看该作者
写代码的 发表于 2018-1-19 14:25
供参考:https://ezchina.analog.com/search.jspa?q=AD7357

谢谢,那里面的问题和我的有些差别,还不没有找到原因得

使用特权

评论回复
8
axbin| | 2018-3-6 14:26 | 只看该作者
我用F429连接SPI Flash的时候遇到了类似问题,怀疑是硬件bug,不知道楼主解决没有?

使用特权

评论回复
9
钓鱼村|  楼主 | 2018-3-9 09:00 | 只看该作者
axbin 发表于 2018-3-6 14:26
我用F429连接SPI Flash的时候遇到了类似问题,怀疑是硬件bug,不知道楼主解决没有? ...

惭愧,还没呢,你呢

使用特权

评论回复
10
QWE4562009| | 2019-7-15 17:12 | 只看该作者
4.2MSPS-------------不是4.2MBPS?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

42

帖子

2

粉丝