/********************************************************************* * INCLUDES */ #include "bsp_adc.h" #include "system.h" #include "exception.h" /********************************************************************* * DEFINITIONS */ #define PIN_NOT_USED 0xFF #define CHANNEL_NOT_USED 0xFF /********************************************************************* * STRUCTION */ typedef struct { uint32_t pin; uint32_t channel; }adc_config_t; /********************************************************************* * LOCAL VARIABLES */ static adc_config_t m_adc_config[CHANNEL_MAX] = {{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED}}; static nrf_saadc_channel_config_t channelConfig[CHANNEL_MAX]; static nrf_saadc_value_t s_bufferPool[CHANNEL_MAX] = {0}; //定义SAADC采样数据缓存 //定义SAADC采样缓存数组大小 //只有采样结果存满该缓存之后,才会产生SAADC采样完成事件 static uint32_t sample_in_buffer = 0; static bsp_adc_sample_notify_cb m_cb = NULL; /********************************************************************* * LOCAL FUNCTIONS */ /** @brief ADC中断处理回调函数 @param 无 @return 无 */ static void adcCallbackFunc(nrf_drv_saadc_evt_t const *pEvent) { ret_code_t err_code; static int16_t adc_value[CHANNEL_MAX] = {0,0,0,0,0,0,0,0}; uint8_t adc_sort[CHANNEL_MAX] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; uint8_t sort_index = 0; int i; if(pEvent->type == NRF_DRV_SAADC_EVT_DONE) // 采样完成,采集时填充顺序为,通道编号小的先填充。 { //设置好缓存,为下一次采样做准备 err_code=nrf_drv_saadc_buffer_convert(pEvent->data.done.p_buffer,sample_in_buffer); if(err_code == NRF_SUCCESS) { //预先排序,采集时填充顺序为,通道编号小的先填充。 for(i=0;i 0) { // 缓冲配置 errCode = nrf_drv_saadc_buffer_convert(s_bufferPool, sample_in_buffer); if(errCode != NRF_SUCCESS)ret = -1; } if(ret == -1) { Process_Start(0,"bsp_adc_init_process",bsp_adc_init_process); } } /********************************************************************* * PUBLIC FUNCTIONS */ /** @brief 初始化ADC引脚和通道 @param pin -[in] 需要初始化的adc引脚 @param channel -[in] 需要初始化的adc通道 @return 错误代码 */ uint32_t ADC_SetPinChannel(uint32_t pin, uint32_t channel,nrf_gpio_pin_pull_t pin_pull) { ret_code_t errCode; //清除已存在的引脚和通道 ADC_RemovePinChannel(pin, channel); for(int i=0;i