2019 8 9 STM32F407ADS1526 continuous conversion configuration mode (sampling rate 15000SPS)

Did not try 30000sps

Sampling rate may not be used, you need to change the SPI rate, etc.

Use ADS1256DRDY pin as the interrupt trigger data collection

main.c中:

 1         if (state)
 2         {
 3             ADS1256WREG(ADS1256_MUX,(0 << 4) | ADS1256_MUXN_AINCOM);        //ÉèÖÃͨµÀ
 4                 
 5             GPIO_ResetBits(GPIOB, GPIO_Pin_6);;
 6             while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)); //µ±ADS1256_DRDYΪµÍʱ²ÅÄÜд¼Ä´æÆ÷ 
 7         //    ADS1256WREG(ADS1256_MUX,channel);        //ÉèÖÃͨµÀ
 8             SPI_WriteByte(ADS1256_CMD_SYNC);
 9         //    while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
10             SPI_WriteByte(ADS1256_CMD_WAKEUP);                   
11             while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
12             SPI_WriteByte(ADS1256_CMD_RDATAC);
13             while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
14             TIM_Cmd(TIM4, ENABLE);  //ʹÄÜTIMxÍâÉè
15             delay_us(8);
16             state = 0;
17         }

External interruption:

u8 state=1;

long double getval[15010];
static u32 i;
//ÍⲿÖжÏ0·þÎñ³ÌÐò
void EXTI9_5_IRQHandler(void)
{
    long ulResult;
    long double ldVolutage;
    
    if(EXTI_GetITStatus(EXTI_Line8)!=RESET)     
    {

//        ADS1256WREG(ADS1256_MUX,(0 << 4) | ADS1256_MUXN_AINCOM);        //ÉèÖÃͨµÀ
//            
//        GPIO_ResetBits(GPIOB, GPIO_Pin_6);;
//        while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)); //µ±ADS1256_DRDYΪµÍʱ²ÅÄÜд¼Ä´æÆ÷ 
//    //    ADS1256WREG(ADS1256_MUX,channel);        //ÉèÖÃͨµÀ
//        SPI_WriteByte(ADS1256_CMD_SYNC);
//    //    while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
//        SPI_WriteByte(ADS1256_CMD_WAKEUP);                   
//        while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
//        SPI_WriteByte(ADS1256_CMD_RDATA);
//        while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
//        delay_us(8);
//    
        
        if(i<15000)
        {
            ulResult |= (SPI_WriteByte(0xff) << 16);
            ulResult |= (SPI_WriteByte(0xff) << 8);
            ulResult |= SPI_WriteByte(0xff);

            state = 1;

            if( ulResult & 0x800000 )
            {
                ulResult = ~(unsigned long)ulResult;
                ulResult &= 0x7fffff;
                ulResult += 1;
                ulResult = -ulResult;
            }

            getval[i++] = (long double)ulResult*5/8388607;        
//            i++;        
//            printf("i = %d\r\n",i);
//            printf("%lf",ldVolutage);     //double
//            printf("V\r\n");                
        }
        else 
        {        
//            for(int t = 0;t<i;t++)
//            {
//                printf("t = %d\r\n",t);
//                printf("%lf",getval[t]);     //double
//                printf("V\r\n");    
//            }
            i=0;
        }

    }         


    EXTI_ClearITPendingBit(EXTI_Line8); //Çå³ýLINE0ÉϵÄÖжϱê־λ 
}    

       
//ÍⲿÖжϳõʼ»¯³ÌÐò
//³õʼ»¯PE2~4,PA0ΪÖжÏÊäÈë.
void EXTIX_Init(void)
{
    NVIC_InitTypeDef   NVIC_InitStructure;
    EXTI_InitTypeDef   EXTI_InitStructure;
    
//    KEY_Init(); //°´¼ü¶ÔÓ¦µÄIO¿Ú³õʼ»¯
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//ʹÄÜSYSCFGʱÖÓ    
 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource8);//PB8 Á¬½Óµ½ÖжÏÏß8

    /* ÅäÖÃEXTI_Line2,3,4 */
    EXTI_InitStructure.EXTI_Line = EXTI_Line8;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//ÖжÏʼþ
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//ÖжÏÏßʹÄÜ
  EXTI_Init(&EXTI_InitStructure);//ÅäÖÃ
 
        
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//ÍⲿÖжÏ0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//ÇÀÕ¼ÓÅÏȼ¶0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//×ÓÓÅÏȼ¶2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ʹÄÜÍⲿÖжÏͨµÀ
  NVIC_Init(&NVIC_InitStructure);//ÅäÖÃ
    
       
}

 

