CC2530 序列采样ADCCON2寄存器问题
时间:10-02
整理:3721RD
点击:
配置ADC序列采样不工作,使用IAR watch检查各寄存器设置,发现ADCCON2寄存器有问题,复位时ADCCON2值为00x16,我清零下ADCCON2 &=0x00,ADCCON2值变为0x06,再设置ADCCON2 |= 0x87,ADCCON2值为0x86,运行几次后寄存器值还会变化。为什么这个寄存器是这样?关键是我用裸机测试程序ADC_DMA时,ADCCON2也是这样,但是裸机程序是可以成功的,在协议栈中就不行,一直停在 while( !(DMAIRQ & HAL_DMA_CHANNEL_0)) ,就是DMAIRQ貌似一直为0。求解答,附配置程序。
//DMA配置 void dma_channel_init (DMA_DESC __xdata *dma_p,uint8 __xdata *dest_adr,uint8 lenl,uint8 trig) { // Setup DMA confiuration dma_p->SRCADDRH = (uint8)((uint16)(&X_ADCH) >> 8); dma_p->SRCADDRL = (uint8)((uint16)(&X_ADCH)); dma_p->DESTADDRH = (uint8)((uint16)(dest_adr) >> 8); dma_p->DESTADDRL = (uint8)((uint16)(dest_adr)); dma_p->VLEN = HAL_DMA_VLEN_FIXED; dma_p->LENH = 0; dma_p->LENL = lenl; // Tranfer Count dma_p->WORDSIZE = HAL_DMA_WORDSIZE_BYTE; dma_p->TMODE = HAL_DMA_TMODE_SINGLE; dma_p->TRIG = trig; // Channel trigger dma_p->SRCINC = HAL_DMA_SRCINC_0; dma_p->DESTINC = HAL_DMA_DSTINC_1; dma_p->IRQMASK = HAL_DMA_IRQMASK_DISABLE; dma_p->M8 = HAL_DMA_M8_USE_8_BITS; dma_p->PRIORITY = HAL_DMA_PRI_HIGH; //配置DMA 0 DMA0CFGL =((uint16)dma_p); DMA0CFGH =((uint16)dma_p >> 8); } /***************************************************************** 函数名称: 功能介绍:ADC_DMA初始化 参数描述:无 返回值:无 */ void intsystem(void) { P0SEL |= adChannel; P0DIR &= ~adChannel; ADCCFG |= adChannel; // Configure DMA channel 0 dma_channel_init(dma_channel, adc_data, adChannelNum, HAL_DMA_TRIG_ADC_CHALL); //ad序列化采样配置 ADCCON2 =0x00; ADCCON2 =(HAL_ADC_REF_AVDD|HAL_ADC_RESOLUTION_8|HAL_ADC_CHN_AIN7);//0x87 //选择 触发源 ADCCON1 = ADCCON1_STSEL; }
/***************************************************************** 函数名称: 功能介绍:启动AD序列转换 参数描述:无 返回值:无 */ void halADSeqStart(void) { //启动MDA0通道 DMAARM |= (HAL_DMA_CHANNEL_0); asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP"); ADCCON1 |= ADCCON1_ST; //等待采样完成 while( !(DMAIRQ & HAL_DMA_CHANNEL_0)); //clear interrupt flag DMAIRQ &= ~HAL_DMA_CHANNEL_0; for(i=0 ; i< 4 ; i++) { if(adc_data[i] & 0x80) adc_data[i] = 0; temp[i]= adc_data[i]; } if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc, SAMPLEAPP_ADC_CLUSTERID,//自己定义一个 5, // 数据长度 temp, //数据内容 &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) { HalLedSet (HAL_LED_2, HAL_LED_MODE_TOGGLE); } else { // Error occurred in request to send. } Onboard_wait(2000); }
协议栈里面有定义DMA和ADC的驱动函数,直接调用会有问题吗?