⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msp430adc12implp.nc

📁 tinyos2.0版本驱动
💻 NC
📖 第 1 页 / 共 2 页
字号:
  }  async command error_t SingleChannel.configureMultipleRepeat[uint8_t id](      const msp430adc12_channel_config_t *config,      uint16_t *buf, uint8_t length, uint16_t jiffies)  {    error_t result = ERESERVE;#ifdef ADC12_CHECK_ARGS    if (!config || !buf || !length || length > 16 || jiffies == 1 || jiffies == 2)      return EINVAL;#endif    atomic {      if (state & ADC_BUSY)        return EBUSY;      if (call ADCArbiterInfo.userId() == id){        adc12ctl1_t ctl1 = {          adc12busy: 0,          conseq: 3,          adc12ssel: config->adc12ssel,          adc12div: config->adc12div,          issh: 0,          shp: 1,          shs: (jiffies == 0) ? 0 : 1,          cstartadd: 0        };        adc12memctl_t memctl = {          inch: config->inch,          sref: config->sref,          eos: 0        };                uint16_t i, mask = 1;        adc12ctl0_t ctl0 = call HplAdc12.getCtl0();        ctl0.msc = (jiffies == 0) ? 1 : 0;        ctl0.sht0 = config->sht;        ctl0.sht1 = config->sht;        state = MULTIPLE_DATA_REPEAT;        resultBuffer = buf;        resultBufferLength = length;        resultBufferIndex = 0;                            call HplAdc12.setCtl0(ctl0);        call HplAdc12.setCtl1(ctl1);        for (i=0; i<(length-1) && i < 15; i++)          call HplAdc12.setMCtl(i, memctl);        memctl.eos = 1;          call HplAdc12.setMCtl(i, memctl);        call HplAdc12.setIEFlags(mask << i);                        if (jiffies){          state |= USE_TIMERA;          prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id);        }        result = SUCCESS;      }    }    return result;  }  async command error_t SingleChannel.getData[uint8_t id]()  {    atomic {      if (call ADCArbiterInfo.userId() == id){        if (state & MULTIPLE_DATA_REPEAT && !resultBuffer)          return EINVAL;        if (state & ADC_BUSY)          return EBUSY;        state |= ADC_BUSY;        clientID = id;        configureAdcPin((call HplAdc12.getMCtl(0)).inch);        call HplAdc12.startConversion();        if (state & USE_TIMERA)          startTimerA();         return SUCCESS;      }    }    return FAIL;  }  async command error_t MultiChannel.configure[uint8_t id](      const msp430adc12_channel_config_t *config,      adc12memctl_t *memctl, uint8_t numMemctl, uint16_t *buf,       uint16_t numSamples, uint16_t jiffies)  {    error_t result = ERESERVE;#ifdef ADC12_CHECK_ARGS    if (!config || !memctl || !numMemctl || numMemctl > 15 || !numSamples ||         !buf || jiffies == 1 || jiffies == 2 || numSamples % (numMemctl+1) != 0)      return EINVAL;#endif    atomic {      if (state & ADC_BUSY)        return EBUSY;      if (call ADCArbiterInfo.userId() == id){        adc12ctl1_t ctl1 = {          adc12busy: 0,          conseq: (numSamples > numMemctl+1) ? 3 : 1,           adc12ssel: config->adc12ssel,          adc12div: config->adc12div,          issh: 0,          shp: 1,          shs: (jiffies == 0) ? 0 : 1,          cstartadd: 0        };        adc12memctl_t firstMemctl = {          inch: config->inch,          sref: config->sref,          eos: 0        };             uint16_t i, mask = 1;        adc12ctl0_t ctl0 = call HplAdc12.getCtl0();        ctl0.msc = (jiffies == 0) ? 1 : 0;        ctl0.sht0 = config->sht;        ctl0.sht1 = config->sht;        state = MULTI_CHANNEL;        resultBuffer = buf;        resultBufferLength = numSamples;        resultBufferIndex = 0;        numChannels = numMemctl+1;        call HplAdc12.setCtl0(ctl0);        call HplAdc12.setCtl1(ctl1);        call HplAdc12.setMCtl(0, firstMemctl);        for (i=0; i<(numMemctl-1) && i < 14; i++){          memctl[i].eos = 0;          call HplAdc12.setMCtl(i+1, memctl[i]);        }        memctl[i].eos = 1;        call HplAdc12.setMCtl(i+1, memctl[i]);        call HplAdc12.setIEFlags(mask << (i+1));                        if (jiffies){          state |= USE_TIMERA;          prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id);        }        result = SUCCESS;      }          }    return result;  }  async command error_t MultiChannel.getData[uint8_t id]()  {    uint8_t i;    atomic {      if (call ADCArbiterInfo.userId() == id){        if (!resultBuffer)          return EINVAL;        if (state & ADC_BUSY)          return EBUSY;        state |= ADC_BUSY;        clientID = id;        for (i=0; i<numChannels; i++)          configureAdcPin((call HplAdc12.getMCtl(i)).inch);        call HplAdc12.startConversion();        if (state & USE_TIMERA)          startTimerA();         return SUCCESS;      }    }    return FAIL;  }    void stopConversion()  {    uint8_t i;#ifdef ADC12_TIMERA_ENABLED    if (state & USE_TIMERA)      call TimerA.setMode(MSP430TIMER_STOP_MODE);#endif    resetAdcPin( (call HplAdc12.getMCtl(0)).inch );    if (state & MULTI_CHANNEL){      for (i=1; i<numChannels; i++)        resetAdcPin( (call HplAdc12.getMCtl(i)).inch );    }    atomic {      call HplAdc12.stopConversion();      call HplAdc12.resetIFGs();       state &= ~ADC_BUSY;    }  }  async command error_t DMAExtension.start[uint8_t id]()  {     atomic {      if (call ADCArbiterInfo.userId() == id){        call HplAdc12.setIEFlags(0);        call HplAdc12.resetIFGs();        return SUCCESS;      }    }    return FAIL;  }    async command error_t DMAExtension.stop[uint8_t id]()  {    stopConversion();    return SUCCESS;  }    async event void TimerA.overflow(){}  async event void CompareA0.fired(){}  async event void CompareA1.fired(){}  async event void HplAdc12.conversionDone(uint16_t iv)  {    bool overflow = FALSE;    if (iv <= 4){ // check for overflow      if (iv == 2)        signal Overflow.memOverflow[clientID]();      else        signal Overflow.conversionTimeOverflow[clientID]();      // only if the client didn't ask for data as fast as possible (jiffies was not zero)      if (!(call HplAdc12.getCtl0()).msc)        overflow = TRUE;    }    switch (state & CONVERSION_MODE_MASK)     {       case SINGLE_DATA:        stopConversion();        signal SingleChannel.singleDataReady[clientID](call HplAdc12.getMem(0));        break;      case SINGLE_DATA_REPEAT:        {          error_t repeatContinue;          repeatContinue = signal SingleChannel.singleDataReady[clientID](                call HplAdc12.getMem(0));          if (repeatContinue != SUCCESS)            stopConversion();          break;        }#ifndef ADC12_ONLY_WITH_DMA      case MULTI_CHANNEL:        {          uint16_t i = 0, k;          resultBufferStart = resultBuffer;          do {            *resultBuffer++ = call HplAdc12.getMem(i);          } while (++i < numChannels);          resultBufferIndex += numChannels;          if (overflow || resultBufferLength == resultBufferIndex){            stopConversion();            resultBuffer -= resultBufferIndex;            k = resultBufferIndex - numChannels;            resultBufferIndex = 0;            signal MultiChannel.dataReady[clientID](resultBuffer,                 overflow ? k : resultBufferLength);          } else call HplAdc12.enableConversion();        }        break;      case MULTIPLE_DATA:        {          uint16_t i = 0, length, k;          resultBufferStart = resultBuffer;          if (resultBufferLength - resultBufferIndex > 16)             length = 16;          else            length = resultBufferLength - resultBufferIndex;          do {            *resultBuffer++ = call HplAdc12.getMem(i);          } while (++i < length);          resultBufferIndex += length;          if (overflow || resultBufferLength == resultBufferIndex){            stopConversion();            resultBuffer -= resultBufferIndex;            k = resultBufferIndex - length;            resultBufferIndex = 0;            signal SingleChannel.multipleDataReady[clientID](resultBuffer,               overflow ? k : resultBufferLength);          } else if (resultBufferLength - resultBufferIndex > 15)            return;          else {            // last sequence < 16 samples            adc12memctl_t memctl = call HplAdc12.getMCtl(0);            memctl.eos = 1;            call HplAdc12.setMCtl(resultBufferLength - resultBufferIndex, memctl);          }        }        break;      case MULTIPLE_DATA_REPEAT:        {          uint8_t i = 0;          resultBufferStart = resultBuffer;          do {            *resultBuffer++ = call HplAdc12.getMem(i);          } while (++i < resultBufferLength);                    resultBuffer = signal SingleChannel.multipleDataReady[clientID](              resultBuffer-resultBufferLength,              overflow ? 0 : resultBufferLength);          if (!resultBuffer)              stopConversion();          break;        }#endif      } // switch  }  default async event error_t SingleChannel.singleDataReady[uint8_t id](uint16_t data)  {    return FAIL;  }     default async event uint16_t* SingleChannel.multipleDataReady[uint8_t id](      uint16_t *buf, uint16_t length)  {    return 0;  }     default async event void MultiChannel.dataReady[uint8_t id](uint16_t *buffer, uint16_t numSamples) {};    default async event void Overflow.memOverflow[uint8_t id](){}  default async event void Overflow.conversionTimeOverflow[uint8_t id](){}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -