Browse Source

Updated to get A12/A13 operational

teensy4-core
Mike S 5 years ago
parent
commit
f1d5821f62
2 changed files with 69 additions and 24 deletions
  1. +60
    -16
      teensy4/analog.c
  2. +9
    -8
      teensy4/pins_arduino.h

+ 60
- 16
teensy4/analog.c View File

0, // 7/A7 AD_B1_11 0, // 7/A7 AD_B1_11
13, // 8/A8 AD_B1_08 13, // 8/A8 AD_B1_08
14, // 9/A9 AD_B1_09 14, // 9/A9 AD_B1_09
#if 0
128, // 10 128, // 10
128, // 11 128, // 11
128, // 12 128, // 12
128, // 13 128, // 13
#else
1, // 24/A10 AD_B0_12
2, // 25/A11 AD_B0_13
128+3, // 26/A12 AD_B1_14 - only on ADC2, 3
128+4, // 27/A13 AD_B1_15 - only on ADC2, 4
#endif
7, // 14/A0 AD_B1_02 7, // 14/A0 AD_B1_02
8, // 15/A1 AD_B1_03 8, // 15/A1 AD_B1_03
12, // 16/A2 AD_B1_07 12, // 16/A2 AD_B1_07
13, // 22/A8 AD_B1_08 13, // 22/A8 AD_B1_08
14, // 23/A9 AD_B1_09 14, // 23/A9 AD_B1_09
1, // 24/A10 AD_B0_12 1, // 24/A10 AD_B0_12
2 // 25/A11 AD_B0_13
// 26/A12 AD_B1_14 - only on ADC2
// 27/A13 AD_B1_15 - only on ADC2
2, // 25/A11 AD_B0_13
128+3, // 26/A12 AD_B1_14 - only on ADC2, 3
128+4 // 27/A13 AD_B1_15 - only on ADC2, 4
}; };




static void wait_for_cal(void) static void wait_for_cal(void)
{ {
printf("wait_for_cal\n");
//printf("wait_for_cal\n");
while (ADC1_GC & ADC_GC_CAL) ; while (ADC1_GC & ADC_GC_CAL) ;
// TODO: check CALF, but what do to about CAL failure? // TODO: check CALF, but what do to about CAL failure?
calibrating = 0; calibrating = 0;
printf("cal complete\n");
//printf("cal complete\n");
} }




if (pin > sizeof(pin_to_channel)) return 0; if (pin > sizeof(pin_to_channel)) return 0;
if (calibrating) wait_for_cal(); if (calibrating) wait_for_cal();
uint8_t ch = pin_to_channel[pin]; uint8_t ch = pin_to_channel[pin];
if (ch > 15) return 0;
ADC1_HC0 = ch;
while (!(ADC1_HS & ADC_HS_COCO0)) ; // wait
return ADC1_R0;
// printf("%d\n", ch);
// if (ch > 15) return 0;
if(!(ch & 0x80)) {
ADC1_HC0 = ch;
while (!(ADC1_HS & ADC_HS_COCO0)) ; // wait
return ADC1_R0;
} else {
ADC2_HC0 = ch & 0x7f;
while (!(ADC2_HS & ADC_HS_COCO0)) ; // wait
return ADC2_R0;
}
} }


void analogReference(uint8_t type) void analogReference(uint8_t type)


tmp32 |= mode; tmp32 |= mode;
ADC1_CFG = tmp32; ADC1_CFG = tmp32;
tmp32 = (ADC2_CFG & (0xFFFFFC00));
tmp32 |= (ADC2_CFG & (0x03)); // ADICLK
tmp32 |= (ADC2_CFG & (0xE0)); // ADIV & ADLPC

tmp32 |= mode;
ADC2_CFG = tmp32;
} }


void analogReadAveraging(unsigned int num) void analogReadAveraging(unsigned int num)
{ {
uint32_t mode;
uint32_t mode, mode1;
//disable averaging
//disable averaging, ADC1 and ADC2
ADC1_GC &= ~0x20; ADC1_GC &= ~0x20;
mode = ADC1_CFG & ~0xC000; mode = ADC1_CFG & ~0xC000;

ADC2_GC &= ~0x20;
mode1 = ADC2_CFG & ~0xC000;
if (num >= 32) { if (num >= 32) {
mode |= ADC_CFG_AVGS(3); mode |= ADC_CFG_AVGS(3);
mode1 |= ADC_CFG_AVGS(3);

} else if (num >= 16) { } else if (num >= 16) {
mode |= ADC_CFG_AVGS(2); mode |= ADC_CFG_AVGS(2);
mode1 |= ADC_CFG_AVGS(2);

} else if (num >= 8) { } else if (num >= 8) {
mode |= ADC_CFG_AVGS(1); mode |= ADC_CFG_AVGS(1);
mode1 |= ADC_CFG_AVGS(1);

} else if (num >= 4) { } else if (num >= 4) {
mode |= ADC_CFG_AVGS(0); mode |= ADC_CFG_AVGS(0);
mode1 |= ADC_CFG_AVGS(0);

} else { } else {
mode |= 0; mode |= 0;
mode1 |= 0;
} }


ADC1_CFG |= mode; ADC1_CFG |= mode;

if(num >= 4)
ADC2_CFG |= mode1;
if(num >= 4){
ADC1_GC |= ADC_GC_AVGE;// turns on averaging ADC1_GC |= ADC_GC_AVGE;// turns on averaging
ADC2_GC |= ADC_GC_AVGE;// turns on averaging
}
} }


