This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Problem with Network Component on STM32H7 (CubeMX)

Hi guys,
I have recently started to work with Keil uVision and I am porting my code that I have previously coined with SW4STM32. I bumped into some problems with the network component (I would like to switch from previously used LwIP to keil’s network implementation, so I need to rewrite this part). Fore some reason only reception works but board does not respond with anything. I work with NUCLEO 144 and STM32H743IT. Here I give you the description of how I included a network component into a default project and my minimal implementation to start the network interface with IPv4. Then I describe the problem more closely, also the debug log is attached.
I use cubeMX API for peripherals configuration and have done following things:
1. In “STM32Cube Framework (API)” -> CubeMX enabled ETH perhiperal and configured it like in www.keil.com/.../stm32f7_emac.html, that is: RMII mode, in configuration parameters I left default MAC 00:80:E1:00:00:00 and TX/RX descriptors, from 0x30040000 and on. Rx buffer length 1524 (default), I enabled global ETH interrupt. In GPIO all pins speed set to high, only PC1 (ETH_MDC) to low (high is not available for some reason). Chip is running at 400MHz and peripherals are running at either 200 or 100Mhz. I generated the project files. *_hal_eth.c and *_hal_eth_ex.c as well as IT, MSP and other core files are generated.
2. In uVision component selection:
Network->CORE enabled, IPv4 Debug STDIO
Network->Interface->ETH to 1
Network->Socket-> UDP and TCP enabled
Device->STM32Cube HAL-> enabled ETH and DMA
CMSIS Driver->Ethernet MAC (API)-> Ethernet MAC enabled
CMSIS Driver->Ethernet PHY (API)->LAN8742A enabled (and checked that it is physically the one on the board)
3. In RTX config (I use RTX5 with RTOS2 API) I set global dynamic memory size to 16k, thread stack to 4k
4. In Net_Debug.c enabled Full Debug under IPv4 Core Debug
5. Net_Config_TCP.c and *UDP.c left as default
6. In Net_Config_ETH_0.h driver set to 0, MAC default 1E-30-6C-A2-45-5E (I assume it overwrites the cubemx default), Ip address 192.168.137.10, mask 255.255.255.0, gateway 192.168.137.1, IGMP on DHCP off, only IPv4, netbios off, interface thread stack size 1024, rest as default
7. In startup script set the heap to 0x1000 and stack to 0x16000 like suggested in www.keil.com/.../nw_resource_requirements.html
8. Caches D and I are disabled
9. In main I call the MX_ETH_Init()
10. In a separate thread I call the netInitialize()
11. Compilation is ok
After the startup the chip boots ok, and starts the netInitalize routine after which I have a list of debug messages which indicate the interface reads data from the Ethernet (board is connected to a pc with a static address 192.168.137.2) which sends some ARP requests. The problem is it does not seem to be sending any responses. Also looking at wireshark dump there is nothing coming out from my board. When I try to ping the board and a following ARP request appear on wireshark:
259 371.999350 AsustekC_ac:66:3f Broadcast ARP 42 Who has 192.168.137.10? Tell 192.168.137.2
, then I see that that the chip executes SendFrame (EMAC_STM32H7xx.c) and the transfer complete HAL_ETH_TxCpltCallback (stm32h7xx_hal_eth.c) is called afterwards but no data ever reaches my host (nor does eth transmit diode blink). Other than during my ping attempt, these functions are never called.
I would be glad for some insights on what could I be missing. Btw. Hardware interface, cables etc. etc. are ok, as my “old” code works well on the same board.
Thanks,
Jeremi
Key parts of main:

#include "main.h"
#include "stm32h7xx_hal.h"
#include "string.h"

/* USER CODE BEGIN Includes */
#include "cmsis_os2.h"                  // ::CMSIS:RTOS2
#include "rl_net.h"

__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT];
__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT];
__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_MAX_PACKET_SIZE];
ETH_TxPacketConfig TxConfig;

ETH_HandleTypeDef heth;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ETH_Init(void);

uint32_t tcp_cb_server (int32_t socket, netTCP_Event event,
                        const NET_ADDR *addr, const uint8_t *buf, uint32_t len);

__NO_RETURN void LED_Thread (void *argument) {

        netInitialize ();

        uint8_t ip4_addr[NET_ADDR_IP4_LEN];
        char ip_ascii[40];

  for (;;) {
                osDelay(1000);
                HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);


                netIF_GetOption (NET_IF_CLASS_ETH | 0, netIF_OptionIP4_Address, ip4_addr, sizeof (ip4_addr));

                netIP_ntoa (NET_ADDR_IP4, &ip4_addr[0], ip_ascii, sizeof (ip_ascii));
                printf ("Current IP address: %s\n", ip_ascii);
        }
}

int main(void)
{
osKernelInitialize();
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
        MX_ETH_Init();
        osThreadNew(LED_Thread, NULL, NULL);
        osKernelStart();

  while (1){}

}

Debug console:

000.0 SYS:Network 7.9.0
000.0 SYS:Init system
000.0 MEM:Init MemPool 12000 bytes
000.0 MEM: Limit0=9000, Limit1=6000 bytes
000.0 ETH:Init interface
000.0 ETH:MAC (1E-30-6C-A2-45-5E)
000.0 ARP:Init Cache, 10 entries
000.0 LOOP:Init interface
000.0 IP4:Init IPv4 core
000.0 ICMP:Init Client
000.0 IGMP:Init Table, 5 entries
000.9 SYS:GetOption ETH, IP4-Addr
Current IP address: 192.168.137.10
001.9 ETH:Link up
001.9 ETH: 100M, Full duplex
001.9 MEM:Alloc 72 bytes
001.9 MEM: Used 72 bytes (1 blocks)
001.9 MEM:Free 72 bytes
001.9 MEM: Used 0 bytes (0 blocks)
001.9 ARP:Send_Request
001.9 MEM:Alloc 56 bytes
001.9 MEM: Used 56 bytes (1 blocks)
001.9 ARP: Opcode ARP-REQUEST
001.9 ARP: SendIp  192.168.137.10
001.9 ARP: TargIp  192.168.137.10
001.9 ARP: SendMac 1E-30-6C-A2-45-5E
001.9 ARP: TargMac 00-00-00-00-00-00
001.9 MEM:Free 56 bytes
001.9 MEM: Used 0 bytes (0 blocks)
001.9 SYS:GetOption ETH, IP4-Addr
Current IP address: 192.168.137.10
002.0 MEM:Alloc 72 bytes
002.0 MEM: Used 72 bytes (1 blocks)
002.0 ETH:*** Processing frame ***
002.0 ETH: DstMAC FF-FF-FF-FF-FF-FF
002.0 ETH: SrcMAC D0-17-C2-AC-66-3F
002.0 ETH: Proto ARP, 60 bytes
002.0 ARP:*** Processing frame ***
002.0 ARP: Opcode ARP-REQUEST
002.0 ARP: SendIp  0.0.0.0
002.0 ARP: TargIp  192.168.137.2
002.0 ARP: SendMac D0-17-C2-AC-66-3F
002.0 ARP: TargMac 00-00-00-00-00-00
002.0 ARP: Discarded, SendAddr invalid
002.0 MEM:Free 72 bytes
002.0 MEM: Used 0 bytes (0 blocks)