ARM LPC11U68 GPIO-Problem

Gast #4749906
Lesenswert?

Hallo ins Forum,

ich bin etwas ratlos: Ich nutze einen LPC11U68JBD48 für ein Projekt. Es 
gelingt mir nicht, einige bestimmte Ports als Ausgang zu schalten und zu 
setzen bzw. zu clearen. Diese besagten Ports bleiben IMMER high. Dachte 
zu erst daran, dass hier ein Hardwarefehler (Lötbrücke oder so) 
vorliegt. Aber das ist nachgewiesener Weise nicht der Fall. 
Beispielcode, mit dem sich das Problem darstellen läßt:
1
int main(void) {
2
  
3
  int j = 0;
4
  
5
  LPC_SYSCON->SYSAHBCLKCTRL |= ((uint32_t)1<<16); // GPIO clocks an
6
  
7
  LPC_GPIO_PORT->DIR[1] |= ((uint32_t)1 << 20); // LED blau
8
  
9
        // 4 Pins testweise als Ausgang
10
  LPC_GPIO_PORT->DIR[0] |= (1 << 2);
11
  LPC_GPIO_PORT->DIR[0] |= ((uint32_t)1 << 12);
12
  LPC_GPIO_PORT->DIR[0] |= ((uint32_t)1 << 13);
13
  LPC_GPIO_PORT->DIR[0] |= ((uint32_t)1 << 20);
14

15
        // Diese 4 Pins auf low
16
  LPC_GPIO_PORT->CLR[0] |= (1 << 2);
17
  LPC_GPIO_PORT->CLR[0] |= ((uint32_t)1 << 12);
18
  LPC_GPIO_PORT->CLR[0] |= ((uint32_t)1 << 13);
19
  LPC_GPIO_PORT->CLR[0] |= ((uint32_t)1 << 20);
20
  
21
  while(1) {
22
    // Die LED und die 4 pins toggeln...
23
    LPC_GPIO_PORT->NOT[1] |= ((uint32_t)1 << 20);  // LED blau blinkt --> korrekt
24
    LPC_GPIO_PORT->NOT[0] |= (1 << 2); // Pin toggelt --> korrekt
25
    LPC_GPIO_PORT->NOT[0] |= ((uint32_t)1 << 12); // Pin bleibt auf high --> falsch
26
    LPC_GPIO_PORT->NOT[0] |= ((uint32_t)1 << 13); // Pin bleibt auf high --> falsch
27
    LPC_GPIO_PORT->NOT[0] |= ((uint32_t)1 << 20); // Pin bleibt auf high --> falsch
28
    
29
    for(j = 0; j < 400000; j++);
30
  }
31
  
32
  return 0;
33
}

Hatte schon gedacht, es hat was mit den Bitmanipulationen bei 32bit 
Registern zu tun. Aber die LED blinkt. Also funktioniert das soweit. Hat 
jemand eine Idee?

Gruß Uli
Gast #4749932
Lesenswert?

PIO0_12 und _13 sind JTAG Pins, evtl. musst du die erst im IOCON 
Register auf GPIO umstellen. PIO0_20 müsste aber bei Reset als GPIO 
arbeiten und ok sein.
Die Bitkonstanten kannst du einfacher so schreiben: (1L << x)
#4749933
Lesenswert?

Bei der Pinkonfiguration nachschauen, ob da per default eine 
Hardwarefunktion (Debugger, Uart, ...) drauf liegt. Das würde die GPIO 
Output Steuerung abklemmen.

Die ganzen |= erzeugen jeweils eine Read-Modify-Write Sequenz, was bei 
den CLR und NOT Registern überflüssig sein dürfte (bei den restlichen 
allerdings notwendig ist).
Gast #4750328
Lesenswert?

Danke in die Runde,

Johannes hat mit PIN0_13 und PIN0_14 Recht gehabt. Diese werden nach 
Reset als JTAG-Pins konfiguriert. Handbuch half weiter.
ABER: Bei PIN0_20 habe ich das Problem immer noch. Keine Chance, als GPO 
auf low zu ziehen.... Ich verzweifel, weil ich diesen PIN im Layout 
benötige. Ein Bug auf dem Chip??? Elektrisch ist alles OK, kein Schluß 
zu anderen Pins oder so... Irgendetwas ist anders bei diesem Pin.

Uli
Gast #4750427
Lesenswert?

Hallo Johannes,

Pin war bereits beschaltet, da auf einer Prototypen-Platine. Habe 
vorsichtig eine Trennung in die Leiterbahn gefräst um ihn "solo" zu 
haben. Werde jetzt mal messen. Spannung ist 3,20V, zum Vergleich: VCC 
ist 3,32V. Kein weiteres Bauteil. Melde mich, wenn ich Widerstand und 
Spannung gemessen habe.
Gast #4750443
Lesenswert?

Hallo Johannes,

sieht nach einem defekten Pin (Ausgangsstufe) aus: R gegen VCC: 1,7 Ohm, 
R gegen Masse: ca. 96 Ohm. :-(

Wüßte allerdings nicht, wie ich das geschafft haben soll, das Teil 
defekt zu kriegen...
Gast #4750532
Lesenswert?

Danke für die Hilfe Johannes,

ich teste das morgen mal und schmeiße den Lötkolben an. Ist so ziemlich 
fummelig. Melde mich morgen vormittag nochmal dazu.

PS: Warum sollte eine Platine so krumme Widerstandswerte fabrizieren?

Zur Info: Ist 4-lagig mit durchgehendem GND-Layer. Aber VCC ist 
eigenltich nicht in der Nähe geführt...

Gruß Uli

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren