主题中讨论的其他器件:C2000WARE
大家好、正如您在上一篇文章中所说、我将以下路径导入到例程 C:\ti\c2000Ware_3_04_00_00\libraries\communications\ethernet/third_party/lwip\examples\enet_lwip\ccs
之后、我在 PC、开关和评估板之间实现了 ping 功能
我需要在何处进一步设置应用层协议 UDP、是否需要导入其他例程?
期待收到您的回复!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、正如您在上一篇文章中所说、我将以下路径导入到例程 C:\ti\c2000Ware_3_04_00_00\libraries\communications\ethernet/third_party/lwip\examples\enet_lwip\ccs
之后、我在 PC、开关和评估板之间实现了 ping 功能
我需要在何处进一步设置应用层协议 UDP、是否需要导入其他例程?
期待收到您的回复!
您好!
首先、您必须在 lwipopts.h 中启用 UDP
#define LWIP_UDP 1
然后、您必须在 lwip_init 之后初始化 UDP、lwip_init 具有回调函数参数(UDP_Rx)、该参数在堆栈接收到 UDP 数据包时调用。
struct udp_PCB *g_upcb;
void udp_init (void)
{
g_upcb = udp_new();
udp_bind (g_upcb、ip_ADDR_any、28000);
udp_recv (g_upcb、&udp_Rx、(void*) 0);
}
回调函数传递 pbuf 参数、该参数具有要处理的数据负载。
void udp_rx (void *arg、struct udp_pcb * upcb、struct pbuf * p、
struct ip_addr *地址、u16_t 端口)
然后,可以使用 udp_connect()、udp_disconnect()与远程主机交互以获取特定端口号。
要发送 UDP 封包、您可以使用以下函数以及正确初始化的 pbuf
udp_send (g_upcb、pbuf1_tx);
此致、
Yashwant
大家好、Yashwant!
我尝试将以下代码添加到此位置。
udp_init();
struct udp_pcb * udpPcb;
struct ip_addr *ipaddr;
struct pbuf *p;
p = pbuf_alloc (PBUF_RAW、sizeof (UDPData)、PBUF_RAM);
p->PAY=(void*) UDPData;
IP4_ADDR (&ipaddr、192、168、1、16);
UdpPcb = udp_new();
UDP_BIND (UdpPcb、IP_ADDR_ANY、1025);
udp_connect (UdpPcb、ipaddr、1025);
while (1)
{
udp_send (UdpPcb、p);
延迟(1000000UL);
延迟(1000000UL);
延迟(1000000UL);
}
编译期间会发生以下错误


