您的位置 首页 设计

LM3S9B96 的以太网装备

以太网是TI公司9b96这款芯片特色外设,或者说之所以选择9b96这款芯片,就是要用它的以太网。但是开发板给的光盘中有关以太网的例子,如enet…

以太网是TI公司9b96这款芯片特征外设,或者说之所以挑选9b96这款芯片,便是要用它的以太网。可是开发板给的光盘中有关以太网的比如,如enet_lwip,初学者搞不清楚这个目录中的这些文件是干什么的,这些文件都需要吗?

咱们能够看出enet_lwip比如文件结构比较紊乱,不知道哪些是咱们要用到的源文件,不知道哪些是该工程有必要用到的库文件,有些学生或许自己新建一个工程,可是编译时会呈现过错,提示找不到包括的头文件,但又不知道这些头文件到哪去找?
下面是以太网最简略的比如,用网络帮手发送数据,能够进入到以太网中止处理函数中。

/* 头文件包括区 ————————————————————–*/
#include “string.h” // strcmp函数和memset函数
#include “inc/lm3s9b96.h”
#include “inc/hw_ints.h”
#include “inc/hw_memmap.h”
#include “inc/hw_nvic.h”
#include “inc/hw_types.h”
#include “inc/hw_i2c.h”
#include “driverlib/i2c.h”
#include “driverlib/ethernet.h”
#include “driverlib/flash.h”
#include “driverlib/gpio.h”
#include “driverlib/timer.h”
#include “driverlib/interrupt.h”
#include “driverlib/sysctl.h”
#include “driverlib/systick.h”
#include “driverlib/uart.h”
#include “driverlib/watchdog.h”
#include “utils/locator.h”
#include “utils/lwiplib.h”
#include “utils/uartstdio.h”
#include “utils/ustdlib.h”
#include “drivers/set_pinout.h”
#include “utils/uartstdio.h”

/* 数据类型界说区 ————————————————————*/
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef enum {FALSE = 0, TRUE = !FALSE} bool;

/* Defines for setting up the system clock ———————————–*/
#define SYSTICKHZ 100
#define SYSTICKMS (1000 / SYSTICKHZ)
#define SYSTICKUS (1000000 / SYSTICKHZ)
#define SYSTICKNS (1000000000 / SYSTICKHZ)

/* Position and movement granularity for the status indicator shown while the IP address is being determined——–*/
#define STATUS_X 50
#define STATUS_Y 100
#define MAX_STATUS_X (320 – (2 * STATUS_X))
#define ANIM_STEP_SIZE 8

/* 9b96主板的PF1宏界说 <调试时看门狗对应的LED> ——————————*/
#define LED_PERIPH SYSCTL_PERIPH_GPIOF
#define LED_PORT GPIO_PORTF_BASE
#define LED_PIN GPIO_PIN_1
#define LED_ON 1 << 1
#define LED_OFF 0

BYTE UDPData[1020] = {0x30}; // 全为0,网络帮手时刻戳显现有问题???
struct ip_addr local_addr;
struct udp_pcb *UdpPcb;
struct pbuf *p_tx; // the pointer of transmit buffer
struct ip_addr IP_Addr_Tmp; // 用于UDP_Receive函数中,暂时保存UdpPcb->remote_ip中的IP地址

/* External Application references ——————————————-*/
extern void fs_init(void);
extern void fs_tick(unsigned long ulTickMS);

//*****************************************************************************
//
// The error routine that is called if the driver library encounters an error.
//
//*****************************************************************************
#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif

//*****************************************************************************
//
// 体系时钟初始化函数
//
//*****************************************************************************
void SysClk_Init(void)
{
// 装备体系主时钟, 运用外部晶振16M.
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
}

//*****************************************************************************
//
// 以太网初始化函数
//
//*****************************************************************************
void ETH_Init(void)
{
DWORD ulUser0, ulUser1;
BYTE pucMACArray[6];

// Set the pinout appropriately for this board.
PinoutSet();

// Enable and Reset the Ethernet Controller.
SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);

// PA4(以太网A、B网切换)管脚为输出(数字功用默许使能,默许2mA驱动)
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_4);

// Enable Port F for Ethernet LEDs.
// LED0 Bit 3 Output
// LED1 Bit 2 Output
GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3);

// Configure the hardware MAC address for Ethernet Controller filtering of
// incoming packets.
ulUser0 = 0x00000080;
ulUser1 = 0x00ACDE48;

// Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC
// address needed to program the hardware registers, then program the MAC
// address into the Ethernet Controller registers.
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);

// Initialze the lwIP library, using STATIC.
lwIPInit(pucMACArray, 0xC0A8010A, 0xFFFFFF00, 0, IPADDR_USE_STATIC); //192.168.1.10
}

/******* 这是一个回调函数,当有UDP数据收到时会被调用********/
// addr:笔记本的IP地址(存放向开发板发送数据的PC的IP地址)
// port:笔记本的端口号(远端端口号)
void UDP_Receive(void *arg, struct udp_pcb *upcb, struct pbuf *p_rx,
struct ip_addr *addr, u16_t port)
{
memset(UDPData, 0, 1020);

if (p_rx != NULL) // 假如收到的数据不为空
{
memcpy(UDPData, (char *)p_rx->payload, p_rx->len);

p_tx->len = p_tx->tot_len = p_rx->len;
IP_Addr_Tmp = UdpPcb->remote_ip;
UdpPcb->remote_ip = *addr; // 获取笔记本的IP地址(远端IP地址)
udp_send(UdpPcb, p_tx);
}
UdpPcb->remote_ip = IP_Addr_Tmp;

pbuf_free(p_rx); // 开释缓冲区数据
}

// 假如在回调函数中发送数据,不必connect; 在回调函数外发送数据有必要要connect,不然接纳不到数据
void UDP_Test_Init(void)
{
p_tx = pbuf_alloc(PBUF_RAW, sizeof(UDPData), PBUF_RAM); // 依照指定类型分配一个pbuf结构体 // struct pbuf *p_tx;
p_tx->payload = (void *)UDPData; // DI16实践发送数据内存区

local_addr.addr = 0x0A01A8C0; // 本地IP地址:192.168.1.10

UdpPcb = udp_new(); // 创立udp协议操控块
udp_bind(UdpPcb, &local_addr, 1025); // 在协议操控块中绑定本地ip地址和本地端口号,本地:开发板(程序下到开发板中)
udp_connect(UdpPcb, IP_ADDR_ANY, 1025); // 与远端udp主机树立衔接,远端:笔记本
udp_recv(UdpPcb, UDP_Receive, NULL); // 设置数据接纳时的回调函数
}

//*****************************************************************************
//
// 主函数
//
//*****************************************************************************
int main(void)
{
// 体系时钟初始化,16MHz
SysClk_Init();

// 以太网初始化
ETH_Init();

UDP_Test_Init();

// Enable processor interrupts.
IntMasterEnable();

while (1)
{
}
}

//*****************************************************************************
//
// The interrupt handler for the SysTick interrupt.
//
//*****************************************************************************
void SysTickIntHandler(void)
{
// Call the lwIP timer handler.
lwIPTimer(SYSTICKMS);
}

//*****************************************************************************
//
// Required by lwIP library to support any host-related timer functions.
//
//*****************************************************************************
void lwIPHostTimerHandler(void)
{
}

依照前面讲的中止映射表的装备,将startup_ewarm.c文件中增加两处代码。编译、运转即可。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/275157.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部