cancel
Showing results for 
Search instead for 
Did you mean: 

Having problem sending a packet between two NUCELO_H743ZI2 boards over Ethernet?

bassem.saleh93
Associate II

I am new to Ethernet. What I am trying to do is to use it to send a packet from one board to another.

What I did:

  • Changed the default RAM to D1RAM to start from 0x24000000 to store the DMA descriptors
  • Configured the MPU for the DMA Descriptors - I will include snippets of the code
  • Configured the first board with one MAC Address and the second one with a different one

Here is the MPU config func

void MPU_Config(void){
	MPU_Region_InitTypeDef MPU_InitStruct;
 
	/* Disables the MPU */
	HAL_MPU_Disable();
	/**Initializes and configures the Region and the memory to be protected
	*/
	MPU_InitStruct.Enable = MPU_REGION_ENABLE;
	MPU_InitStruct.Number = MPU_REGION_NUMBER2;
	MPU_InitStruct.BaseAddress = 0x30040000;
	MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
	MPU_InitStruct.SubRegionDisable = 0x0;
	MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
	MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
	MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
	MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
	MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
	MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
 
	HAL_MPU_ConfigRegion(&MPU_InitStruct);
 
	/**Initializes and configures the Region and the memory to be protected
	*/
	MPU_InitStruct.Enable = MPU_REGION_ENABLE;
	MPU_InitStruct.Number = MPU_REGION_NUMBER1;
	MPU_InitStruct.BaseAddress = 0x30044000;
	MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
	MPU_InitStruct.SubRegionDisable = 0x0;
	MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
	MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
	MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
	MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
	MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
	MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
 
	HAL_MPU_ConfigRegion(&MPU_InitStruct);
 
	MPU_InitStruct.Enable = MPU_REGION_ENABLE;
	MPU_InitStruct.Number = MPU_REGION_NUMBER0;
	MPU_InitStruct.BaseAddress = 0x30040000;
	MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
	MPU_InitStruct.SubRegionDisable = 0x0;
	MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
	MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
	MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
	MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
	MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
	MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
 
	HAL_MPU_ConfigRegion(&MPU_InitStruct);
 
	/* Enables the MPU */
	HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

and Here the config function for the Ethernet

void EthConfig(void){
	uint8_t MACAddr[6];
	EthHandle.Instance = ETH;
#if MASTER
	MACAddr[0] = 0x00;
	MACAddr[1] = 0x80;
	MACAddr[2] = 0xE1;
	MACAddr[3] = 0x00;
	MACAddr[4] = 0x00;
	MACAddr[5] = 0x00;
#else
	MACAddr[0] = 0x00;
	MACAddr[1] = 0x80;
	MACAddr[2] = 0xE2;
	MACAddr[3] = 0x00;
	MACAddr[4] = 0x00;
	MACAddr[5] = 0x00;
#endif
	EthHandle.Init.MACAddr = &MACAddr[0];
	EthHandle.Init.MediaInterface = HAL_ETH_RMII_MODE;
	EthHandle.Init.TxDesc = DMATxDscrTab;
	EthHandle.Init.RxDesc = DMARxDscrTab;
	EthHandle.Init.RxBuffLen = 1524;
	if (HAL_ETH_Init(&EthHandle) != HAL_OK){
		Error_Handler();
	}
	memset(&TxPackConfig, 0 , sizeof(ETH_TxPacketConfig));
	TxPackConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
	TxPackConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;
	TxPackConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;
	for(int idx = 0; idx < ETH_RX_DESC_CNT; idx ++){
		HAL_ETH_DescAssignMemory(&EthHandle, idx, Rx_Buff[idx], NULL);
	}
	MACConf.DuplexMode =  ETH_FULLDUPLEX_MODE;
	MACConf.Speed  = ETH_SPEED_10M;
    HAL_ETH_SetMACConfig(&EthHandle, &MACConf);
}

And here is the Send function

void EthSend(void){
	ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT];
	memset(Txbuffer, 0 , ETH_TX_DESC_CNT*sizeof(ETH_BufferTypeDef));
	uint8_t buffertx[10] ={0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10};
	for(int i =0; i< 4;i++){
		Txbuffer[i].buffer = buffertx;
		Txbuffer[i].len =  10;
	}
	TxPackConfig.Length = 40;
	TxPackConfig.TxBuffer =  Txbuffer;
	if((HAL_ETH_Transmit(&EthHandle, &TxPackConfig, 10000))!= HAL_OK){
		Print("Error in Sending \n");
		Error_Handler();
	}
}

The output is always error in sending

Also, how to make sure that RAM is configured as I want, by .map file?

I would appreciate any help to make it work, Thank you

0 REPLIES 0