Hello,
I am using a Teensy 4.0 to read a 10bit ADC. I am using pins AD_B1_00 to AD_B1_11(AD_B1_04 and AD_B1_05 are not available on Teensy 4.0) as data inputs.
I am reading the ADC in assembler for maximum speed.
I am having trouble setting up pin 16 as an input. I can set up all the other pins but pin 16 seems to stay as an output.
The code below is a test. I have used it to test the pins individually. I have also used a new Teensy 4.1 with the same result.
GPIO6_DR = 0x42000000
GPIO6_GDIR = 4
GPIO7_DR = 0x42004000
GPIO7_GDIR = 4
IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_00 = 0x401F813C
IOMUXC_SW_PAD_CTL_PAD_GPIO_B0_00 = 0x401F832C
IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_00 = 0x401F80FC
IOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_00 = 0x401F82EC
B0_00 = 0
B0_01 = 4
B0_02 = 8
AD_B1_00 = 0
AD_B1_01 = 4
AD_B1_02 = 8
AD_B1_03 = 12
AD_B1_04 = 16
AD_B1_05 = 20
AD_B1_06 = 24
AD_B1_07 = 28
AD_B1_08 = 32
AD_B1_09 = 36
AD_B1_10 = 40
AD_B1_11 = 44
IOMUXC_GPR_GPR26 = 0x400AC068
IOMUXC_GPR_GPR27 = 0x400AC06C
ARM_DWT_CYCCNT = 0xE0001004
.global ASMprog
.syntax unified
.cpu cortex-m7
.type ASMprog,%function
.align 4
ASMprog:
.fnstart
push {r2-r12,lr}
// Select GPIO function on pin 10,11,12 (5 selects GPIO mode)
ldr r1,=IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_00
///////////5432109876543210 31-5 NU, 4 SION, 3-0 MUX_MODE
movw r0,#0b0000000000000101//ALT5 mux port:GPIO2_IO00 of instance: gpio2
str r0,[r1,#B0_00] //Pin 10 ALT5 mux port:GPIO2_IO00
str r0,[r1,#B0_02] //Pin 11 ALT5 mux port:GPIO2_IO02
str r0,[r1,#B0_01] //Pin 12 ALT5 mux port:GPIO2_IO01
// Select GPIO function on pin 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 (5 selects GPIO mode)
ldr r1,=IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_00
///////////5432109876543210 31-5 NU, 4 SION, 3-0 MUX_MODE
movw r0,#0b0000000000000101//ALT5 mux port:GPIO1_IO16 of instance: gpio1
str r0,[r1,#AD_B1_00] //Pin 19 ALT5 mux port:GPIO1_IO16
str r0,[r1,#AD_B1_01] //Pin 18 ALT5 mux port:GPIO1_IO17
str r0,[r1,#AD_B1_02] //Pin 14 ALT5 mux port:GPIO1_IO18
str r0,[r1,#AD_B1_03] //Pin 15 ALT5 mux port:GPIO1_IO19
str r0,[r1,#AD_B1_06] //Pin 17 ALT5 mux port:GPIO1_IO22
str r0,[r1,#AD_B1_07] //Pin 16 ALT5 mux port:GPIO1_IO23
str r0,[r1,#AD_B1_08] //Pin 22 ALT5 mux port:GPIO1_IO24
str r0,[r1,#AD_B1_09] //Pin 23 ALT5 mux port:GPIO1_IO25
str r0,[r1,#AD_B1_10] //Pin 20 ALT5 mux port:GPIO1_IO26
str r0,[r1,#AD_B1_11] //Pin 21 ALT5 mux port:GPIO1_IO27
// Optimise for 100MHz range, 34-23 Ohm o/p resistance @ 3.3V, Fast slew rate
ldr r1,=IOMUXC_SW_PAD_CTL_PAD_GPIO_B0_00
///////////10987654321098765432109876543210 31-17 NU, 16 HYS 15-14 PUS, 13 PUE, 12 PKE, 11 ODE, 10-8 NU, 7-6 SPEED, 5-3 DSE, 2-1 NU 0 SRE
ldr r0,=#0b00000000000000000001000010111001
str r0,[r1,#B0_00] //Pin 10
str r0,[r1,#B0_02] //Pin 11
str r0,[r1,#B0_01] //Pin 12
// Optimise for 100MHz range, 34-23 Ohm o/p resistance @ 3.3V, Fast slew rate
ldr r1,=IOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_00
///////////10987654321098765432109876543210 31-17 NU, 16 HYS 15-14 PUS, 13 PUE, 12 PKE, 11 ODE, 10-8 NU, 7-6 SPEED, 5-3 DSE, 2-1 NU 0 SRE
ldr r0,=#0b00000000000000000001000010111001
str r0,[r1,#AD_B1_00] //Pin 19 ALT5 mux port:GPIO1_IO16
str r0,[r1,#AD_B1_01] //Pin 18 ALT5 mux port:GPIO1_IO17
str r0,[r1,#AD_B1_02] //Pin 14 ALT5 mux port:GPIO1_IO18
str r0,[r1,#AD_B1_03] //Pin 15 ALT5 mux port:GPIO1_IO19
str r0,[r1,#AD_B1_06] //Pin 17 ALT5 mux port:GPIO1_IO22
str r0,[r1,#AD_B1_07] //Pin 16 ALT5 mux port:GPIO1_IO23
str r0,[r1,#AD_B1_08] //Pin 22 ALT5 mux port:GPIO1_IO24
str r0,[r1,#AD_B1_09] //Pin 23 ALT5 mux port:GPIO1_IO25
str r0,[r1,#AD_B1_10] //Pin 20 ALT5 mux port:GPIO1_IO26
str r0,[r1,#AD_B1_11] //Pin 21 ALT5 mux port:GPIO1_IO27
ldr r1,=IOMUXC_GPR_GPR26// Connect high speed GPIO6 not GPIO1 to pins
ldr r0,=0xFFFFFFFF
str r0,[r1]
ldr r1,=IOMUXC_GPR_GPR27// Connect high speed GPIO7 not GPIO2 to pins
ldr r0,=0xFFFFFFFF
str r0,[r1]
ldr r11,=GPIO6_DR //GPIO6 base address
///////////10987654321098765432109876543210
ldr r8,=#0b00000000000000000000000000000000
str r8,[r11,#GPIO6_GDIR]
//Pin 19 AD_B1_00 GPIO1_IO16 - Input
//Pin 18 AD_B1_01 GPIO1_IO17 - Input
//Pin 14 AD_B1_02 GPIO1_IO18 - Input
//Pin 15 AD_B1_03 GPIO1_IO19 - Input
//Pin 17 AD_B1_06 GPIO1_IO22 - Input
//Pin 16 AD_B1_07 GPIO1_IO23 - Input
//Pin 22 AD_B1_08 GPIO1_IO24 - Input
//Pin 23 AD_B1_09 GPIO1_IO25 - Input
//Pin 20 AD_B1_10 GPIO1_IO26 - Input
//Pin 21 AD_B1_11 GPIO1_IO27 - Input
ldr r12,=GPIO7_DR //GPIO7 base address
///////////5432109876543210
movw r8,#0b0000000000000001
str r8,[r12,#GPIO7_GDIR]
//Pin 10 B0_00 - Output
//pin 12 B0_01 - Input
//pin 11 B0_02 - Input
ldr r7,=0
ldr r8,=1
Loop:
str r7,[r12] //pin 10 low
LoopL:
ldr r9,[r11] //Read port
//////////10987654321098765432109876543210
tst r9,#0b00001000000000000000000000000000
beq LoopL
str r8,[r12] //pin 10 high
LoopH:
ldr r9,[r11] //Read port
//////////10987654321098765432109876543210
tst r9,#0b00001000000000000000000000000000
bne LoopH
b Loop
pop {r2-r12,pc}
bx lr // Return by branching to the address in the link register.
.fnend
Any help would be much appreciated.
Clive
I am using a Teensy 4.0 to read a 10bit ADC. I am using pins AD_B1_00 to AD_B1_11(AD_B1_04 and AD_B1_05 are not available on Teensy 4.0) as data inputs.
I am reading the ADC in assembler for maximum speed.
I am having trouble setting up pin 16 as an input. I can set up all the other pins but pin 16 seems to stay as an output.
The code below is a test. I have used it to test the pins individually. I have also used a new Teensy 4.1 with the same result.
GPIO6_DR = 0x42000000
GPIO6_GDIR = 4
GPIO7_DR = 0x42004000
GPIO7_GDIR = 4
IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_00 = 0x401F813C
IOMUXC_SW_PAD_CTL_PAD_GPIO_B0_00 = 0x401F832C
IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_00 = 0x401F80FC
IOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_00 = 0x401F82EC
B0_00 = 0
B0_01 = 4
B0_02 = 8
AD_B1_00 = 0
AD_B1_01 = 4
AD_B1_02 = 8
AD_B1_03 = 12
AD_B1_04 = 16
AD_B1_05 = 20
AD_B1_06 = 24
AD_B1_07 = 28
AD_B1_08 = 32
AD_B1_09 = 36
AD_B1_10 = 40
AD_B1_11 = 44
IOMUXC_GPR_GPR26 = 0x400AC068
IOMUXC_GPR_GPR27 = 0x400AC06C
ARM_DWT_CYCCNT = 0xE0001004
.global ASMprog
.syntax unified
.cpu cortex-m7
.type ASMprog,%function
.align 4
ASMprog:
.fnstart
push {r2-r12,lr}
// Select GPIO function on pin 10,11,12 (5 selects GPIO mode)
ldr r1,=IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_00
///////////5432109876543210 31-5 NU, 4 SION, 3-0 MUX_MODE
movw r0,#0b0000000000000101//ALT5 mux port:GPIO2_IO00 of instance: gpio2
str r0,[r1,#B0_00] //Pin 10 ALT5 mux port:GPIO2_IO00
str r0,[r1,#B0_02] //Pin 11 ALT5 mux port:GPIO2_IO02
str r0,[r1,#B0_01] //Pin 12 ALT5 mux port:GPIO2_IO01
// Select GPIO function on pin 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 (5 selects GPIO mode)
ldr r1,=IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_00
///////////5432109876543210 31-5 NU, 4 SION, 3-0 MUX_MODE
movw r0,#0b0000000000000101//ALT5 mux port:GPIO1_IO16 of instance: gpio1
str r0,[r1,#AD_B1_00] //Pin 19 ALT5 mux port:GPIO1_IO16
str r0,[r1,#AD_B1_01] //Pin 18 ALT5 mux port:GPIO1_IO17
str r0,[r1,#AD_B1_02] //Pin 14 ALT5 mux port:GPIO1_IO18
str r0,[r1,#AD_B1_03] //Pin 15 ALT5 mux port:GPIO1_IO19
str r0,[r1,#AD_B1_06] //Pin 17 ALT5 mux port:GPIO1_IO22
str r0,[r1,#AD_B1_07] //Pin 16 ALT5 mux port:GPIO1_IO23
str r0,[r1,#AD_B1_08] //Pin 22 ALT5 mux port:GPIO1_IO24
str r0,[r1,#AD_B1_09] //Pin 23 ALT5 mux port:GPIO1_IO25
str r0,[r1,#AD_B1_10] //Pin 20 ALT5 mux port:GPIO1_IO26
str r0,[r1,#AD_B1_11] //Pin 21 ALT5 mux port:GPIO1_IO27
// Optimise for 100MHz range, 34-23 Ohm o/p resistance @ 3.3V, Fast slew rate
ldr r1,=IOMUXC_SW_PAD_CTL_PAD_GPIO_B0_00
///////////10987654321098765432109876543210 31-17 NU, 16 HYS 15-14 PUS, 13 PUE, 12 PKE, 11 ODE, 10-8 NU, 7-6 SPEED, 5-3 DSE, 2-1 NU 0 SRE
ldr r0,=#0b00000000000000000001000010111001
str r0,[r1,#B0_00] //Pin 10
str r0,[r1,#B0_02] //Pin 11
str r0,[r1,#B0_01] //Pin 12
// Optimise for 100MHz range, 34-23 Ohm o/p resistance @ 3.3V, Fast slew rate
ldr r1,=IOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_00
///////////10987654321098765432109876543210 31-17 NU, 16 HYS 15-14 PUS, 13 PUE, 12 PKE, 11 ODE, 10-8 NU, 7-6 SPEED, 5-3 DSE, 2-1 NU 0 SRE
ldr r0,=#0b00000000000000000001000010111001
str r0,[r1,#AD_B1_00] //Pin 19 ALT5 mux port:GPIO1_IO16
str r0,[r1,#AD_B1_01] //Pin 18 ALT5 mux port:GPIO1_IO17
str r0,[r1,#AD_B1_02] //Pin 14 ALT5 mux port:GPIO1_IO18
str r0,[r1,#AD_B1_03] //Pin 15 ALT5 mux port:GPIO1_IO19
str r0,[r1,#AD_B1_06] //Pin 17 ALT5 mux port:GPIO1_IO22
str r0,[r1,#AD_B1_07] //Pin 16 ALT5 mux port:GPIO1_IO23
str r0,[r1,#AD_B1_08] //Pin 22 ALT5 mux port:GPIO1_IO24
str r0,[r1,#AD_B1_09] //Pin 23 ALT5 mux port:GPIO1_IO25
str r0,[r1,#AD_B1_10] //Pin 20 ALT5 mux port:GPIO1_IO26
str r0,[r1,#AD_B1_11] //Pin 21 ALT5 mux port:GPIO1_IO27
ldr r1,=IOMUXC_GPR_GPR26// Connect high speed GPIO6 not GPIO1 to pins
ldr r0,=0xFFFFFFFF
str r0,[r1]
ldr r1,=IOMUXC_GPR_GPR27// Connect high speed GPIO7 not GPIO2 to pins
ldr r0,=0xFFFFFFFF
str r0,[r1]
ldr r11,=GPIO6_DR //GPIO6 base address
///////////10987654321098765432109876543210
ldr r8,=#0b00000000000000000000000000000000
str r8,[r11,#GPIO6_GDIR]
//Pin 19 AD_B1_00 GPIO1_IO16 - Input
//Pin 18 AD_B1_01 GPIO1_IO17 - Input
//Pin 14 AD_B1_02 GPIO1_IO18 - Input
//Pin 15 AD_B1_03 GPIO1_IO19 - Input
//Pin 17 AD_B1_06 GPIO1_IO22 - Input
//Pin 16 AD_B1_07 GPIO1_IO23 - Input
//Pin 22 AD_B1_08 GPIO1_IO24 - Input
//Pin 23 AD_B1_09 GPIO1_IO25 - Input
//Pin 20 AD_B1_10 GPIO1_IO26 - Input
//Pin 21 AD_B1_11 GPIO1_IO27 - Input
ldr r12,=GPIO7_DR //GPIO7 base address
///////////5432109876543210
movw r8,#0b0000000000000001
str r8,[r12,#GPIO7_GDIR]
//Pin 10 B0_00 - Output
//pin 12 B0_01 - Input
//pin 11 B0_02 - Input
ldr r7,=0
ldr r8,=1
Loop:
str r7,[r12] //pin 10 low
LoopL:
ldr r9,[r11] //Read port
//////////10987654321098765432109876543210
tst r9,#0b00001000000000000000000000000000
beq LoopL
str r8,[r12] //pin 10 high
LoopH:
ldr r9,[r11] //Read port
//////////10987654321098765432109876543210
tst r9,#0b00001000000000000000000000000000
bne LoopH
b Loop
pop {r2-r12,pc}
bx lr // Return by branching to the address in the link register.
.fnend
Any help would be much appreciated.
Clive