初级会员

- 积分
- 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 真是人都炸了
|