HAL_ETH_Transmit返回错误值你把error_callback打开看看错误是什么,另外可以在报错的时候刷一下phy 寄存器的错误讯息,查看是不是底层出现故障,以下这段代码供参考
[C] 纯文本查看 复制代码
//写入网卡发送数据
ERROR_SUB MCU_ETH_WriteMultiPack(ETH_MULTI_PACK* multiPackPtr)
{
uint16_t indexUtil = 0;
uint32_t sendLength = 0;
uint32_t txResult = TX_SUCCESS;
HAL_StatusTypeDef halState = HAL_OK;
if(multiPackPtr->packCount == 0)
{
return ERROR_SUB_OK;
}
//申请信号量
txResult = tx_semaphore_get(&semaphoreMCU_ETH,TIME_OUT_MS_ETH_SEND);
if(TX_SUCCESS != txResult)
{
//信号量申请失败,返回错误
LowLevelPrintf("%s,semaphoreMCU_ETH GetTimeOut\r\n",__func__);
//停止ETH
halState = HAL_ETH_Stop_IT(Ð_Handler);
if(halState != HAL_OK)
{
LowLevelShowHalError(halState);
while(1);
}
//启动ETH
halState = HAL_ETH_Start_IT(Ð_Handler);
if(halState != HAL_OK)
{
LowLevelShowHalError(halState);
while(1);
}
//发送信号量
tx_semaphore_ceiling_put(&semaphoreMCU_ETH,1);
return ERROR_SUB_MCU_ETH_SEND_TIME_OUT;
}
//清除发送结构
UserMemSet((uint8_t*)ethSendPackBuffer,0,(ETH_TX_DESC_CNT*(sizeof(ETH_BufferTypeDef)/sizeof(uint8_t))));
//清除发送缓存
UserMemSet((uint8_t*)ethSendBufferArray,0,(ETH_TX_DESC_CNT*ETH_MAX_PACKET_SIZE));
//配置发送结构
for(indexUtil = 0;indexUtil < multiPackPtr->packCount;indexUtil++)
{
//数据拷贝到发送缓存
UserMemCopy((uint8_t*)ethSendBufferArray[indexUtil],(void*)multiPackPtr->dataBufferPtrArray[indexUtil],
multiPackPtr->dataLengthArray[indexUtil]);
//发送环境创建
ethSendPackBuffer[indexUtil].buffer = ethSendBufferArray[indexUtil];
ethSendPackBuffer[indexUtil].len = multiPackPtr->dataLengthArray[indexUtil];
if(indexUtil != multiPackPtr->packCount -1)
{
//多包链接
ethSendPackBuffer[indexUtil].next = ðSendPackBuffer[indexUtil+1];
}
//总长度计算
sendLength += multiPackPtr->dataLengthArray[indexUtil];
}
#if(MCU_ETH_ENABLE_CACHE_INVALID_STRATEGY == 1)
//更新缓存
SCB_CleanDCache_by_Addr((uint32_t*)(ethSendBufferArray),(ETH_RX_DESC_CNT*ETH_MAX_PACKET_SIZE)/4);
SCB_CleanDCache_by_Addr((uint32_t*)ethSendPackBuffer,(ETH_TX_DESC_CNT*(sizeof(ETH_BufferTypeDef)/sizeof(uint8_t)))/4);
#endif
ethTxConfig.Length = sendLength;
ethTxConfig.TxBuffer = ethSendPackBuffer;
//中断发送
halState = HAL_ETH_Transmit_IT(Ð_Handler,ðTxConfig);
if(halState != HAL_OK)
{
LowLevelShowHalError(halState);
while(1);
}
return ERROR_SUB_OK;
}
[C] 纯文本查看 复制代码 //发送完成回调
void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth)
{
if(heth->Instance == ETH)
{
//发送信号量
tx_semaphore_ceiling_put(&semaphoreMCU_ETH,1);
}
}
[C] 纯文本查看 复制代码 //多包发送结构体
typedef struct ETH_MULTI_PACK
{
uint8_t* dataBufferPtrArray[ETH_TX_DESC_CNT];
uint16_t dataLengthArray[ETH_TX_DESC_CNT];
uint16_t packCount;
}ETH_MULTI_PACK; |