ADS1256 Configuration

void SPI1_Init(void)
{     
  GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
    
//  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//ʹÄÜGPIOBʱÖÓ
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//ʹÄÜSPI1ʱÖÓ
 
  //GPIOFB3,4,5³õʼ»¯ÉèÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;//PB3~5¸´Óù¦ÄÜÊä³ö    
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // 100MHz 
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // EIA 
  GPIO_Init (GPIOB, & GPIO_InitStructure); // ³õʼ »¯ 
    
    GPIO_PinAFConfig (GPIOB, GPIO_PinSource3, GPIO_AF_SPI1); // PB3¸'ÓÃΪ SPI1 
    GPIO_PinAFConfig (GPIOB, GPIO_PinSource4, GPIO_AF_SPI1); // PB4¸'ÓÃΪ SPI1 
    GPIO_PinAFConfig (GPIOB, GPIO_PinSource5, GPIO_AF_SPI1); // PB5¸'ÓÃΪ SPI1 
 
    // ÕâÀïÖ 'Õë¶ÔSPI¿Ú³õʼ »¯ 
    RCC_APB2PeriphResetCmd (RCC_APB2Periph_SPI1, ENABLE); // 'i 'SPI1 
    RCC_APB2PeriphResetCmd (RCC_APB2Periph_SPI1, DISABLE);// In Ö¹¸'Î £ »SPI1 

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  // ÉèÖÃSPIμ io ¥ »òÕßË« £ ÏòμÄÊý¾ÝÄ Ê½: SPIÉèÖÃÎªË «Issel« IOE «ê« ¹¤ 
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        // ÉèÖÃSPI¹¤ × ÷ Ä £ ʽ: ÉèÖÃ뻅 ÷ SPI 
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        // ÉèÖÃSPIμÄÊý¾Ý'óС: SPI ËͽÓÊÕ8Î · ¢ »Ö¡½á¹¹ 
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        // '®ÐÐͬ²½Ê ± ÖÓμÄ¿ÕÏÐ ×'̬ΪμÍμçƽ 
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;    // '®ÐÐͬ²½Ê ÖÓμÄμÚ¶þ¸öÌø ± ± ano ¨ÉÏÉý £ »£ © òϽμ Êý¾Ý ±» ²ÉÑù 
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        //NSSÐźÅÓÉÓ²¼þ ¨NSS¹Ü½Å £ £ © »¹ÊÇÈí¼þ ¨Ê¹ÓÃSSIÎ £» £ © ¹ÜÀí: ÄÚ²¿NSSÐźÅÓÐSSIÎ »¿ØÖÆ 
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;        // ¶¨Ò岨ÌØÂÊÔ¤ · ÖÆμμÄÖμ: ²¨ÌØÂÊÔ¤ · ÖÆμÖμΪ256 
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;    // Ö¸¶¨Êý¾Ý' "Êä'ÓMSBλ »¹ÊÇLSBλ ¿ªÊ¼: Êý¾Ý' "Êä'ÓMSBλ ¿ªÊ¼ 
    SPI_InitStructure.SPI_CRCPolynomial = 7 ;    // CRCÖμ¼ÆËãμĶàÏîʽ 
    SPI_Init (SPI1, & SPI_InitStructure);  // ¸ù¾ÝSPI_InitStructÖÐÖ¸¶¨μIJÎÊý³õʼ »÷ ¯ÍâÉèSPIx¼Ä'æÆ 
 
    SPI_Cmd (SPI1, ENABLE); // ʹÄÜSPIÍâÉè 
} 

