LM3S9b96以太网收发问题???---(附部分源码)

2019-03-24 16:18发布

芯片型号:LM3S9b96 C1和C3;
              客户端用
问题:
1 用UDP,一旦启动发送函数,程序就跑飞了(进入硬件错误中断);
2 发送数据时,无论如何设置始终是1秒发送一次数据;

求高手指点???急需解决中.......................

// systick中断处理函数//-----------------------------------------------------------------------------
void SysTickHandler(void)
{ // 调用lwip定时处理函数
lwIPTimer(SYSTICKMS);
}

//这是一个回调函数,当有UDP数据收到时会被调用
void UDP_Receive(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{ struct ip_addr destAddr = *addr;
if(p != NULL){ // 如果收到的数据不为空
udp_sendto(upcb,p,&destAddr,port); // 将收到的数据再发送出去
pbuf_free(p); // 释放缓冲区数据
}
}
void lwIPHostTimerHandler(void)
{
static uLong ulLastIPAddress = 0;
static long lStarPos = 0;
static tBoolean bIncrementing = true; uLong ulIPAddress; tRectangle sRect;
ulIPAddress = lwIPLocalIPAddrGet();
// If IP Address has not yet been assigned, update the display accordingly if(ulIPAddress == 0){
UART_TxStr("ulIPAddress == 0 >");
} // Check if IP address has changed, and display if it has.
else{
if(ulLastIPAddress != ulIPAddress)
{ ulLastIPAddress = ulIPAddress; // 显示IP
UART_TxStr("IP地址:");
DisplayIPAddress(ulIPAddress);
ulIPAddress = lwIPLocalNetMaskGet();
UART_TxStr("子网掩码:");
DisplayIPAddress(ulIPAddress);
ulIPAddress = lwIPLocalGWAddrGet();
UART_TxStr("默认网关:");
DisplayIPAddress(ulIPAddress);
}
}
}

void EthernetConfig(void)
{
uLong ulUser0, ulUser1;
uChar pucMACArray[8]; // 使能端口F来作为以太网的LED使用
GPIOPinConfigure(GPIO_PF2_LED1);
GPIOPinConfigure(GPIO_PF3_LED0);
GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3); //从用户寄存器中 读取MAC地址
//ROM_FlashUserGet(&ulUser0, &ulUser1);
ulUser0 = 0x00563412; // 配置MAC地址为12-34-56-78-9a-ef
ulUser1 = 0x00ef9a78;
if((ulUser0 == 0xffffffff) || (ulUser1 == 0xffffffff)){ // MAC没有编程
UARTprintf("MAC Address Not Programmed! ");
}
else{ //转换用户寄存器到MAC地址
pucMACArray[0] = ((ulUser0 >> 0) & 0xff);
pucMACArray[1] = ((ulUser0 >> 8) & 0xff);
pucMACArray[2] = ((ulUser0 >> 16) & 0xff);
pucMACArray[3] = ((ulUser1 >> 0) & 0xff);
pucMACArray[4] = ((ulUser1 >> 8) & 0xff);
pucMACArray[5] = ((ulUser1 >> 16) & 0xff);
// 初始化lwIP协议栈 静态IP
// IP地址: 192.168.1.20
// 子网掩码:255.255.255.0
// 默认网关:192.168.1.254
lwIPInit(pucMACArray,(Ethernet_Addr[0]<<24)|(Ethernet_Addr[1]<<16)|(Ethernet_Addr[2]<<8)|Ethernet_Addr[3],
(GateWay_Addr[0]<<24)|(GateWay_Addr[1]<<16)|(GateWay_Addr[2]<<8)|GateWay_Addr[3],
(Subnet_Addr[0]<<24)|(Subnet_Addr[1]<<16)|(Subnet_Addr[2]<<8)|Subnet_Addr[3], IPADDR_USE_STATIC);
}
}

int main(void)
{
struct udp_pcb *UdpPcb;
struct ip_addr ipaddr;
struct pbuf *p;
const static unsigned char UDPData[]="TI lm3s9b96 测试! LwIP UDP客户端测试! ";
//JtagWait(); // 防止JTAG失效,重要!
SystemInit(); // 设置时钟 66.7Mhz 初始化 定时器 串口
/****************** 初始化客户端UDP ******************/
EthernetConfig();
IP4_ADDR(&ipaddr,DEthernet_Addr[0],DEthernet_Addr[1],
DEthernet_Addr[2],DEthernet_Addr[3]); // 远程主机地址
UdpPcb = udp_new();
udp_bind(UdpPcb,IP_ADDR_ANY,4000); // 绑定本地IP地址
udp_connect(UdpPcb,&ipaddr,5000); // 连接远程主机
udp_recv(UdpPcb,UDP_Receive,NULL); // 设置数据接收时的回调函数
// 主循环
while(1){
if(systemVariable.xFlag_200ms){
systemVariable.xFlag_200ms=0;
p = pbuf_alloc(PBUF_TRANSPORT,strlen(UDPData),PBUF_RAM);
if(p != NULL){
memcpy(p->payload, UDPData,strlen(UDPData));
udp_send(UdpPcb,p);
pbuf_free(p);
}
}
}

说明: 其他的API函数都是调用TI驱动程序.

[ 本帖最后由 ekinwyoming 于 2011-4-5 10:30 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
ekinwyoming
1楼-- · 2019-03-24 23:22
< 感觉驱动程序极其不稳定,用的好失望哦
shilaike
2楼-- · 2019-03-25 00:37
 精彩回答 2  元偷偷看……
academic
3楼-- · 2019-03-25 04:00
检查一下堆栈大小的设置
jkhu
4楼-- · 2019-03-25 05:23
您这么说的太笼统,描述的详细些,或者贴些代码,这样才好帮助您。
ekinwyoming
5楼-- · 2019-03-25 06:41
 精彩回答 2  元偷偷看……
fengzhang2002
6楼-- · 2019-03-25 10:09
楼主先用TI自带的例程试一试,硬件错误中断一般是外设没有使能,网络数据发送慢可以在后面加一句tcp_output(pcb);

一周热门 更多>

相关问题

    相关文章