#define MAX_ADC_CLOCK 20000000 #define MAX_ADC_CLOCK 20000000
printf("analogInit\n"); printf("analogInit\n");


CCM_CCGR1 |= CCM_CCGR1_ADC1(CCM_CCGR_ON); CCM_CCGR1 |= CCM_CCGR1_ADC1(CCM_CCGR_ON);

CCM_CCGR1 |= CCM_CCGR1_ADC2(CCM_CCGR_ON);
if (analog_config_bits == 8) { if (analog_config_bits == 8) {
// 8 bit conversion (17 clocks) plus 8 clocks for input settling // 8 bit conversion (17 clocks) plus 8 clocks for input settling
mode = ADC_CFG_MODE(0) | ADC_CFG_ADSTS(3); mode = ADC_CFG_MODE(0) | ADC_CFG_ADSTS(3);
mode |= ADC_CFG_ADIV(0) | ADC_CFG_ADICLK(0); // use IPG mode |= ADC_CFG_ADIV(0) | ADC_CFG_ADICLK(0); // use IPG
} }
#endif #endif
//ADC1
ADC1_CFG = mode | ADC_HC_AIEN | ADC_CFG_ADHSC; ADC1_CFG = mode | ADC_HC_AIEN | ADC_CFG_ADHSC;
ADC1_GC = avg | ADC_GC_CAL; // begin cal ADC1_GC = avg | ADC_GC_CAL; // begin cal
calibrating = 1; calibrating = 1;
while (ADC1_GC & ADC_GC_CAL) ;
calibrating = 0;
//ADC2
ADC2_CFG = mode | ADC_HC_AIEN | ADC_CFG_ADHSC;
ADC2_GC = avg | ADC_GC_CAL; // begin cal
calibrating = 1;
while (ADC1_GC & ADC_GC_CAL) ;
calibrating = 0;
} }





+ 9
- 8
teensy4/pins_arduino.h View File

#define PIN_A7 (21) #define PIN_A7 (21)
#define PIN_A8 (22) #define PIN_A8 (22)
#define PIN_A9 (23) #define PIN_A9 (23)
#define PIN_A10 (24)
#define PIN_A11 (25)
#define PIN_A12 (26)
#define PIN_A13 (27)
const static uint8_t A0 = PIN_A0; const static uint8_t A0 = PIN_A0;
const static uint8_t A1 = PIN_A1; const static uint8_t A1 = PIN_A1;
const static uint8_t A2 = PIN_A2; const static uint8_t A2 = PIN_A2;
const static uint8_t A7 = PIN_A7; const static uint8_t A7 = PIN_A7;
const static uint8_t A8 = PIN_A8; const static uint8_t A8 = PIN_A8;
const static uint8_t A9 = PIN_A9; const static uint8_t A9 = PIN_A9;

#if defined(__IMXRT1052__)
#define PIN_A10 (24)
#define PIN_A11 (25)
const static uint8_t A10 = PIN_A10; const static uint8_t A10 = PIN_A10;
const static uint8_t A11 = PIN_A11; const static uint8_t A11 = PIN_A11;
#endif
const static uint8_t A12 = PIN_A12;
const static uint8_t A13 = PIN_A13;


#define LED_BUILTIN (13) #define LED_BUILTIN (13)






#define NUM_DIGITAL_PINS 40 #define NUM_DIGITAL_PINS 40
#define NUM_ANALOG_INPUTS 12
#define NUM_ANALOG_INPUTS 14




#define NOT_AN_INTERRUPT -1 #define NOT_AN_INTERRUPT -1




#if defined(__IMXRT1052__)
#define analogInputToDigitalPin(p) (((p) <= 9) ? (p) + 14 : (((p) >= 14 && (p) <= 25) ? (p) : -1))
#if defined(__IMXRT1052__) || defined(__IMXRT1062__)
#define analogInputToDigitalPin(p) (((p) <= 9) ? (p) + 14 : (((p) >= 14 && (p) <= 27) ? (p) : -1))
#define digitalPinHasPWM(p) ((p) <= 15 || (p) == 18 || (p) == 19 || ((p) >= 22 && (p) <= 25) || ((p) >= 28 && (p) <= 31) || (p) == 33) #define digitalPinHasPWM(p) ((p) <= 15 || (p) == 18 || (p) == 19 || ((p) >= 22 && (p) <= 25) || ((p) >= 28 && (p) <= 31) || (p) == 33)
#define digitalPinToInterrupt(p) ((p) < NUM_DIGITAL_PINS ? (p) : -1) #define digitalPinToInterrupt(p) ((p) < NUM_DIGITAL_PINS ? (p) : -1)
#endif #endif

Loading…
Cancel
Save