/* *Copyright (C),2023 , NANOCHAP *File name: ENS1_ADC.C *Author: *Version: V1.0 *Date: 2023-11- *Description: *Function List: History: 1.V1.0 Date: Author: Modification: ���� */ #include "ENS1_ADC.h" #include "ENS1_GPIO.h" #include "ENS1_CLOCK.h" #include "ENS1_ANAC.h" /* һ���Ĵ���˵���� ADC���ã�ת��ģʽ ���ݸ���ģʽ �ȴ�ģʽ ADC���ƣ� ADCʹ�� �� ADC���� ADC�ж�ʹ�ܣ� EOC�ж�ʹ�� ���ݸ����ж�ʹ�� ADC�ж�״̬�� EOC�жϷ��� ���ݸ����жϷ��� ADC״̬ �� EOC��־ ADC���л�æ״̬ ADCʱ�ӷ�Ƶ ����Ƶֵ 2 4 6 8 10 12 16 32 ADC����ʱ�� ��ADC����ʱ��ʱ���� 2 3 4 5 ADC���ݣ� ADCͨ��ѡ�� �� ADCEOC���� ��������ģʽ�� �� �Ƿ��ڽ��յ�EOC��־�����´�ת�� */ /* ��������ת��ģʽ *ADC�������� ��ADC_START λ��0 �����յ�EOC����EOC_WAIT_COUNT_DONE �� ������һ���ȵ��� *���ֱ��EOC_WAIT_COUNT_DONE ��û�н��յ�EOC �����ݽ����ᱻ���� *ADC��ֹͣת����ͨ���û�����ADC_CTRL_REG �� ADC_EN λ Ϊ1 *����ڲ�����ת���ڼ䣬ADC_EN λ��Ϊ0 ����������������ڽ��е�ת����Ȼ����� EOC/EOC_WAIT_COUNT_DONE ֹͣת�� *���ݻ���EOC ��������� ADC����ת�����̣� 1�����õ���ת�����޵ȴ�ģʽ�� 2������ADC_CONFIG_reg bit0 = 0 bit2 = 0 3������ת������ 4��ת�������� ���ݱ�����ADC_Data register 5��һ��ADC_EOC_IE�ж����ɣ� 6�����ʹ���� IER�Ĵ����� EOC_INT_EN ��OVER_RUN_INT_EN λ����ϵͳ�����ж� 7��Ӳ��ֹͣADC */ /*��������ת��ģʽ 1������ADC_CONFIG_reg bit0 = 1 2������λ��1 ADC_EN bit and ADC_START bits 3����ÿ��ת�����֮�󣬻���adc_eoc_config_regsiter[0] �����´�ת���� ���Adc_eoc_config_register[0] =1 �� ����յ�EOC��ʼ�´�ת�� ���ݱ��浽�Ĵ����� 4��ADC_EOC_IE �ж����� 5�����ʹ���� IER�Ĵ����� EOC_INT_EN ��OVER_RUN_INT_EN λ����ϵͳ�����ж� ע�⣺ADC_eoc_config_reg�Ĵ�����������������-�ǵȴ�ģʽ����Ч ����0������ģʽ������EOC����ʼ������һ��ת�� 1������ģʽ���յ�EOC��ʼ������һ��ת�� ����������-�ȴ�ģʽ�£�ADC_eoc_config_regӦ�ñ�����Ϊ0 ������ */ /*�ġ��ȴ�ģʽ 1������ADC_CONFIG_reg bit2 = 1 ��ʹ�ܵȴ�ģʽ�� 2����������ת�� 3����ת����ɺ� ��ADC���ݵ���Ӧ�Ĵ����� ADC_EOC_IE �ж����� ���ʹ���� IER�Ĵ����� EOC_INT_EN ��OVER_RUN_INT_EN λ����ϵͳ�����ж� 4��ADC���������뵽ADC_WAIT �ȴ�״ֱ̬��EOC�жϱ���� ���� ADC���ݱ�ϵͳ���� 5��һ��EOC�жϱ������ADC��ʼ��һ�ε�ת�� */ /*�塢���������� 1����ADC���������յ�EOC�����ݽ������� 2����� OVERRUNģʽ��ʹ�ܣ��µ�ת�����ݽ��ᱻ���� ���� overrun ����״̬��� ע�⣺ ���overrun ģʽû�б�ʹ�ܣ� �µĻ��߾ɵ�ת�����ݽ�����overrun ����״̬ѡ�������� ���� ���overrun �����������ݽ����ᱻ���� ���û��overrun �������������ݽ������� */ /*�����ж�˵�� 1�����յ�EOC�� EOC_IR ���� 2��OVERRUN��������OVERRUN_IR ���� 3��EOC_IR ��overrun ��ΪADC�жϱ� ͨ����ϵͳ ��ϵͳͨ�� data_reg ��ȡ��adc���ݺ� EOC_IR �� EOC_IR_CLEAR ��� */ /*overrun ���� �˴���ָ���ǣ� ADC��������ϵͳ��ȡ��ADC����ǰ�����������һ��EOC_IRǰ�������յ��µ�EOC */ volatile uint8_t ADC_READ_STATUS = ADC_READ_DATA_IS_WAITING; uint8_t ADC_UART_BYTE_LOW = 0; uint8_t ADC_UART_BYTE_HIGH = 0; uint8_t ENS1_ADCCLKConfig(uint8_t ADC_CLK_div) { CMSDK_ADC->ADC_CLK_DIV = ((CMSDK_ADC->ADC_CLK_DIV &~ (0x7)) | (ADC_CLK_div)); return 0; } /* ENS_ADC_COV_MODE COV_MODE ENS_ADC_OVERRUN_MODE OVERRUN_MODE WAIT_MODE WAITorNOT */ uint8_t ENS1_ADC_CONFIG(ENS_ADC_SEL channelx , uint8_t MODE_SEL, ENS_ADC_COV_INC_EOC EOC_CONFIG , uint8_t SIMLING_TIME, uint8_t INT_MODE_SEL) { NVIC_ClearPendingIRQ(ADC_IRQn); NVIC_DisableIRQ(ADC_IRQn); if(channelx == ENS1_ADC_CHANNEL1) { CMSDK_GPIO->ALTFH = (CMSDK_GPIO->ALTFH &~ (0x03<<10))|(0x03<<10); CMSDK_GPIO->ANAEN |= (1 << 21); CMSDK_ADC->ADC_CH_SEL &=~ (0x7); CMSDK_ADC->ADC_CH_SEL = 1; } else if(channelx == ENS1_ADC_CHANNEL2) { CMSDK_GPIO->ALTFH = (CMSDK_GPIO->ALTFH &~ (0x03<<12))|(0x03<<12); CMSDK_GPIO->ANAEN |= (1 << 22); CMSDK_ADC->ADC_CH_SEL &=~ (0x7); CMSDK_ADC->ADC_CH_SEL = 2; } else if(channelx == ENS1_ADC_CHANNEL3) { CMSDK_GPIO->ALTFH = (CMSDK_GPIO->ALTFH &~ (0x03<<14))|(0x03<<14); CMSDK_GPIO->ANAEN |= (1 << 23); CMSDK_ADC->ADC_CH_SEL &=~ (0x7); CMSDK_ADC->ADC_CH_SEL = 3; } else { CMSDK_ADC->ADC_CH_SEL &=~ (0x7); CMSDK_ADC->ADC_CH_SEL = 0; } CMSDK_ADC->ADC_CONFG =(CMSDK_ADC->ADC_CONFG &~ 0x7 )| MODE_SEL; CMSDK_ADC->ADC_SAMP_TIME = (CMSDK_ADC->ADC_SAMP_TIME &~ 0x3) | SIMLING_TIME; //����ADC_eoc_config_reg�Ĵ���������������������-�ǵȴ�ģʽ����Ч�� if( ((MODE_SEL & 0X1 )== 1 ) && (MODE_SEL & 0X4) == 0) { CMSDK_ADC->ADC_EOC_CONFG = (CMSDK_ADC->ADC_EOC_CONFG &~ (0x1)) | EOC_CONFIG; } //�ж�ʹ�� CMSDK_ADC->ADC_IER = (CMSDK_ADC->ADC_IER &~ (0x3)) | ( INT_MODE_SEL ); return CMSDK_ADC->ADC_CONFG; } uint8_t ENS1_ADC_START(ENS_ADC_SEL channelx ) { CMSDK_ADC->ADC_CTRL |= (1) |(1<<8); if(CMSDK_ADC->ADC_IER != 0) { NVIC_EnableIRQ(ADC_IRQn); } return 0; } uint8_t ENS1_ADC_STOP(ENS_ADC_SEL channelx) { CMSDK_ADC->ADC_CTRL &=~ (1); NVIC_DisableIRQ(ADC_IRQn); return 0; } //������ȡ���� //ADC�ڲ�ͬģʽ���в�ͬ�IJɼ���ʽ������Adc_config_register�����ò�ͬ����8��ģʽ uint16_t save_data; uint8_t ADC_CONFIG_READ; //�˺���δ��ɣ�����ʹ�������ɼ�+�ж�ģʽ���˺�����ʱ�ò��� uint16_t ADC_READ_DATA(void) { ADC_CONFIG_READ = CMSDK_ADC->ADC_CONFG; switch(ADC_CONFIG_READ & 0x7) { case single_mode_without_overrun_without_wait : while(ADC_READ_STATUS == ADC_READ_DATA_IS_WAITING); //�ȴ����ж���EOC�ĵ��� ADC_READ_STATUS = ADC_READ_DATA_IS_WAITING; //�жϷ������Ѿ���ADC�������ˣ���ʱ�ٽ�״̬�л����ȴ���һ������ break; case continious_mode_without_overrun_without_wait : break; case single_mode_with_overrun_without_wait : break; case continious_mode_with_overrun_without_wait : break; case single_mode_without_overrun_with_wait : break; case Continious_mode_without_overun_with_wait : break; case single_mode_with_overrun_with_wait : break; case continious_mode_with_overrun_with_wait : break; } return (uint16_t)save_data; } //ADC interrupt handler void ADC_Handler(void) __irq { if((CMSDK_ADC->ADC_ISR & 0x01) == 0x01) //���յ�EOC { CMSDK_ADC->ADC_INT_CLR = (0x01<<0); ADC_READ_STATUS = ADC_READ_DATA_IS_READY; save_data = (CMSDK_ADC->ADC_DATA & 0x0fff); //�������ݺ󣬿��Խ�����һ�βɼ� ADC_UART_BYTE_LOW = save_data&0xff; ADC_UART_BYTE_HIGH = (save_data&0x0f00)>>8; } if(((CMSDK_ADC->ADC_ISR & 0x02)>>1) == 0x01) //overrun error { CMSDK_ADC->ADC_INT_CLR = (0x01<<1); } }