Hi,
ich habe glaube gerade ein Verständnisproblem. Ich arbeite mit einem
ADS7843 Touchscreen-Controller, dessen #PENIRQ Ausgang mit einem
EXTI-Pin verbunden ist.
Der #PENIRQ Pin am ADS7843 hat auf dem Display-Board einen 100k Pullup.
Wenn ich nun nur eine Interrupt-Routine habe, in der nicht ausgelesen
wird, dann funktioniert das soweit auch.
Wenn ich nun den Chip auslese, dann werden gleich ganz viele wirre
Interrupts ausgelöst, egal ob in main() oder ISR ausgelesen wird.
Der #PENIRQ Pin ist intern über eine Diode an einem der analogen
Eingänge. Wenn da nun gemessen wird und die internen switches Schalten
bekomme ich über die Diode am EXTI ungewollte "Daten", die Interrupts
auslösen.
Laut Datenblatt muss der Interrupt-Pin am Controller auf 0 gesetzt
werden um diese ungewollten Interrupts zu verhindern und zur Minimierung
von Störungen.
Nun meine Frage, wie mache ich sowas richtig?
Mein Versuch (der so nicht funktioniert, selbes Verhalten wie
beschrieben):
1 | uint16_t ads7843_read_x() {
|
2 | int x;
|
3 |
|
4 | GPIO_ResetBits(GPIOB, GPIO_Pin_6); // interrupt pin auf 0???
|
5 |
|
6 | ads7843_enable(); // CS=0
|
7 | ads7843_cmd(CMD_CHX); // send CMD
|
8 | x = ads7843_read();
|
9 | ads7843_disable();
|
10 |
|
11 | GPIO_SetBits(GPIOB, GPIO_Pin_6); // interrupt pin auf 1???
|
12 |
|
13 | return x;
|
14 | }
|
Der EXTI wird so initialisiert:
1 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
|
2 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
3 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
4 | GPIO_Init(GPIOB, &GPIO_InitStructure);
|
5 |
|
6 | NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
|
7 |
|
8 | NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
|
9 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
10 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
|
11 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
12 | NVIC_Init(&NVIC_InitStructure);
|
13 |
|
14 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
|
15 |
|
16 | GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);
|
17 | EXTI_ClearITPendingBit(EXTI_Line6);
|
18 |
|
19 | EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
20 | EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
|
21 | EXTI_InitStructure.EXTI_Line = EXTI_Line6;
|
22 | EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
23 | EXTI_Init(&EXTI_InitStructure);
|