使用LM3S8962 开发板 学习以太网的相关开发
8962集成了mac 和 phy 貌似没有协议栈, 现在还没看懂例程的lwip 所以索性先随便发数据吧.
unsigned char nMACAddr[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB};
先初始化以太网控制器
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);
//使能以太网时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);
// Enable Port F for Ethernet LEDs.
// LED0 Bit 3 Output
// LED1 Bit 2 Output
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3, GPIO_DIR_MODE_HW);
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
// Initialize the Ethernet controller for operation 初始化以太网控制器
nEthClk = SysCtlClockGet();
EthernetInitExpClk(ETH_BASE, nEthClk);
// Configure the Ethernet controller for normal operation
// Enable TX Duplex Mode
// Enable TX Padding
EthernetConfigSet(ETH_BASE, (ETH_CFG_TX_DPLXEN | ETH_CFG_TX_PADEN | ETH_CFG_TX_CRCEN));
HWREG(ETH_BASE + MAC_O_THR) = 0x0;
//MAC地址设置
EthernetMACAddrSet(ETH_BASE,nMACAddr);
//使能以太网
EthernetEnable(ETH_BASE);
while(1) //循环发送
{
while(HWREG(ETH_BASE + MAC_O_TR) & MAC_TR_NEWTX)
{
}
// Copy data to FIFO
pS = (unsigned long*)nSendData;
for ( i = 0; i < sizeof(nSendData) / 4; i++ )
HWREG(ETH_BASE + MAC_O_DATA) = *pS++;
RIT128x96x4DataDisplay(++count,66,36, 15,5) ; //计数
}
程序不是大问题, 问题在于到底要发什么,怎么发,以什么协议发。
我准备先发以太网帧, 以太网帧结构就不重复了, IEEE 802.3 我的网卡的mac被我改成 12 34 56 78 90 00 lm3s8962 的mac被我设为12 34 56 78 90 ab
发送的数据如下
//0x1c 0x04
/*0000*/ 0x12,0x34,0X56,0X78,0X90,0X00, 0X12,0X34,0X56,0X78,0X90,0XAB, 0X00,0X32,0X00,0X00,
/*0010*/ 0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
/*0020*/ 0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
/*0030*/ 0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00
结果在sniffer上接收不到
又从网上寻找例程 ,发现 有一个例程在 发送的数据前加了2个字节 0x1c 0x04
我同样加入 0x1c 0x04 后, 能接收到
0x1c 0x04 原来是代表后面数据的长度的 ,这样就成为了 LLC帧结构
继续坚持我的 以太网帧结构
将 sa 后面的 0x00 0x32 改为 0x08 0x00 (ip 帧头) 发送成功