主题中讨论的其他部件:TMS570LS3137、 HALCOGEN
工具/软件:Code Composer Studio
当我使用 EMAC 模块时、我发现我无法将消息传输到 PC 或从 PC 接收消息。
我从名为 RXERRCODE (MACSTATUS)的寄存器中读取值为2h 的值。
但相同的代码可以与 TMS570LS3137配合使用。
我的提示中是否有问题?以下是代码文件:
静态空 TMS570EmacTXData (空)
{
静态 EMACDESC_t* const sl_FirstTXDescPtr = EMAC_RAM_base(#define EMAC_RAM_base (((EMACDESC_t*)(0xFC520000UL)) /* CPPI RAM*/)+ array_size (EMAC_SL_HWRXBuffer);/*第一帧发送HDP所在位置*/
EMACDESC_t* DescPtr = sl_FirstTXDescPtr;/*当前发送数据的HDP *
uint8_t owner = 0U;/* CPU是否已经取得所有DESC的控制权*/
uint8_t EOQ = 0U;/* EMAC硬件模块是否已经处理完上一个DESC队列*/
/*1==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 1*/
/*判断发送缓冲区中的数据是否已经全部发送完毕*/
while (DescPtr!= NULL)
{
Owner |= DescPtr -> Owner;//=0
if ( DescPtr ->NextPtr ==空)//μ 第一次过
{
EOQ = DescPtR->EOQ;//=0
}
DescPtr = DescPtr -> NextPtr;//=0,EOQ=0,onxer=1
}
/*1==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 1*/
/*1==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 1*/
/* EMAC硬件发送模块中的数据已经发送完毕,可以再次发送新的数据。*/
第三次由第一个条件过((((EMAC_TXINTSTATRAW 和1U)== 1U)&&(EOQ == 1U)&&(所有者=0U)&&(EMAC_TX0HDP =0U))//μ s
||(sl_FirstTXDescPtr->BufferPtr == NULL))
{
DescPtr = sl_FirstTXDescPtr;
while (EMAC_SL_TXBuffer.Head.Cnt!= EMAC_SL_TXBuffer.Tail.Cnt)//第一次没过,后面过了
{
/*2===================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 2*/
/*配置发送缓冲区寄存器*/
memset (DescPtr、0U、sizeof (EMACDESC_t));
DescPtr -> BufferPtr = EMAC_SL_TXBuffer.Data[EMAC_SL_TXBuffer.Head.Cnt].Buffer;/*存放待发送数据的缓冲区*
DescPtr -> NextPtr = DescPtr + 1U;/*下一帧发送缓冲区*/
DescPtr ->数据长度= EMAC_SL_TXBuffer.Data[EMAC_SL_TXBuffer.Head.Cnt].Len;/*Δ V*/
DescPtr -> PacketLen = EMAC_SL_TXBuffer.Data[EMAC_SL_TXBuffer.Head.Cnt].Len;/*数据长度*
DescPtr -> SOP = 1U;/*起始标志位*/
DescPtr -> EOP = 1U;/*结束标志位*/
DescPtr ->所有者= 1U;/*标志本数据控制权交由EMAC模块*/
/*2===================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 2*/
/*2===================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 2*/
/*更新发送队列信息*/
EMAC_SL_TXBuffer.Data[EMAC_SL_TXBuffer.Head.Cnt].Len = 0U;
EMAC_SL_TXBuffer.Head.Cnt++;
/*2===================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 2*/
DescPtr ++;/*指向下一个发送缓冲区*//fc5201b0
}/*优先发送ARP或者通信协议数据*/
while ((EMAC_SL_IsGotRemoteMacAddr)&&(EMAC_SL_IsRXRemoteUDPData)
&&(EMAC_SL_StandardOutputMSG.Head.Cnt!= EMAC_SL_StandardOutputMSG.Tail.Cnt))
{
EMACTXData_t* EMACDataPtr = EMAC_SL_StandardOutputMSG.Data + EMAC_SL_StandardOutputMSG.Head.Cnt;/*当前存放数据的缓冲区*
MACFram_t* MacFramePtr =(MACFram_t*)(EMACDataPtr ->缓冲器);
IPHeader_t* IPHeaderPtr =(IPHeader_t*)(EMACDataPt->缓冲区+ 14U);
UDPHeader_t* UDPHeaderPtr =(UDPHeader_t*)(EMACDataPt->缓冲器+ 34U);
uint16_t PacketLen = MAX (MIN_IP_DATA_LEN、EMACDataPtr -> Len);
memcpy (MacFramePtr -> DstMacAddr、EMAC_SL_RemoteMacAddr、大小 EMAC_SL_RemoteMacAddr);/*目的网卡MAC地址*/
IPHeaderPtr->TotalLen = EMACDataPtr->Len - 14U;
IPHeaderPtr ->标识= EMAC_SL_IPFrameID++;
TMS570EmacFillIPHeaderCheckSum ((uint8_t*)(IPHeaderPtr));
UDPHeaderPtr ->DataLen = EMACDataPtr ->Len - 34U;
UDPHeaderPtr ->校验和= TMS570EmacCalcUDPChecksum (REMOAL_MSG_PORT、
EMACDataPtr ->缓冲器+ UDP_HEADER_LEN、EMACDataPtr ->Len - UDP_HEADER_LEN);
/*2===================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 2*/
/*配置发送缓冲区寄存器*/
memset (DescPtr、0U、sizeof (EMACDESC_t));
DescPtr -> BufferPtr = EMACDataPtr -> Buffer;/*存放待发送数据的缓冲区*/
DescPtr -> NextPtr = DescPtr + 1U;/*下一帧发送缓冲区*/
DescPtr ->长度= PacketLen;/*数据长度*/
DescPtr -> PacketLen = PacketLen;//数据长度*/
DescPtr -> SOP = 1U;/*起始标志位*/
DescPtr -> EOP = 1U;/*结束标志位*/
DescPtr ->所有者= 1U;/*标志本数据控制权交由EMAC模块*/
/*2===================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 2*/
/*2===================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 2*/
/*更新发送队列信息*/
EMAC_SL_StandardOutputMSG.Data[EMAC_SL_StandardOutputMSG.Head.Cnt].Len = UDP_HEADER_LEN;
EMAC_SL_StandardOutputMSG.Head.Cnt++;
/*2===================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 2*/
DescPtr 指向下一个发送缓冲区;/*Δ t*/
}/*发送软件运行输出信息(为了保证能够完整地接收到所有的输出信息,只有建立网络连接后再尝试发送)*/
if (DescPtr!= sl_FirstTXDescPtr)//mmeiguo、第二次过了
{
DescPtr --;
DescPtr -> NextPtr =空;/*将最后一个发送缓冲区的NextPtr置为空,表示发送到此缓冲区便结束*/
EMAC_TX0CP = EMAC_TX0CP;
EMAC_TX0HDP =(uint32_t)(sl_FirstTXDescPtr);/*开始发送数据(本语句必须放在最后)*
}
}
/*1==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== 1*/
}
typedef 结构体 EMACDescStr{
struct EMACDescStr* NextPtr;/*下一个数据信息的指针*/
uint8_t* BufferPtr;/*存储数据的缓冲区地址*/
uint16_t 数据存储缓冲区中第一个有效字节所在的位置;/*μ s*/
uint16_t 长度;/*数据存储缓冲区中有效数据的长度,单位为字节*/
UINT_t SOP:1;/*数据帧第一个数据包标志位*/
uint_t EOP:1;/*数据帧最后一个数据包标志位*/
uint_t owner:1;/*数据帧当前的控制权是否属于CPU标志位*/
UINT_t EOQ:1;/*数据包是否为数据帧中的最后一包标志位*/
UINT_t TDOWNCMPLT:1;/*拆卸完成(TDOWNCMPLT)标志*/
UINT_t PASSCRC:1;/*数据包的CRC是否由EMAC模块生成标志位*/
uint_t Jabber:1;/* Jabber 帧是长度超过 RXMAXLEN 并具有 CRC、代码或对齐错误的帧*/
uint_t 超大尺寸:1;/*数据包数据长度过大报警*/
uint_t 片段:1;/*数据包不完整报警*/
UINT_t 数据包数据长度过小报警大小:1;/*μ*/
UINT_t CONTROL:1;/*本帧数据为控制帧数据*/
UINT_t 溢出:1;/*数据包接收覆盖报警*/
UINT_t CODEERROR:1;/*数据包内容错误报警*/
UINT_t ALIGNERROR:1;/*数据包对齐错误报警*/
UINT_t CRCERROR:1;/*数据包CRC错误*/
uint_t nomatch:1;/*数据包MAC地址不匹配报警*/
uint16_t PacketLen;/*整帧数据的长度*/
}EMACDESC_t;