然后我意识到没有为 IP_addr 定义结构
我需要自己定义吗? 如何定义它?
期待您的回复
谢谢你
你好
我已经调整了 UDP 协议、现在可以正常运行代码
但我还有另一个问题
我的数据是从 CPUI 内核生成的、并通过 IPC 发送到 CM 内核、 但是、由于 CPUI 内核支持的最小字节为2个字节、CM 中支持单个字节、即 CPUI 中的字符类型仍占用两个字节、这会导致我发送数据时两个内核中的数据类型不一致。
我的 CPUI 中的代码如下所示。
//
//包含的文件
//
#include "driverlib.h"
#include "device.h"
//
//定义
//
//UDP
#define 以太网
#define len 120
//UDP
#define IPC_CMD_READ_MEM 0x1001
#define IPC_CMD_RESP 0x2001
#define TEST_PASS 0x5555
#define TEST_FAIL 0xAAAA
#pragma DATA_SECTION (ReadData、"MSGRAM_CPU_TO_CM")
//UDP
uint16_t readData1[len]={0xAA、0x55、0x00、0x01、0x34、0x00、0x00、0x1D、0x00、0x00、0x64、0x00、0x00、0x00、0x00、0x14、0x14、0x15、0x6、0x17、0x0F、0x3、0x00、0x00、0x20、0x00、0x20、0x20、0x00、0x20、0x20、0x20、0x30、0x31、0x00、0x20、0x00、0x20、0x20、0x31、0x20、0x20、0x20、0x00、0x31、0x20、0x31、0x00、0x20、0x31、0x20、0x20、0x20、0x20、0x30、0x31、0x31、0x00、0x31、0x20、0x00、0x20、0x31、0x31、0x31、0x20、0x20、0x00、0x20、0x20、0x20、0x00、0x20、0x31、0x31、0x31、0x00、0x31、0x31、0x40、0x31
//UDP
uint16_t ReadData[len];
uint32_t pass;
//
//主函
//
void main (void)
{
int i;
//
//初始化设备时钟和外设
//
device_init();
DEVICE_initGPIO();//udp
//
//启动 CM 内核
//
#ifdef _flash
DEVICE_BOOTCM (BOOTMODE_BOOT_TO_FLASH_SECTOR0);
其他
DEVICE_BOOTCM (BOOTMODE_BOOT_TO_S0RAM);
#endif
//UDP
ifdef 以太网
//
//设置 EnetCLK 以使用 SYSPLL 作为时钟源并设置
//时钟分频器更改为2.
//
//这样,我们可以确保 PTP 时钟为100 MHz。 请注意、该值
//对于 CM 内核不是自动/动态已知的,因此需要它
//预先提供给 CM 侧代码。
SYSCTL_setEnetClk (SYSCTL_ENETCLKOUT_DIV_2、SYSCTL_Source_SYSPLL);
//
//为以太网配置 GPIO。
//
// MDIO 信号
//
GPIO_setPinConfig (GPIO_105_ENET_MDIO_CLK);
GPIO_setPinConfig (GPIO_106_ENET_MDIO_DATA);
//
//这只用于 RMII 模式
//GPIO_setPinConfig (GPIO_73_ENET_RMII_CLK);
//
//
//MII 信号
//
GPIO_setPinConfig (GPIO_109_ENET_MII_CRS);
GPIO_setPinConfig (GPIO_110_ENET_MII_COL);
GPIO_setPinConfig (GPIO_75_ENET_MII_TX_DATA0);// ںϰ121 μ A
GPIO_setPinConfig (GPIO_122_ENET_MII_TX_Data1);
GPIO_setPinConfig (GPIO_123_ENET_MII_TX_DATA2);
GPIO_setPinConfig (GPIO_124_ENET_MII_TX_DATA3);
//
//仅在必须连接 TX 错误引脚时使用此选项
//GPIO_setPinConfig (GPIO_46_ENET_MII_TX_ERR);
//
GPIO_setPinConfig (GPIO_118_ENET_MII_TX_EN);
GPIO_setPinConfig (GPIO_114_ENET_MII_RX_DATA0);
GPIO_setPinConfig (GPIO_115_ENET_MII_RX_Data1);
GPIO_setPinConfig (GPIO_116_ENET_MII_RX_DATA2);
GPIO_setPinConfig (GPIO_117_ENET_MII_RX_DATA3);
GPIO_setPinConfig (GPIO_113_ENET_MII_RX_ERR);
GPIO_setPinConfig (GPIO_112_ENET_MII_RX_DV);
GPIO_setPinConfig (GPIO_44_ENET_MII_TX_CLK);// ںϰ120 μ A
GPIO_setPinConfig (GPIO_111_ENET_MII_RX_CLK);
//
//断电引脚可使外部 PHY 从断电状态中退出
//
GPIO_setDirectionMode (108、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (108、GPIO_PIN_TYPE_PULLUP);
GPIO_writePin (108、1);
//
//PHY 复位引脚被驱动为高电平以使外部 PHY 退出复位
//
GPIO_setDirectionMode (119、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (119、GPIO_PIN_TYPE_PULLUP);
GPIO_writePin (119.1);
#endif
//UDP
//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
interrupt_initModule();
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrupt_initVectorTable();
//
//清除任何 IPC 标志(如果已设置)
//
IPC_clearFlagLtoR (IPC_CPU1_L_CM_R、IPC_FLAG_ALL);
//
//同步两个内核。
//
IPC_SYNC (IPC_CPU1_L_CM_R、IPC_FLAG31);
//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;
//
//填写要发送的数据
//
for (i=0;<len; i++)
{
ReadData[i]= readData1[i];
}
//
//发送不带消息队列的消息
//由于 C28x 和 CM 不共享共享共享 RAM 的同一地址空间,
//启用 address_correction
//要读取的数据的长度作为数据传递。
//
IPC_sendCommand (IPC_CPU1_L_CM_R、IPC_FLAG0、IPC_ADDR_CORRECT_ENABLE、
IPC_CMD_READ_MEM (uint32_t) ReadData、len);
//
//等待确认
//
IPC_waitForAck (IPC_CPU1_L_CM_R、IPC_FLAG0);
//
//读取响应
//
if (IPC_getResponse (IPC_CPU1_L_CM_R)= TEST_PASS)
{
PASS = 1;
}
其他
{
PASS = 0;
}
//
//示例末尾。 永远循环
//
while (1);
}
//
//文件结束
//
CM 内核中的代码如下所示。
#include
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_NVIC.h"
#include "inc/hw_types.h"
#include "inc/hw_sysctl.h"
#include "inc/hw_emac.h"
#include "driverlib_cm/ethernet.h"
#include "driverlib_cm/gpio.h"
#include "driverlib_cm/interrupt.h"
#include "driverlib_cm/flash.h"
#include "driverlib_cm/sysctl.h"
#include "driverlib_cm/SysTick .h"
#include "utils/lwiplib.h"
#include "board_drivers/pinout.h"
#include "lwip/apps/httpd.h"
#include "ethernet.h"
#include "ip4_addr.h"
//******* IPCv2.0 *********
#include "cm.h"
#include "ipc.h"
//******* IPCv2.0 *********
//#include "f2838x_examples.h"//ʱ
//#include "driverlib_cm.h"// ipcͷļ
//#include "src/core/udp.c"
//#include "ipc_cm.h"
//
//这些由链接器定义(请参阅器件链接器命令文件)
extern uint16_t RamfuncsLoadStart;
extern uint16_t RamfuncsLoadSize;
extern uint16_t RamfuncsRunStart;
extern uint16_t RamfuncsLoadEnd;
extern uint16_t RamfuncsRunEnd;
extern uint16_t RamfuncsRunSize;
extern uint16_t constLoadStart;
extern uint16_t constLoadEnd;
extern uint16_t constLoadSize;
extern uint16_t constRunStart;
extern uint16_t constRunEnd;
extern uint16_t constRunSize;
#define DEVICE_FLASH_WAITSTATES 2.
//
//
//特定于驱动程序的初始化代码和宏。
//
//
#define ETHERNET_NO_NO_NO_TO_RX_packets 2U
#define ETHERNET_MAX_PACKET_LENGTH 1538U
#define NUM_PACKE_DESC_RX_application 16.
#define shuzulen 240
#define PAYLOAD 240
//#define Tshuzulen 120
struct pbuf *p;
struct udp_pcb * udpPcb;
struct ip4_addr ipaddr;
//字符 UDPData[shuzulen]={3,1,2,3,2,3,2,3,4,5,6,7,8,9,1,2,1,2,3,4,6,7,8,9,1,3,6,2,3,7,8,9,5,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,4,6,4,6,4,6,7,6,7,4,6,7,4,6,7,4,6,7,4,6,7,4,6,7,4,6,
//******** ̫UDP 图标
//********* IPCv2.0 *********
#define IPC_CMD_READ_MEM 0x1001
#define IPC_CMD_RESP 0x2001
#define TEST_PASS 0x5555
#define TEST_FAIL 0xAAAA
//uint32_t 命令、数据、addr;
//int16_t addr;
uint16_t UDPData[shuzulen];
uint16_t buf_TX[shuzulen];
//********* IPCv2.0 *********
EtherNet_Handle EMAC_Handle;
Ethernet_initconfig *pInitCfg;
uint32_t Ethernet_numRxCallbackCustom = 0;
uint32_t releaseTxCount = 0;
uint32_t genericISRCustomcount = 0;
uint32_t genericisrCustomRBUcount = 0;
uint32_t genericisrCustomROVcount = 0;
uint32_t genericisrCustomRIcount = 0;
uint32_t systickPeriodValue = 15000000;
Ethernet_Pkt_Desc pktDescriptionorRXCustom[NUM_PACKAGE_DESC_RX_application];
extern uint32_t Ethernet_numGetPacketBufferCallback;
extern Ethernet_Device Ethernet_DEVICE_STRUCT;
uint8_t ethernet_rxBuffer[ethernet_no_of _RX_packets * ethernet_MAX_packet_length];
uint32_t sendPacketFailedCount = 0;
//uint32_t 命令、addr、data;
//
//const static char UDPData[]="#TB1234567891234567*";
// const 静态 char UDPData]]={0xAA、0x55、0x00、0x01、0x34、0x00、0x00、0x1D、0x00、0x00、0x64、0x00、0x00、0x00、0x14、0x14、0x15、0x06、0x00、0x00、0x31、0x00、0x00、0x00、0x40、0x00、0x31、0x00、0x00、0x31、0x00、0x31、0x00、0x31、0x00、0x31、0x00、0x40、0x00、0x31、0x31、0x31、0x00、0x31、0x31、0x00、0x31、0x31、0x00、0x31、0x31、0x00、0x31、0x31、0x40、0x00、0x31、0x31、0x31、0x00、0x31、0x31、0x31、0x31、0x00、0x31、0x31、0x40、0x00、0x00、0x31、0x31、0x00、0x31、0x31、0x31、0x31、0x31、0x31、0x31、0x31、
//********* UDP *******
//uint8_t mac_custom[6]={0xA8、0x63、0xF2、0x00、0x1D、 0x98};
//const static char UDPData[]="#1234*";
//const static char UDPData[]="#TB、*";
extern Ethernet_Pkt_Desc*lwIPEthernetIntHandler (Ethernet_Pkt_DESC *pPacket);
void Ethernet_disableRxDMAReceive(UINT32_t base、uint8_t channelNum);
void Ethernet_enableRxDMAReception (uint32_t base、uint8_t channelNum);
uint32_t Ethernet_initRxChannel (Ethernet_ChInfo * chInfo);
//********* UDP *******
void CM_init (void)
{
//
//禁用看门狗
//
sysctl_disableWatchdog();
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
memcpy (&constRunStart、&constLoadStart、(size_t)&constLoadSize);
Flash_initModule (FLASH0CTRL_base、FLASH0ECC_BASE、DEVICE_FLASH_WAITSTATES);
#endif
#ifdef _flash
interrupt_setVectorTableOffset (((uint32_t) vectorTableFlash);
其他
interrupt_setVectorTableOffset (((uint32_t) vectorTableRAM);
#endif
}
//
void httpLEDToggle (void);
void (*ledtoggleFuncPtr)(void)=&httpLEDToggle;
//
//
// SysTick 中断的中断处理程序。
//
//
void SysTickIntHandler (空)
{
//
//调用 lwIP 计时器处理程序。
//
lwIPTimer (sysstickPeriodValue);
}
//
//
//此函数是示例调用的回调函数
//获取数据包缓冲区。 必须返回 EtherNet_Pkt_Desc 结构。
//将此 API 重写为自定义用例。
//
//
Ethernet_Pkt_Desc* Ethernet_getPacketBufferCustom (空)
{
//
//从描述符池获取下一个数据包描述符
//
uint32_t shortIndex =(Ethernet_numGetPacketBufferCallback + 3)
% NUM_PACKE_DESC_RX_application;
//
//增加充当头指针的簿记指针
//到数据包描述符池的循环数组。
//
Ethernet_numGetPacketBufferCallback++;
//
//将缓冲区长度信息更新到新采购的数据包
//描述符。
//
pktDescriptionorRXCustom[shortIndex].bufferLength =Ethernet_MAX_packet_length;
//
//更新包装器描述符中的接收缓冲区地址。
//
pktDescriptionorRXCustom[shortIndex].dataBuffer =
EtherNet_device_struct.rxBuffer [\
(Ethernet_MAX_packet_length* ethernet_device_struct.rxBuffIndex)];
//
//更新接收缓冲区池索引。
//
Ethernet_device_struct.rxBuffIndex += 1U;
Ethernet_device_struct.rxBuffIndex =\
(ethernet_device_struct.rxBuffIndex%ethernet_no_of _RX_packets);
//
//接收缓冲区可从地址0开始使用
//
pktDescriptionorRXCustom[shortIndex].dataOffset = 0U;
//
//将此新描述符返回到驱动程序。
//
返回(&(pktDescriptionorRXCustom[shortIndex]);
}
//
//
//这是一个挂钩函数,在收到时由驱动程序调用
//数据包。 应用程序预计在使用缓冲器后将对其进行补充。
//必须返回 Ethernet_Pkt_Desc 结构。
//将此 API 重写为自定义用例。
//
//
Ethernet_Pkt_Desc* Ethernet_receivePacketCallbackCustom (
EtherNet_Handle handleApplication、
Ethernet_Pkt_Desc *pPacket)
{
//
//保留记录以保持收到的回调数。
//
#ifdef Ethernet_debug
Ethernet_numRxCallbackCustom++;
#endif
//
//这是应用程序特定处理的占位符
//我们将用另一个缓冲区补充接收到的缓冲区
//
返回 lwIPEthernetIntHandler (pPacket);
}
void Ethernet_releaseTxPacketBufferCustom (
EtherNet_Handle handleApplication、
Ethernet_Pkt_Desc *pPacket)
{
//
//发送数据包后,重复使用数据包内存以避免
//内存泄漏。 调用将会处理的中断处理程序函数
//释放数据包描述符使用的内存。
//
lwIPEthernetIntHandler (pPacket);
//
//增加簿记计数器。
//
#ifdef Ethernet_debug
releaseTxCount++;
#endif
}
Ethernet_Pkt_Desc * Ethernet_performPopOnPacketQueueCustom (
EtherNet_PKT_Queue_T *端口队列 Ptr)
{
Ethernet_Pkt_Desc * pktDescHdrPtr;
pktDescHdrPtr = pktQueuePtr ->头;
if (0U!= pktDescHdrPtr)
{
pktQueuePtr->head = pktDescHdrPtr->nextPacketDesc;
pktQueuePtr->count--;
}
return (pktDescHdrPtr);
}
void Ethernet_performPushOnPacketQueueCustom (
ETHERNET_PKT_Queue_T *点队列 Ptr、
Ethernet_Pkt_Desc * pktDescHdrPtr)
{
pktDescHdrPtr->nextPacketDesc = 0U;
if (0U =pktQueuePtr->head)
{
//
//队列为空-用这一个数据包初始化它
//
pktQueuePtr->head = pktDescHdrPtr;
pktQueuePtr->tail = pktDescHdrPtr;
}
其他
{
//
//队列不为空-推至结束
//
pktQueuePtr->tail->nextPacketDesc = pktDescHdrPtr;
pktQueuePtr->tail = pktDescHdrPtr;
}
pktQueuePtr->count++;
}
void Ethernet_setMACConfigurationCustom (uint32_t base、uint32_t 标志)
{
HWREG (BASE + ETHERNET_O_MAC_CONFIGURATION)|=标志;
}
空 Ethernet_clearMACConfigurationCustom (uint32_t base、uint32_t 标志)
{
HWREG (BASE + ETHERNET_O_MAC_CONFIGURATION)&=~标志;
}
中断空 Ethernet_genericISRCustom (空)
{
genericISRCustomcount++;
Ethernet_RxChDesc * rxChan;
Ethernet_TxChDesc *txChan;
ethernet_hw_descriptor * desptr;
ethernet_hw_descriptor * tailPtr;
uint16_t i=0;
Ethernet_clearMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_base、ethernet_mac_configuration_re);
Ethernet_clearMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_BASE、ethernet_mac_configuration_TE);
for (i = 0U;i < Ethernet_device_struct.initConfig.numChannels;i++)
{
ethernet_disableRxDMAReceive(ethernet_device_struct.baseAddresses.enet_BASE,I);
}
if (((ethernet_dma_ch0_status_AIS |
EtherNet_DMA_CH0_STATUS_RBU)=
(HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE +
EtherNet_O_DMA_CH0_STATUS)和
(uint32_t)(以太网_DMA_CH0_STATUS_AIS |
EtherNet_DMA_CH0_STATUS_RBU)))||
(ETHERNET_MTL_Q0_INTERRUPT_CONTRAL_STATUS_RXOVFIS)==
(HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE +
EtherNet_O_MTL_Q0_INTERRUPT_CONTROL_STATUS)和
(uint32_t)(以太网_MTL_Q0_INTERRUPT_CONTRAL_STATUS_RXOVFIS
))
{
if ((Ethernet_DMA_CH0_STATUS_AIS |
EtherNet_DMA_CH0_STATUS_RBU)=
(HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE +
EtherNet_O_DMA_CH0_STATUS)和
(uint32_t)(以太网_DMA_CH0_STATUS_AIS |
以太网_DMA_CH0_STATUS_RBU)))
{
genericISRCustomRBUcount++;
}
if ((Ethernet_MTL_Q0_interrupt_control_STATUS_RXOVFIS)==
(HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE +
EtherNet_O_MTL_Q0_INTERRUPT_CONTROL_STATUS)和
(uint32_t)(以太网_MTL_Q0_INTERRUPT_CONTRAL_STATUS_RXOVFIS
))
{
genericISRCustomROVcount++;
Ethernet_enableMTLInterrupt (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE、0、
EtherNet_MTL_Q0_INTERRUPT_CONTRAL_STATUS_RXOVFIS);
}
/*
*清除 AIS 和 RBU 状态位。 这些必须是
*一起清除!
*
EtherNet_clearDMAChannelInterrupt (Ethernet_DEVICE_STRUCT.baseAddresses.enet_base、Ethernet_DMA_CHANNEL NUM_0、
EtherNet_DMA_CH0_STATUS_AIS |
EtherNet_DMA_CH0_STATUS_RBU);
/*
*从接收缓冲器恢复不可用(和挂起的 DMA)
*
*所有描述符缓冲区都归应用程序、和所有
*结果 DMA 无法将传入帧传输到
*缓冲器(RBU 条件)。 DMA 也已进入挂起状态
*模式。
*
*排空 RX 队列
*
/*出现 RBU 错误时,丢弃以前接收的所有数据包*/
if (Ethernet_device_struct.initConfig.pfcbDeletePackets!= NULL)
(* Ethernet_device_struct.initConfig.pfcbDeletePackets)();
rxChan =
Ethernet_device_struct.dmaObj.rxDMA[ethernet_dma_channel_NUM_0];
txChan =
EtherNet_device_struct.dmaObj.txDMA[Ethernet_DMA_CHANGE_NUM_0];
/*
*需要禁用多个中断、因此请保护代码以在其中执行此操作
*全局禁用块(防止在之间中断)
*
if (NULL!= Ethernet_device_struct.ptrPlatformInterruptDisable)
{
(* Ethernet_device_struct.ptrPlatformInterruptDisable)(
Ethernet_device_struct.interruptNum[
Ethernet_RX_INTR_CH0 + rxChan -> chInfo->chNum]);
(* Ethernet_device_struct.ptrPlatformInterruptDisable)(
Ethernet_device_struct.interruptNum[
Ethernet_general_interrupt]);
}
/*验证描述符队列中是否有完整容量*/
if (rxChan -> desrQueue.count < rxChan -> desMax){
/*由于房间错误,队列不是满容量的。
尝试再次填充*/
Ethernet_addPacketsIntoRxQueue (rxChan);
}
Ethernet_initRxChannel()
Ethernet_device_struct.initConfig.chInfo[ETHERNET_CH_DIR_RX][0]);
EtherNet_writeRxDescTailPointer (
Ethernet_device_struct.baseAddresses.enet_BASE、
0、
(&E) Ethernet_device_struct.rxDesc[
(((uint32_t) ethernet_descriptor_NUM_RX_PER_channel)*
(0 +(uint32_t) 1U));
if (NULL!= Ethernet_device_struct.ptrPlatformInterruptEnable)
{
(* Ethernet_device_struct.ptrPlatformInterruptEnable)(
Ethernet_device_struct.interruptNum[
Ethernet_RX_INTR_CH0 + rxChan -> chInfo->chNum]);
(* Ethernet_device_struct.ptrPlatformInterruptEnable)(
Ethernet_device_struct.interruptNum[
Ethernet_general_interrupt]);
}
}
if (0U!=(HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE +)
EtherNet_O_DMA_CH0_STATUS)和
(uint32_t)以太网_DMA_CH0_STATUS_RI)
{
genericISRCustomRIcount++;
EtherNet_clearDMAChannelInterrupt (
Ethernet_device_struct.baseAddresses.enet_BASE、
EtherNet_DMA_CHANGE_NUM_0、
Ethernet_DMA_CH0_STATUS_NIS | Ethernet_DMA_CH0_STATUS_RI);
}
for (i = 0U;i < Ethernet_device_struct.initConfig.numChannels;i++)
{
Ethernet_enableRxDMAReception
Ethernet_device_struct.baseAddresses.enet_BASE、
i);
}
Ethernet_setMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_base、ethernet_mac_configuration_re);
Ethernet_setMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_BASE、ethernet_mac_configuration_TE);
}
void Ethernet_init (const unsigned char * Mac)
{
Ethernet_InitInterfaceConfig initInterfaceConfig;
uint32_t macLower;
uint32_t macHigher;
uint8_t *温度;
initInterfaceConfig.ssbase = EMAC_SS_BASE;
initInterfaceConfig.enet_base = EMAC_BASE;
initInterfaceConfig.phyMode = Ethernet_SS_PHY_INTF_SEL_MII;
//
//为启用、禁用中断分配特定于 SoC 的函数
//和用于在系统级启用外设
//
initInterfaceConfig.ptrPlatformInterruptDisable =
Platform_disableInterrupt (&P);
initInterfaceConfig.ptrPlatformInterruptEnable =
&Platform_enableInterrupt;
initInterfaceConfig.ptrPlatformPeripheralEnable =
Platform_enablePeripheral (&P);
initInterfaceConfig.ptrPlatformPeripheralReset =
Platform_resetPeripheral (&P);
//
//在 SoC 上分配外设编号
//
initInterfaceConfig.peripheralNum = SYSCTL_Periph_CLK_ENET;
//
//指定以太网中断的默认特定于 SoC 的中断号
//
initInterfaceConfig.interruptNum[0]= INT_EMAC;
initInterfaceConfig.interruptNum[1]= INT_EMAC_TX0;
initInterfaceConfig.interruptNum[2]= INT_EMAC_TX1;
initInterfaceConfig.interruptNum[3]= INT_EMAC_RX0;
initInterfaceConfig.interruptNum[4]= INT_EMAC_RX1;
pInitCfg = Ethernet_initInterface (initInterfaceConfig);
Ethernet_getInitConfig (pInitCfg);
pInitCfg->dmaMode.InterruptMode = Ethernet_DMA_MODE_INTM_Mode2;
//
//分配回调以在需要时获取数据包缓冲区
//在发送中断回调时释放 TxPacketBuffer
//接收数据包完成中断时进行接收数据包回调
//
pInitCfg->pfcbRxPacket =以太网_receivePacketCallbackCustom;
pInitCfg->pfcbGetPacket =以太网_getPacketBuffer;
pInitCfg->pfcbFreePacket =以太网_releaseTxPacketBufferCustom;
//
//Assign the Buffer to be used by the Low Level driver for receiving (//分配缓冲区供低级驱动程序用于接收)
//数据包。 以太网 DMA 应可访问此功能
//
pInitCfg->rxBuffer = Ethernet_rxBuffer;
//
//此应用程序不使用应用程序句柄
//使用虚值1的 Hence
//
Ethernet_getHandle ((ethernet_handle) 1、pInitCfg、&EMAC_handle);
//
//禁用传输缓冲区不可用和正常中断
默认情况下、EtherNet_getHandle 中启用//。
//
Ethernet_disableDmaInterrupt (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE、
0、(ETHERNET_DMA_CH0_INTERRUPT_ENABLE_TBUE |
EtherNet_DMA_CH0_INTERRUPT_ENABLE_NIE);
//
//启用 MTL 中断以处理接收 FIFO 溢出
//以太网模块中的条件。
//
Ethernet_enableMTLInterrupt (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE、0、
EtherNet_MTL_Q0_INTERRUPT_CONTRAL_STATUS_RXOIE);
//
//禁用 MAC 管理计数器中断,因为它们未被使用
//。
//
HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE + Ethernet_O_MMC_RX_INTERRUPT_MASK)= 0xFFFFFFFF;
HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_base + Ethernet_O_MMC_IPC_RX_INTERRUPT_MASK)= 0xFFFFFFFF;
//
//执行全局中断使能
//
(void) Interrupt_enableInProcessor();
//
//Assign default ISR
//
Interrupt_registerHandler (INT_EMAC_TX0、Ethernet_transmitISR);
Interrupt_registerHandler (INT_EMAC_RX0、Ethernet_receiveISR);
Interrupt_registerHandler (INT_EMAC、Ethernet_genericISRCustom);
//
//启用默认的中断处理程序
//
INTERRUPT_ENABLE (INT_EMAC_TX0);
INTERRUPT_ENABLE (INT_EMAC_RX0);
INTERRUPT_ENABLE (INT_EMAC);
//
//将 Mac 地址字符串转换为32/16拆分变量格式
//驱动程序需要将其编程到硬件寄存器中。
//注意:此步骤是在 EtherNet_getHandle 函数之后完成的,因为
//在该函数中编程虚拟 MAC 地址。
//
temp =(uint8_t *) macLower;
temp[0]= mac[0];
temp[1]= mac[1];
temp[2]= mac[2];
temp[3]= mac[3];
temp =(uint8_t *) macHigher;
temp[0]= mac[4];
temp[1]= mac[5];
//
//对单播 MAC 地址进行编程。
//
Ethernet_setMACAddr (EMAC_BASE、0、macHigher、macLower、ethernet_channel_0);
Ethernet_clearMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_base、ethernet_mac_configuration_re);
Ethernet_setMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_base、ethernet_mac_configuration_re);
}
//********* IPCv2.0 *********
_interrupt void IPC_ISR0 ()
{
int i;
uint32_t 命令、addr、data;
bool status = false;
//
//读取命令
//
IPC_readCommand (IPC_CM_L_CPU1_R、IPC_FLAG0、IPC_ADDR_CORRECT_ENABLE、
命令、addr、&data);
if (command =IPC_CMD_READ_MEM)
{
状态= true;
for (i=0;<data; i++)
{
UDPData[i]=*((uint16_t *) addr+i);
// if (*(((uint32_t *) addr + i)!= i)
// status = false;
}
}
//
//发送对 C28x 内核的响应
//
if (状态)
{
IPC_sendResponse (IPC_CM_L_CPU1_R、TEST_PASS);
}
其他
{
IPC_sendResponse (IPC_CM_L_CPU1_R、TEST_FAIL);
}
//
//确认标志
//
IPC_ackFlagRtoL (IPC_CM_L_CPU1_R、IPC_FLAG0);
}
//********* IPCv2.0 *********
//
//此示例演示了以太网控制器的使用。
//
//********* 主页代码
int i=0;
int main (空)
{
unsigned long ulUser0、ulUser1;
unsigned char pucMACArray[8];
//
//特定于用户的 IP 地址配置。
//当前实施仅适用于静态 IP 地址。
//
无符号长整型 ipaddr = 0xC0A80216;//192.168.2.22 // 0xDBF60201;// 0xC0A80216;
无符号长网络掩码= 0xFFFFFF00;
无符号长整型 GWAddr = 0x00000000;
//
//初始化 CM。 将所需的函数加载到 SRAM。
//
cm_init();
SysTK_setPeriod (SysTick PeriodValue);
SysTK_enableCounter();
SysTick 寄存器 InterruptHandler (SysTickIntHandler);
SysTK_enableInterrupt ();
//********* IPCv2.0 ********
//
IPC_clearFlagLtoR (IPC_CM_L_CPU1_R、IPC_FLAG_ALL);//清除任何 IPC 标志(如果已设置)
IPC_registerInterrupt (IPC_CM_L_CPU1_R、IPC_INT0、IPC_ISR0);//启用 IPC 中断
IPC_SYNC (IPC_CM_L_CPU1_R、IPC_FLAG31);//同步两个内核。
//********* IPCv2.0 *********
//
//启用处理器中断。
//
interrupt_enableInProcessor();
//设置特定于用户/公司的 MAC 八位位组
//(对于此代码、我们使用 A8-63-F2-00-00-80)
// 0x00 MACOCT3 MACOCT2 MACOCT1
ulUser0 = 0x00F263A8;
// 0x00 MACOCT6 MACOCT5 MACOCT4
ulUser1 = 0x00800000;
//
//将24/24拆分 MAC 地址从 NV RAM 转换为32/16拆分 MAC
//对硬件寄存器进行编程所需的地址,然后对 MAC 进行编程
//将地址输入以太网控制器寄存器。
//
puMACArray[0]=((ulUser0 >> 0)& 0xff);
puMACArray[1]=((ulUser0 >> 8)& 0xff);
puMACArray[2]=((ulUser0 >> 16)& 0xff);
puMACArray[3]=((ulUser1 >> 0)& 0xff);
puMACArray[4]=((ulUser1 >> 8)& 0xff);
puMACArray[5]=((ulUser1 >> 16)& 0xff);
//
//初始化以太网模块。
//
Ethernet_init (pucMACArray);
//
//使用 DHCP 初始化 lwIP 库。
//
lwIPInit (0、pucMACArray、ipaddr、netmask、GWAddr、 ipaddr_use_static);
//2021625
udp_init();
IP4_ADDR (&ipaddr、192、168、2、160);
UdpPcb = udp_new();
udp_bind (IPַ Pcb、IP_ADDR_ANY、6600);//μ s
UDP_CONNECT (UdpPcb、ipaddr、5530);
p = pbuf_alloc (PBUF_transport、PAYLOAD, PBUF_RAM);
while (1)
{
//p = pbuf_alloc (PBUF_transport、shuzulen、PBUF_RAM);
memset (buf_TX、0x00、有效载荷);
对于(I = 0;I <有效负载;I++)
{
if (i < shuzulen)
{
// buf_TX[i]=(uint8_t)(UDPData[i]& 0xff);
buf_TX[i]= UDPData[i];
}
其他
{
buf_TX[i]=0x00;
}
}
p->PAY=(void*) buf_tx;
p->tot_len =有效载荷;
p->len =有效载荷;
udp_send (udpcb、p);
DEVICE_DELAY_US (10000);
// if (p!= NULL)
// pbuf_free (p);
}
//初始化 HTTP Web 服务器守护程序。
//
//httpd_init();
//
//永久循环。 所有工作都在中断处理程序中完成。
//
}
//
//
//由 lwIP 库调用。 当收到命令时切换 LED
// HTTP Web 服务器。
//
//
void httpLEDToggle (void)
{
//
//切换控制卡上的 LED D1。
//
GPIO_togglePin (DEVICE_GPIO_PIN_LED1);
}
//
//
//由 lwIP 库调用。 可用于定期自定义任务。
//
//
空 lwIPHostTimerHandler (空)
{
}
现在、我可以实现 CPUI 以将 uint_16类型数据发送到 CM、并实现 CM 以通过 UDP_SEND 函数向外发送 uint_16类型数据。
但我希望 CPUI 通过 UDP_SEND 函数将 uint_16类型数据发送到 CM 和 CM 以向外发送 uint_8类型数据、我需要如何修改代码!
谢谢!
期待收到您的回复!