初级会员

- 积分
- 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) 各位大佬帮忙看看,感谢
|
|