初级会员 
  
	- 积分
 - 71
 
        - 金钱
 - 71 
 
       - 注册时间
 - 2014-11-26
 
      - 在线时间
 - 6 小时
 
 
 
 | 
 
1金钱 
 本帖最后由 hrc2014a 于 2022-5-9 19:47 编辑  
 
STM32H7 MAC数据发送时时出错  
 
 
 
[STMH7 MAC + LAN8720] 
STM32H7 MAC数据发送时时出错如下图所示 
 
目前还没上LWIP,只是MAC初始化后单纯的想测试一下收发 
 
以下是MAC初始化代码 
 
void MX_ETH_Init(void) 
{ 
 
        ETH_MACConfigTypeDef MACConf; 
        uint32_t regvalue = 0; 
        unsigned int ret = -1; 
  heth.Instance = ETH; 
  heth.Init.MACAddr[0] =   0x00; 
  heth.Init.MACAddr[1] =   0x80; 
  heth.Init.MACAddr[2] =   0xE1; 
  heth.Init.MACAddr[3] =   *(unsigned char *)(UID_BASE + 4); 
  heth.Init.MACAddr[4] =   *(unsigned char *)(UID_BASE + 2); 
  heth.Init.MACAddr[5] =   *(unsigned char *)(UID_BASE + 0); 
  heth.Init.MediaInterface = HAL_ETH_RMII_MODE; 
  heth.Init.TxDesc = DMATxDscrTab; 
  heth.Init.RxDesc = DMARxDscrTab; 
  heth.Init.RxBuffLen = 1524; 
 
  /* USER CODE BEGIN MACADDRESS */ 
 
  /* USER CODE END MACADDRESS */ 
        __HAL_RCC_D2SRAM3_CLK_ENABLE(); 
        lan8720_reset(); 
         
        ret = HAL_ETH_Init(&heth); 
  if ( ret != HAL_OK) 
  { 
    Error_Handler(); 
  } 
//HAL_ETH_Start_IT(&heth); 
         
  memset(&TxConfig, 0 , sizeof(ETH_TxPacketConfig)); 
  TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD; 
  TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC; 
  TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT; 
  /* USER CODE BEGIN ETH_Init 2 */ 
 
  /* USER CODE END ETH_Init 2 */ 
         
         
         
          for (int idx = 0; idx < ETH_RX_DESC_CNT; idx++) 
    { 
        HAL_ETH_DescAssignMemory(&heth, idx, &Rx_Buff[idx][0], NULL); 
    } 
                 
                HAL_ETH_SetMDIOClockRange(&heth); 
         
        if(lan8720_SW_RESET() != HAL_OK) 
        { 
                        LOG_G("LAN8720 SW RESET ERROR\r\n"); 
                        return; 
        } 
         
        lan8720_check_SW_RESET_Done(); 
        my_delay_ms(2000); 
        lan8720_AUTO_NEGOTIATION_enable(ENABLE_AUTO_NEGOTIATION); 
  HAL_ETH_GetMACConfig(&heth, &MACConf); 
  MACConf.DuplexMode = ETH_FULLDUPLEX_MODE; 
  MACConf.Speed = ETH_SPEED_100M; 
  HAL_ETH_SetMACConfig(&heth, &MACConf); 
  HAL_ETH_Start_IT(&heth); 
 
} 
 
 
以下是发送代码 
void bsp_eth_send(ETH_BufferTypeDef * Txbuffer, int frameLen) 
{ 
 
                int i; 
          TxConfig.Length=frameLen; 
    TxConfig.TxBuffer=Txbuffer; 
 
                LOG_G("===========================================\r\n"); 
                for(i = 0; i < ETH_TX_DESC_CNT; i++) 
                { 
                                if(Txbuffer.buffer == NULL) 
                                        continue; 
                                 
                                        show_log_add_head("NET SEND:", Txbuffer.buffer, Txbuffer.len); 
                                        show_log(); 
                } 
                LOG_G("===========================================\r\n"); 
 
 //   SCB_CleanInvalidateDCache();    //无效化并清除Dcache 
    if(HAL_ETH_Transmit(&heth, &TxConfig, 1000) == HAL_OK) 
                { 
                        LOG_G("MAC send successful...\r\n"); 
                } else { 
                 
                        LOG_G("MAC send failt...\r\n"); 
                } 
         
         
         
} 
 
 
最后DEBUG发现是在发送函数HAL_ETH_Transmit(); 
      if((heth->Instance->DMACSR & ETH_DMACSR_FBE) != (uint32_t)RESET) 
      { 
        heth->ErrorCode |= HAL_ETH_ERROR_DMA; 
        heth->DMAErrorCode = heth->Instance->DMACSR; 
        /* Set ETH HAL State to Ready */ 
        heth->gState = HAL_ETH_STATE_ERROR; 
        /* Return function status */ 
        return HAL_ERROR; //这里返回ERROR了 
      } 
 
 
 
最后现现象是:只要不调用发送函数,接收是可以正常接收的,一但调用了发送函数,接收都接收不了 
 
原子哥大神,请赐给我点灵感。啊门!!!!! 
 
 
 
 
 
 |   
 
 
 
- 
错误 
 
 
 
 
最佳答案
查看完整内容[请看2#楼] 
十分的无语问苍天啊,把KEIL工程的RAM配置修改一下就可以了,把原来的IRAM1 参数0x20000000    0x20000改成 0x24000000  0x80000 真是人都炸了 
 
 
 
 
 
 
 |