// ³õʼ »¯ADS1256 GPIO 
void Init_ADS1256_GPIO (void)
{
  GPIO_InitTypeDef GPIO_InitStructure; 

    RCC -> AHB1ENR |= (1<<1);    //PB
    
     GPIO_InitStructure.GPIO_Pin = GPIO_RCC_ADS1256Reset|GPIO_Pin_6; 
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
     GPIO_Init(GPIO_RCC_ADS1256Reset_PORT, &GPIO_InitStructure);  
    
     GPIO_ResetBits(GPIO_RCC_ADS1256Reset_PORT, GPIO_RCC_ADS1256Reset );

    GPIO_InitStructure.GPIO_Pin = GPIO_ADS1256DRDY; 
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_Init (GPIO_ADS1256DRDY_PORT, & GPIO_InitStructure);  

    SPI1_Init (); 
} 


// ----------------------------------------------- ------------------ // 
//     ¹| Au £ º £ ÄâSPIͨÐÅ
 //     Èë¿Ú²ÎÊý: / · ¢ ËÍμÄSPIÊý¾Ý
 //     ³ö¿Ú²ÎÊý: / ½ÓÊÕμÄSPIÊý¾Ý
 //     You "¾Ö ± äÁ¿: /
 //     ± ¸ × ¢ · ¢ ËͽÓÊÕº¯Êý
 // -------------------------- --------------------------------------- //
 unsigned char SPI_WriteByte (unsigned charTxData) 
{      
  while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_TXE) == RESET) {} // μÈ'ý · ¢ ËÍÇø¿Õ   
    
    SPI_I2S_SendData (SPI1, TxData); // ͨ¹ýÍâÉèSPIx EIO · ¢ »¸öbyte Êý¾Ý 
        
  while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_RXNE) == RESET) {} // μÈ'ý½ÓÊÕÍêÒ» ¸öbyte   
 
    return SPI_I2S_ReceiveData (SPI1); // · μ »Øͨ¹ýSPIx × î½ü½ÓÊÕμÄÊý¾Ý     
             
} 

// ------------------------------------- ---------------------------- // 
//     ¹| Au £ ºADS1256 Ð'Êý¾Ý
 //     Èë¿Ú²ÎÊý: /
 //     ³ö ¿Ú²ÎÊý: /
 //     You "¾Ö ± äÁ¿: /
//    ±¸    ×¢: ÏòADS1256ÖеØַΪregaddrµÄ¼Ä´æÆ÷дÈëÒ»¸ö×Ö½Údatabyte
//-----------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
    GPIO_ResetBits(GPIOB, GPIO_Pin_6);
    while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));//µ±ADS1256_DRDYΪµÍʱ²ÅÄÜд¼Ä´æÆ÷
    //Ïò¼Ä´æÆ÷дÈëÊý¾ÝµØÖ·
    SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
    //дÈëÊý¾ÝµÄ¸öÊýn-1
    SPI_WriteByte(0x00);
    //ÏòregaddrµØÖ·Ö¸ÏòµÄ¼Ä´æÆ÷дÈëÊý¾Ýdatabyte
    SPI_WriteByte(databyte);
    delay_us(1);
    GPIO_SetBits(GPIOB, GPIO_Pin_6);
}


//³õʼ»¯ADS1256
void ADS1256_Init(void)
{
    Init_ADS1256_GPIO();
    GPIO_ResetBits(GPIOB, GPIO_Pin_7);  
    delay_us(50);
    GPIO_SetBits(GPIOB, GPIO_Pin_7);//RESET
    delay_us(50);    
    GPIO_ResetBits(GPIOB, GPIO_Pin_6);//CS
    ADS1256WREG(ADS1256_STATUS,0x06);  // ¸ßλÔÚÇ°¡¢Ð£×¼¡¢Ê¹Óûº³å
    while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
    SPI_WriteByte(ADS1256_CMD_SELFCAL);//Æ«ÒÆÔöÒæ×ÔУ׼
//    ADS1256WREG(ADS1256_MUX,0x08);                  // ³õʼ»¯¶Ë¿ÚA0Ϊ¡®+¡¯£¬AINCOMλ¡®-¡¯
//    while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
    ADS1256WREG(ADS1256_ADCON,0);   // ·Å´ó±¶Êý1
    ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_15000SPS);  // Êý¾Ý5sps
    ADS1256WREG(ADS1256_IO,0x00); 
    GPIO_SetBits(GPIOB, GPIO_Pin_6);    
}

 

Guess you like

Origin www.cnblogs.com/calm-monkey/p/11369858.html