初级会员 
  
	- 积分
 - 91
 
        - 金钱
 - 91 
 
       - 注册时间
 - 2020-7-11
 
      - 在线时间
 - 23 小时
 
 
 
 | 
 
8金钱 
STM32F4模拟SPI驱动AD7606外部中断读取数据有误,下面是关键代码,大家看看有没有错误 
1、主函数 
int main(void) 
{          
        SystemInit(); 
        delay_init(168);     
        LED_Init();                     
        AD7606_ConfigGPIO();  配置模拟IO 
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级 
        uart_init(115200);        //串口波特率115200 
 
        AD7606_RESET();   硬件复位 
        AD7606_STARTCONV();        开启转换 
        EXTIX_Init();       //中断初始化                                                     
       // AD7606_SETOS(0);OS接地 
        while(1) 
        {  
        LED0=!LED0;  //提示系统在运行 
        } 
} 
 
2、外部中断 
void EXTIX_Init(void)    中断初始化 
{ 
        NVIC_InitTypeDef   NVIC_InitStructure; 
        EXTI_InitTypeDef   EXTI_InitStructure; 
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource5);    外部中断BUSY,PA5 
         
       EXTI_InitStructure.EXTI_Line = EXTI_Line0; 
       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 = EXTI0_IRQn; 
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; 
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; 
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
       NVIC_Init(&NVIC_InitStructure);                    
} 
 
3、中断服务函数 
void EXTI0_IRQHandler(void) 
{ 
        int16_t adc; 
        LED1=!LED1;        提示进入中断 
        AD7606_Scan();扫描读取 
        AD7606_Mak();处理 
         AD7606_Disp();显示 
         EXTI_ClearITPendingBit(EXTI_Line0);//清楚中断标志位         
} 
 
4、读取函数 
void AD7606_Scan(void)                  
{ 
        uint8_t i;                         
        if (AD7606_BUSY == 0)            
    {  
                AD7606_CS_L;  
                for (i = 0; i < 8; i++) 
                { 
                        s_adc_now = spiRead1();         
                        s_adc_now = s_adc_now * 256 + spiRead1(); 
                } 
         
                AD7606_CS_H;  
          AD7606_STARTCONV();        开启转换         
 
        } 
}          
 
5、读取AD转换数据 
int16_t spiRead1(void) 
{         
   uint8_t i,j; 
   int16_t read = 0; 
 
    for (i = 0; i < 8; i++) 
    { 
        AD7606_SCLK_L; 
        for(j=0; j<2; j++); 
        read = read << 1; 
        if (AD7606_DOUTA ) 
        { 
            read++; 
        } 
        AD7606_SCLK_H; 
        for(j=0; j<2; j++); 
    } 
    return read; 
} 
 
6、处理数据 
void AD7606_Mak(void) 
{ 
        uint8_t i; 
        int16_t adc; 
        for (i = 0;i < 8; i++) 
        {         
                s_dat = s_adc_now;; 
                adc = s_dat; 
                s_volt = (adc * 10000) / 32767; 
        } 
} 
 
7、显示 
void AD7606_Disp(void) 
{ 
        int16_t i;         
        int16_t iTemp; 
        for (i = 0; i < 8; i++) 
        {                 
                   iTemp = s_volt;        /* uV  */ 
                 
                if (s_dat < 0) 
                { 
                        iTemp = -iTemp; 
          printf(" CH%d = %6d,0x%04X (-%d.%d%d%d V) \r\n", i+1, s_dat, (uint16_t)s_dat, iTemp /1000, (iTemp%1000)/100, (iTemp%100)/10,iTemp%10); 
                } 
                else 
                { 
                 printf(" CH%d = %6d,0x%04X ( %d.%d%d%d V) \r\n", i+1, s_dat, s_dat , iTemp /1000, (iTemp%1000)/100, (iTemp%100)/10,iTemp%10);                     
                } 
        } 
 
} 
 
 
程序在Xcom上采样结果 
  
用的AD7606模块为矩阵科技的,3.3V供电 
查阅资料,得知正确空载情况下,8路采样结果如下: 
 CH1 =   6611,0x19D3 ( 2.017 V) 
 CH2=   6629,0x19E5 ( 2.023 V)   CH3=   6630,0x19E6 ( 2.023 V)   CH4=   6629,0x19E5 ( 2.023 V)   CH5=   6630,0x19E6 ( 2.023 V)   CH6=   6622,0x19DE ( 2.020 V)   CH7=   6619,0x19DB ( 2.020 V)   CH8=   6624,0x19E0 ( 2.021 V) 各位大佬帮忙看看,感谢  
 
 |   
 
 
 
 
 
 |