Other Parts Discussed in Thread: TMS570LS3137, , HALCOGEN
Tool/software: Code Composer Studio
While I am using the Emac module,I found that I can't transmit message to PC or receive from it.
And I read the valuer of 2h from the register named RXERRCODE(MACSTATUS).
But the same code can work with TMS570LS3137.
Is there something wrong in my seeting?Here is the code file:
static void TMS570EmacTXData(void)
{
static 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 == NULL )//第一次过
{
EOQ = DescPtr->EOQ;//=0
}
DescPtr = DescPtr->NextPtr;//=0,eoq=0,onxer=1
}
/*1============================================================================1*/
/*1============================================================================1*/
/*EMAC硬件发送模块中的数据已经发送完毕,可以再次发送新的数据。*/
if ( (((EMAC_TXINTSTATRAW & 1u) == 1u) && (EOQ == 1u) && (Owner == 0u) && (EMAC_TX0HDP == 0u)) //第三次由第一个条件过
|| (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->Length = EMAC_SL_TXBuffer.Data[EMAC_SL_TXBuffer.Head.Cnt].Len; /*数据长度*/
DescPtr->PacketLen = EMAC_SL_TXBuffer.Data[EMAC_SL_TXBuffer.Head.Cnt].Len; /*数据长度*/
DescPtr->SOP = 1U; /*起始标志位*/
DescPtr->EOP = 1U; /*结束标志位*/
DescPtr->OWNER = 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_StandardOuputMSG.Head.Cnt != EMAC_SL_StandardOuputMSG.Tail.Cnt) )
{
EMACTXData_t* EMACDataPtr = EMAC_SL_StandardOuputMSG.Data + EMAC_SL_StandardOuputMSG.Head.Cnt; /*当前存放数据的缓冲区*/
MACFrame_t* MacFramePtr = (MACFrame_t*)(EMACDataPtr->Buffer);
IPHeader_t* IPHeaderPtr = (IPHeader_t*)(EMACDataPtr->Buffer + 14U);
UDPHeader_t* UDPHeaderPtr = (UDPHeader_t*)(EMACDataPtr->Buffer + 34U);
uint16_t PacketLen = MAX(MIN_IP_DATA_LEN, EMACDataPtr->Len);
memcpy(MacFramePtr->DstMacAddr, EMAC_SL_RemoteMacAddr, sizeof EMAC_SL_RemoteMacAddr); /*目的网卡MAC地址*/
IPHeaderPtr->TotalLen = EMACDataPtr->Len - 14U;
IPHeaderPtr->Identification = EMAC_SL_IPFrameID++;
TMS570EmacFillIPHeaderCheckSum((uint8_t*)(IPHeaderPtr));
UDPHeaderPtr->DataLen = EMACDataPtr->Len - 34U;
UDPHeaderPtr->CheckSum = TMS570EmacCalcUDPCheckSum(REMOTE_MSG_PORT,
EMACDataPtr->Buffer + 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->Length = PacketLen; /*数据长度*/
DescPtr->PacketLen = PacketLen; /*数据长度*/
DescPtr->SOP = 1U; /*起始标志位*/
DescPtr->EOP = 1U; /*结束标志位*/
DescPtr->OWNER = 1U; /*标志本数据控制权交由EMAC模块*/
/*2============================================================================2*/
/*2============================================================================2*/
/*更新发送队列信息*/
EMAC_SL_StandardOuputMSG.Data[EMAC_SL_StandardOuputMSG.Head.Cnt].Len = UDP_HEADER_LEN;
EMAC_SL_StandardOuputMSG.Head.Cnt++;
/*2============================================================================2*/
DescPtr++; /*指向下一个发送缓冲区*/
}/*发送软件运行输出信息(为了保证能够完整地接收到所有的输出信息,只有建立网络连接后再尝试发送)*/
if ( DescPtr != SL_FirstTXDescPtr )//mmeiguo,第二次过了
{
DescPtr--;
DescPtr->NextPtr = NULL; /*将最后一个发送缓冲区的NextPtr置为空,表示发送到此缓冲区便结束*/
EMAC_TX0CP = EMAC_TX0CP;
EMAC_TX0HDP = (uint32_t)(SL_FirstTXDescPtr); /*开始发送数据(本语句必须放在最后)*/
}
}
/*1============================================================================1*/
}
typedef struct EMACDescStr {
struct EMACDescStr* NextPtr; /*下一个数据信息的指针*/
uint8_t* BufferPtr; /*存储数据的缓冲区地址*/
uint16_t Offset; /*数据存储缓冲区中第一个有效字节所在的位置*/
uint16_t Length; /*数据存储缓冲区中有效数据的长度,单位为字节*/
uint_t SOP : 1; /*数据帧第一个数据包标志位*/
uint_t EOP : 1; /*数据帧最后一个数据包标志位*/
uint_t OWNER : 1; /*数据帧当前的控制权是否属于CPU标志位*/
uint_t EOQ : 1; /*数据包是否为数据帧中的最后一包标志位*/
uint_t TDOWNCMPLT : 1; /*Teardown Complete (TDOWNCMPLT) Flag*/
uint_t PASSCRC : 1; /*数据包的CRC是否由EMAC模块生成标志位*/
uint_t JABBER : 1; /*Jabber frames are frames that exceed the RXMAXLEN in length, and have CRC, code, or alignment errors*/
uint_t OVERSIZE : 1; /*数据包数据长度过大报警*/
uint_t FRAGMENT : 1; /*数据包不完整报警*/
uint_t UNDERSIZED : 1; /*数据包数据长度过小报警*/
uint_t CONTROL : 1; /*本帧数据为控制帧数据*/
uint_t OVERRUN : 1; /*数据包接收覆盖报警*/
uint_t CODEERROR : 1; /*数据包内容错误报警*/
uint_t ALIGNERROR : 1; /*数据包对齐错误报警*/
uint_t CRCERROR : 1; /*数据包CRC错误*/
uint_t NOMATCH : 1; /*数据包MAC地址不匹配报警*/
uint16_t PacketLen; /*整帧数据的长度*/
}EMACDesc_t;