Advertisement
Guest User

Maple XAdc: xadc.cpp

a guest
May 27th, 2011
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.79 KB | None | 0 0
  1. #include "xadc.h"
  2.  
  3.  
  4. //switch on/off DMA, CONTINUOUS MODE, RIGHT ALIGN
  5. #define XADC_DMA_ON_FUN(dev) dev->regs->CR2 |= XADC_ENABLE_DMA; dev->regs->CR2 |=0x2; dev->regs->CR2 &= (0xfffff7ff)
  6. #define XADC_DMA_OFF_FUN(dev) dev->regs->CR2 |= XADC_DISABLE_DMA; dev->regs->CR2 |=(~0x2); dev->regs->CR2 &= (0xfffff7ff)
  7.  
  8. //switch SINGLE/DUAL mode for dev
  9. #define XADC_SINGLE_MODE_FUN(dev) dev->regs->CR1 &= 0xfff0ffff
  10. #define XADC_DUAL_MODE_FUN(dev) dev->regs->CR1 &= 0xfff6ffff
  11.  
  12. //does the above for ADC1 and ADC2
  13. #define XADC_DMA_ON() XADC_DMA_ON_FUN(ADC1);XADC_DMA_ON_FUN(ADC2)
  14. #define XADC_DMA_OFF() XADC_DMA_OFF_FUN(ADC1);XADC_DMA_OFF_FUN(ADC2)
  15.  
  16. #define XADC_SINGLE_MODE() XADC_SINGLE_MODE_FUN(ADC1);XADC_SINGLE_MODE_FUN(ADC2)
  17. #define XADC_DUAL_MODE() XADC_DUAL_MODE_FUN(ADC1);XADC_DUAL_MODE_FUN(ADC2)
  18.  
  19.  
  20. XAdc::XAdc() {
  21.     buffer=NULL;
  22.     size=0;
  23.     dual=Single;
  24.     blocking=Blocking;
  25.     pin1=0;
  26.     pin2=1;
  27. }
  28.  
  29.  
  30. //DMA
  31. void XAdc::setup_single_dma_transfer(uint16 samples){
  32.     dma_init(XADC_DMA_DEV);
  33.     dma_setup_transfer(XADC_DMA_DEV, XADC_DMA_CH,
  34.                        &ADC1->regs->DR, DMA_SIZE_16BITS,
  35.                        buffer,           DMA_SIZE_16BITS,
  36.                        (DMA_MINC_MODE | /*DMA_CIRC_MODE |*/ DMA_TRNS_ERR | DMA_TRNS_CMPLT
  37.                         ));
  38.     dma_set_num_transfers(XADC_DMA_DEV, XADC_DMA_CH, samples*sizeof(uint16));
  39.     dma_set_priority(XADC_DMA_DEV,XADC_DMA_CH,DMA_PRIORITY_VERY_HIGH);
  40.     dma_enable(XADC_DMA_DEV, XADC_DMA_CH);
  41.  
  42.     //set ADC for dma transfer
  43.     XADC_SINGLE_MODE();
  44.     XADC_DMA_ON();
  45. }
  46.  
  47. void XAdc::setup_dual_dma_transfer(uint16 samples){
  48.     dma_init(XADC_DMA_DEV);
  49.     dma_setup_transfer(XADC_DMA_DEV, XADC_DMA_CH,
  50.                        &ADC1->regs->DR, DMA_SIZE_32BITS,
  51.                        buffer,           DMA_SIZE_32BITS,
  52.                        (DMA_MINC_MODE | /*DMA_CIRC_MODE |*/ DMA_TRNS_ERR | DMA_TRNS_CMPLT
  53.                         ));
  54.     dma_set_num_transfers(XADC_DMA_DEV, XADC_DMA_CH, samples*sizeof(uint32));
  55.     dma_set_priority(XADC_DMA_DEV,XADC_DMA_CH,DMA_PRIORITY_VERY_HIGH);
  56.     dma_enable(XADC_DMA_DEV, XADC_DMA_CH);
  57.  
  58.     //set ADC for dma transfer
  59.     XADC_DUAL_MODE();
  60.     XADC_DMA_ON();
  61. }
  62.  
  63. void XAdc::stop_dma_transfer(){
  64.     XADC_DMA_OFF();
  65.     dma_disable(XADC_DMA_DEV,XADC_DMA_CH);
  66.  
  67. }
  68.  
  69. uint8 XAdc::is_transfer_finished() {
  70.     if(dma_get_isr_bits(XADC_DMA_DEV,XADC_DMA_CH)==0x07) {
  71.         result=dma_get_irq_cause(XADC_DMA_DEV,XADC_DMA_CH);//<--clears isr bits
  72.         return 1;
  73.     }
  74.     return 0;
  75. }
  76.  
  77. //Reading
  78.  
  79. uint8 XAdc::read(){
  80.     return read(1);
  81. }
  82.  
  83. uint8 XAdc::read ( uint16 samples ){
  84.    
  85.     if(dual) setup_dual_dma_transfer(samples);
  86.     else setup_single_dma_transfer(samples);
  87.  
  88.  
  89.     adc_set_reg_seqlen(ADC1, 1);
  90.     ADC1->regs->SQR3 = PIN_MAP[pin1].adc_channel;
  91.    
  92.     if(dual) {
  93.         //set up ADC2
  94.         adc_set_reg_seqlen(ADC2, 1);
  95.         ADC2->regs->SQR3 = PIN_MAP[pin2].adc_channel;
  96.     }
  97.     //start reading. ADC2 is slave, no need to start it
  98.     ADC1->regs->CR2 |= ADC_CR2_SWSTART;
  99.  
  100.     size=samples;
  101.     if (blocking) {
  102.         while(!is_transfer_finished());
  103.         stop_dma_transfer();
  104.         return (result==DMA_TRANSFER_COMPLETE);
  105.     }
  106.    
  107.     return 1;
  108. }
  109.  
  110. //OPTIONS
  111.  
  112. void XAdc::set_options ( uint8 pinA, uint8 pinB, uint8 dual, uint8 blocking, uint16* buffer ){
  113.     set_pins(pinA,pinB);
  114.     this->dual=dual;
  115.     this->blocking=blocking;
  116.     this->buffer=buffer;
  117. }
  118.  
  119. void XAdc::set_pin ( uint8 pinA ){
  120.     pin1=pinA;
  121.     pinMode(pin1,INPUT_ANALOG);
  122. }
  123.  
  124. void XAdc::set_pins( uint8 pinA, uint8 pinB ){
  125.     pin1=pinA;
  126.     pinMode(pin1,INPUT_ANALOG);
  127.     pin2=pinB;
  128.     pinMode(pin2,INPUT_ANALOG);
  129. }
  130.  
  131. void XAdc::set_blocking ( uint8 blocking ){
  132.     this->blocking=blocking;
  133. }
  134.  
  135. void XAdc::set_buffer ( uint16* buffer ){
  136.     this->buffer=buffer;
  137. }
  138.  
  139. void XAdc::set_dual ( uint8 dual ){
  140.     this->dual=dual;
  141. }
  142.  
  143. void XAdc::set_sample_rate ( adc_smp_rate smp_rate ){
  144.     adc_set_sample_rate(ADC1, smp_rate);
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement