Guten Abend!
Das ist mein erster Beitrag hier. Ich habe schon ein Weilchen
mitgelesen, bisher traute ich mich aber nicht, auch mal was zu fragen.
Na, heute gehts los:
Ich habe hier ein Olimex STM32E407-Development-Board. Und ich versuche,
eine TCP-Kommunikation mit lwip aufzubauen. Ich verwende FreeRTOS und
die lwip-netconn-API. Ausgegangen bin ich vom TCP-Echo-Server-Beispiel
von ST:
http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/PF257906
Das ist für das Discovery-Board mit MII und DP83848 PHY.
Ich habe gesehen, dass es einige gleiche Fragen hier im Forum schon
gibt, und habe mir darin Anregungen geholt, um das Beispiel anzupassen
auf RMII und LAN8710A PHY auf dem Olimex. Das war also konkret dieses
Thema hier:
Beitrag "STM32-E407 Ethernet / UDP"
und dieses:
Beitrag "STM32 - Fragen zum Einstieg"
Und das Beispiel habe ich mir auch noch reingezogen:
http://mikrocontroller.bplaced.net/wordpress/?page_id=1529
Nun sollte man meinen, da kann ja nichts mehr schiefgehen, immerhin
endet es immer mit "Klasse, jetzt läufts!". Aber so ist das Leben.
Was versuche ich also zu tun? Ich habe nun diesen Echo-Server, und
versuche in echo.c an der Stelle
1
err=netconn_bind(conn,NULL,50002);
2
if(err==ERR_OK){
3
while(1){
4
//Grab new connection
5
accept_err=netconn_accept(conn,&newconn);
6
[...]
7
}
auf eine neue Verbindung zu warten. PC-seitig versuche ich, diese
Verbindung mit
[code]
$ nmap -p 50002 192.168.2.105
[code]
zu initiieren. Leider kommt netconn_accept nicht zurück. Etwas weiter
verfolgt, lande ich in sys_arch.c in der Funktion sys_arch_mbox_fetch
an der Stelle
1
while(pdTRUE!=xQueueReceive(*mbox,&(*msg),portMAX_DELAY)){}// time is arbitrary
Aha! Nichts in der Input-Queue. Nun bin ich ratlos. In der inzwischen
allseitig bekannten Datei stm32f4x7_eth_bsp.c habe ich nun schon x-mal
rumgestöbert, hier und da etwas geändert (in Anlehnung an die Beispiele)
- nichts ändert sich. Ein lustiger Effekt ist mir noch aufgefallen: wenn
ich in der Funktion ETH_GPIO_Config schreibe
dann scheint der FreeRTOS-Scheduler nicht mehr zu laufen. Lösung und
Grund habe ich hier gefunden:
https://rowley.zendesk.com/entries/47825063-TCP-IP-Library-and-RMII
Vertausch man also die beiden Zeilen, läuft der Scheduler wieder. Eine
TCP-Nachricht kriege ich allerdings immer noch nicht. Nun meine
Kernfrage: Was übersehe ich? Die inkriminierten Dateien hänge ich mal
mit, da stehts bestimmt für alle gut sichtbar in fettem Rot. Nur ich
habe die Filzbrille auf.
Einen schönen guten Abend,
Dirk.
Das Angebot, mal ins Projekt zu schauen, kann ich einfach nicht
ausschlagen!
Das ist ein Eclipse/Makefile-Projekt. In der
1
main()
gibt es 2 Tasks, einen Blink-Task (den nehme ich zum Debuggen: Blinkts,
läuft der Scheduler, Blinkts schnell, habe ich eine bestimmte Codezeile
erreicht) und den lwip-Task, gestartet mittels
1
sys_thread_new()
von
1
echo_init()
in der Datei echo.c
Was müsste denn eigentlich passieren, wenn eine Ethernet-Nachricht
einläuft? Der
Hallo Dirk,
ich habe keine Antwort auf Deine Fragen, aber ich möchte auch lwip auf
dem E407 zum Fliegen bringen, allerdings standalone.
Das Beispiel
http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/PF257906
ist für den DP83848 als phy.
Woher hast Du denn Deine Modifikationen für den LAN8710A phy auf dem
E407 board, in den zitierten threads sehe ich die nicht?
Es muss ja mit den Modifikationen vom DP83848 zum LAN8710A
zusammenhängen, wo z.B. ist PHY_MICR oder braucht man das für RMII nicht
?! Clock richtig, 50MHz?
Fragen über Fragen
stay tuned
Cheers
Detlef
PS: die beiden einzigen download Deines Projekts sind von mir, das
Interesse der ARM community scheint ja nicht so ausgeprägt zu sein, oder
sind die woanders?
Hallo Detlef,
die LAN8710A-Modifikationen sind von Katastrophenheinz aus dem 2.
Thread. Derzeit habe ich das Problem, dass ich (oder besser der
Prozessor) nicht aus dem Ethernet-Reset rauskommt. Im Manual für den
STM32F4 lese ich z.B. auf Seite 913 (29.4.4), dass man den RMII-Mode im
Reset oder vor den MAC-Clocks setzen sollte. So habe ich das also mal
hochgezogen und schalte die MAC-Clocks auch erst nach dem Reset an:
1
staticvoidETH_MACDMA_Config(void)
2
{
3
uint32_ttimeout=0;
4
uint8_tsw_reset_ok=0;
5
6
/* Reset ETHERNET on AHB Bus */
7
ETH_DeInit();
8
9
/* Software reset */
10
ETH_SoftwareReset();
11
12
// Select the RMII interface. The STM32F4 manual says that this must
13
// be performed whilst the module is under reset or before enabling
Bringt aber nichts. Software Reset status bleibt immer SET.
Damit geht also alles, was danach kommt (ETH-DMA-Initialisierungen usw)
natürlich auch nicht.
In der Tat sind die Register für den LAN8710A etwas anders. Der Dank
geht hier auch an Katastrophenheinz fürs Zusammensuchen der
stm32f4x7_eth_bsp.h aus dem LAN8710A-Datenblatt.
Falls du jetzt planst, mein Projekt als Vorlage zu nehmen, muss ich dir
davon abraten (was du natürlich ignorieren kannst), denn: Es
funktioniert ja nicht.
Gruß,
Dirk.
Heieiei, da habe ich ja was schönes angerichtet. Der Hinweis 29.4.4
bezog sich doch nur auf die MAC-Clocks, nicht auf Sysconfig-Clock. Wenn
man also statt
1
// Select the RMII interface. The STM32F4 manual says that this must
2
// be performed whilst the module is under reset or before enabling
Dirk Neumann schrieb:> PC-seitig versuche ich, diese> Verbindung mit> [code]> $ nmap -p 50002 192.168.2.105> [code]
wirklich mit nmap? sollte das nicht nc für netcat sein?