ESP8266 GPIO mit SDK

OP #4799652
Lesenswert?

Guten Morgen,

ich versuche aktuell, mich mit den GPIO Funktionalitäten besser vertraut 
zu machen. Dafür probiere ich aktuell an einer 7-Segment Anzeige rum, 
dafür sollte der ESP8266 12-F eigentlich genügend frei verfügbare Pins 
haben, dachte ich!

Aber irgendwie mag GPIO14 und GPIO15 nicht. Ich setze mit
1
PIN_FUNC_SELECT
die Pins als GPIOs:
1
void initGPIOs(void){
2
  gpio_init();
3
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
4
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
5
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
6
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
7
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
8
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
9
}

(zu Pin16 gibt es in der "eagle_soc.h" keinen Eintrag).

Aktuell sind die Segmente an diesen Pins angeschlossen:
1
#define A BIT15
2
#define B BIT16
3
#define C BIT0
4
#define D BIT14
5
#define E BIT5
6
#define F BIT4
7
#define G BIT2

Alle außer BIT15 und BIT14 funktionieren. BIT16 lässt sich außerdem gar 
nicht ausschalten, sondern ist immer auf high. Woran kann das liegen?
OP #4799672
Lesenswert?

Danke für deine Antwort.

Mir ist gerade aufgefallen, dass es überhaupt keinen Unterschied macht, 
ob ich diese
1
PIN_FUNC_SELECT
 Funktion benutze oder nicht.

Es sieht aktuell nun so aus:
1
#define A BIT15
2
#define B BIT13
3
#define C BIT0
4
#define D BIT14
5
#define E BIT5
6
#define F BIT4
7
#define G BIT2

Nun funktioniert A zwar, dafür funktioniert B nicht mehr (D funktioniert 
nach wie vor nicht). So schalte ich die Pins ein:
1
gpio_output_set(A, 0, A, 0);
OP #4799706
Lesenswert?

Keine Ahnung, was ich gemacht habe. Zumindest funktioniert es jetzt mit 
diesen Pins:
1
#define A BIT15
2
#define B BIT13
3
#define C BIT0
4
#define D BIT12
5
#define E BIT5
6
#define F BIT4
7
#define G BIT2

und dieser Funktion:
1
void initGPIOs(void){
2
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
3
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
4
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
5
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
6
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
7
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
8
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
9
}
#4799870
Lesenswert?

Hallo,

Udo schrieb:
> GPIO15 muß auf Masse liegen.
> Sonst funktioniert das Modul nicht richtig.

stimmt nur zum Teil. GPIO15 muß zur Bootzeit Low-Pegel lesen für den 
richtigen Bootmode. Das erledigz auch ein passender PullDown. Allerdings 
sollte man seine Beschaltung an GPIO15 dahingehend prüfen, ob der 
PullDown auch wirklich auf Low ziehen kann. Eine LED mit Vorwiderstand 
gegen 3,3V kann das durchaus verhindern...

GPIO16 hat auch Einschränkungen, kann aber durchaus genutzt werden.
GPIO0 und 2 müssen beim Booten auch passende Pegel haben. Halbwegs 
unabhängig sind GPIO12/13/14 (SPI) und GPIO4/5.

Eine 7-Segmentanzeige o.ä. würde ich eher über ein Scheiberegister 
('595) an einen ESP8266 hängen. Es ist eben kein AVR.

Gruß aus Berlin
Michael

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