分类: 嵌入式
2011-04-02 16:21:04
LPC1700 Coocox Lwip 调试心得
Hyfeng(hyfeng18@126.com)
今天刚刚将Coocox网站上的一个基于NXP LPC1766的web服务器的例程移植到了周立功公司出的SmartCortex M3-1700的开发板上面,在例程中使用的开发板是一款叫MCB1700的开发板,虽然这两块开发板使用的MCU都是NXP LPC1766,但是它们两者使用的网络收发器是不一样的,在MCB1700中使用的是DP83848C,而周立功公司生产的SmartCortex M3使用的是KSZ8041L。由于这是两款不同的网络收发器,因此必须修改例程中关于DP83848C那部分的硬件的相关代码,其实就是关于芯片的初始化函数以及相关的寄存器读写函数。具体的修改步骤如下:
1. 芯片的初始函数
由于芯片不同因此初始化函数以及寄存器的操作也会有一些不同,对于这里的初始化函数需要修改的并不是很多,主要就是添加一段确定PHY地址的代码。根据MII Mgmt地址寄存器可知MII最多只能管理31个收发控制器并且可以访问32个控制器中的寄存器,由于可以管理的数目比较少就可以通过遍历的方法去确定收发器的PHY地址。通过轮询1-31这31个地址,而且对于KSZ8041L地址为02H的寄存器读出来的值是一个产品ID由于这个ID是固定并且可以根据数据手册获得,因此可以利用这个ID来判读收发器PHY地址,代码如下:
for(i=1;i<32;i++)
{
PHYID = 0;
PHYID = readPHY(i, 2);
PHYID = PHYID&0x00FF;
if(PHYID == 0x0022) {
break;
}
}
if(i >= 32)
while(1);
PHYID = i;
这里PHYID实际上就是PHY地址,这样就MII接口就可以通过这个地址去访问收发器中的寄存器地址来控制收发器,例如:收发器复位、设置速度等等…
2. 读取寄存器值的函数
控制通过MII接口去管理收发器的,如果确定好上面的PHY地址,那么读取收发器的值就不会很简单了,代码如下:
unsigned short readPHY(unsigned char phyadd, unsigned char PhyReg)
{
unsigned int tout;
EMAC->MADR = (phyadd<<8) | PhyReg;
EMAC->MCMD = MCMD_READ;
tout = 0;
for (tout = 0; tout < MII_RD_TOUT; tout++) {
if ((EMAC->MIND & MIND_BUSY) == 0) {
break;
}
}
EMAC->MCMD = 0;
return (EMAC->MRDD);
}
3. 设置寄存器值的函数
设置寄存器的值的函数代码如下:
void writePHY(unsigned char phyadd, int PhyReg, int Value)
{
unsigned int tout;
EMAC->MADR = (phyadd<<8) | PhyReg;
EMAC->MWTD = Value;
tout = 0;
for(; tout < MII_WR_TOUT; tout++){
if((EMAC->MIND & MIND_BUSY) == 0){
break;
}
}
}
最后要想使用这个例程必须将初始化函数中那些使用write_PHY和read_PHY的函数修改成使用上面添加的读写函数即可。经过上面的修改就可以在周立功的SmartCortexM3上面使用Coocox的Lwip例程。