?? main.c
字號(hào):
//CP2200片選置高
/***********************************************************************/
void CP220x_RST_High(void)
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
// P4 |= 0x20;
P5 |= 0x2; // Allow /RST to rise while(!(P5 & 0x2));
SFRPAGE=SFRPAGE_SAVE;
}
/***********************************************************************/
//物理層出始化
/***********************************************************************/
unsigned char PHY_Init()
{
unsigned char temp_char;
unsigned char retval = 0;
//--------------------------------------------------------------------------
//以下部分為物理層自適應(yīng)同步,詳見(jiàn)CP2200數(shù)據(jù)手冊(cè)
//--------------------------------------------------------------------------
PHYCN = 0x00; // 禁止物理層寄存器
TXPWR = 0x80;
PHYCF = ( SMSQ | JABBER | ADPAUSE | AUTOPOL );
// 使能物理層
PHYCN = PHYEN;
// 物理層上電
PHYCN = ( PHYEN | TXEN | RXEN ); // 使能傳輸與接收寄存器
// 喚醒中斷
temp_char = INT1;
//--------------------------------------------------------------------------
//以下是物理層初始化
//--------------------------------------------------------------------------
PHYCN = 0x00; //禁止物理層寄存器
PHYCF = ( SMSQ | LINKINTG | JABBER | AUTONEG | ADPAUSE | AUTOPOL ); //進(jìn)行連接完整性與自適應(yīng)配置
PHYCN = PHYEN;//使能物理層
PHYCN = ( PHYEN | TXEN | RXEN ); // 使能傳輸與接收寄存器
temp_char = INT1;
while(1){
if(INT1RD & (ANCINT | ANFINT))break; // 判斷初始化是成功
}
temp_char = INT1RD;
temp_char &= (ANCINT | ANFINT);
if(temp_char & ANFINT) // 檢測(cè)自適應(yīng)是否失敗
{
retval = LINK_ERROR;
}
else
if(temp_char == ANCINT) // 檢測(cè)自適應(yīng)是否通過(guò)
{
retval = 0;
IOPWR = 0x0C; // 使能 Link LED and Activity LED
}
else
{
retval = LINK_ERROR;
}
return retval;
}
/***********************************************************************/
//數(shù)據(jù)鏈路層初始化
/***********************************************************************/
void MAC_Init(void)
{
//判斷是否為全雙工通訊,并進(jìn)行相關(guān)設(shè)置 詳見(jiàn)CP2200數(shù)據(jù)手冊(cè)
if(PHYCN & 0x10)
{
MAC_Write(MACCF, 0x40B3);
MAC_Write(IPGT, 0x0015);
}
else
{
MAC_Write(MACCF, 0x4012);
MAC_Write(IPGT, 0x0012);
}
MAC_Write(IPGR, 0x0C12);
MAC_Write(MAXLEN, 0x05EE);
// 讀出廠前設(shè)置的MAC地址
FLASHADDRH = 0x1F;
FLASHADDRL = 0xFA;
MYMAC.Char[0] = FLASHAUTORD;
MYMAC.Char[1] = FLASHAUTORD;
MYMAC.Char[2] = FLASHAUTORD;
MYMAC.Char[3] = FLASHAUTORD;
MYMAC.Char[4] = FLASHAUTORD;
MYMAC.Char[5] = FLASHAUTORD;
my_hwaddr[0]=MYMAC.Char[0];
my_hwaddr[1]=MYMAC.Char[1];
my_hwaddr[2]=MYMAC.Char[2];
my_hwaddr[3]=MYMAC.Char[3];
my_hwaddr[4]=MYMAC.Char[4];
my_hwaddr[5]=MYMAC.Char[5];
MAC_SetAddress(&MYMAC);
MAC_Write(MACCN, 0x0001); // 允許回環(huán)模式
}
/************************************************************************/
//訪問(wèn)MAC間接寄存器
/************************************************************************/
void MAC_Write(unsigned char mac_reg_offset, unsigned int mac_reg_data)
{
MACADDR = mac_reg_offset;
MACDATAH = (mac_reg_data >> 8); // Copy High Byte
MACDATAL = (mac_reg_data & 0xFF); // Copy Low Byte
MACRW = 0;
return;
}
/**************************************************************************/
//設(shè)置MAC地址
/**************************************************************************/
void MAC_SetAddress(MACADDRESS* pMAC)
{
UINT1 temp_int;
temp_int.Char[0] = pMAC->Char[5];
temp_int.Char[1] = pMAC->Char[4];
MAC_Write(MACAD0, temp_int.Int);
temp_int.Char[0] = pMAC->Char[3];
temp_int.Char[1] = pMAC->Char[2];
MAC_Write(MACAD1, temp_int.Int);
temp_int.Char[0] = pMAC->Char[1];
temp_int.Char[1] = pMAC->Char[0];
MAC_Write(MACAD2, temp_int.Int);
return;
}
/**************************************************************************/
// 以太網(wǎng)幀接收函數(shù)
/**************************************************************************/
void eth_rcve(UCHAR xdata * inbuf)
{
ETH_HEADER xdata * eth;
eth = (ETH_HEADER xdata *)inbuf;
if (eth->frame_type < 1520) // 幀長(zhǎng)度不能超過(guò)IEEE 802標(biāo)準(zhǔn)歸定
{
return;
}
switch (eth->frame_type) //根據(jù)接收到的數(shù)據(jù)包類(lèi)型,選擇不同的處理方式
{
case ARP_PACKET:
arp_rcve(inbuf);
break;
case IP_PACKET:
ip_rcve(inbuf);
break;
default:break;
}
}
/*************************************************************************/
//以太網(wǎng)幀傳輸函數(shù)--------傳輸層
/*************************************************************************/
void eth_send(UCHAR xdata * outbuf, UCHAR * hwaddr, UINT ptype, UINT len)
{
ETH_HEADER xdata * eth;
eth = (ETH_HEADER xdata *)outbuf;
//加入14位的以太網(wǎng)數(shù)據(jù)幀頭標(biāo)識(shí)
memcpy(eth->dest_hwaddr, hwaddr, 6);
memcpy(eth->source_hwaddr, my_hwaddr, 6);
eth->frame_type = ptype;
CP220x_Send(outbuf, len + 14); // 增加數(shù)據(jù)包長(zhǎng)度
}
/*************************************************************************/
// CP2200發(fā)送函數(shù)
/*************************************************************************/
void CP220x_Send( UCHAR xdata * outbuf, UINT len)
{
int i;
unsigned int ramaddr;
// 定義宏來(lái)增加地址指針
#define INC_RAMADDR ramaddr++; \
RAMADDRH = (ramaddr >> 8);\
RAMADDRL = (ramaddr & 0x00FF);
while(TXBUSY); //等待傳輸結(jié)束
TXSTARTH = 0x00;
TXSTARTL = 0x00;
RAMADDRH = 0x00; //地址設(shè)為零
RAMADDRL = 0x00;
ramaddr = 0x0000;
for(i = 0; i < len; i++)
{
RAMTXDATA = outbuf[i];
INC_RAMADDR
}
while(ramaddr < 64) //將不足64字節(jié)長(zhǎng)度的數(shù)據(jù)填充到64字節(jié)
{
RAMTXDATA = 0;
INC_RAMADDR
}
ramaddr--;
TXENDH = (ramaddr >> 8); //將RAM地址減一后賦給TXEND使其地址為)X0040
TXENDL = (ramaddr & 0x00FF);
TXSTARTH = 0x00;
TXSTARTL = 0x00; //將TXSTAR地址歸零
TXCN = 0x01; //向TXGO寫(xiě)1開(kāi)始傳輸
}
/****************************************************************/
//CP2200芯片接收數(shù)據(jù)函數(shù)
/****************************************************************/
UCHAR xdata * rcve_frame(void)
{
bit rx_ok;
bit skip = 0;
UINT1 cplen;
unsigned int i;
UCHAR xdata * buf;
unsigned char interrupt_read;
unsigned char valid_bits;
unsigned char num_packets;
interrupt_read = INT1;
interrupt_read = INT0; //清中斷標(biāo)志
if( interrupt_read & RXINT) //判斷接收中斷是否產(chǎn)生
{
valid_bits = TLBVALID; //對(duì)接收數(shù)據(jù)包進(jìn)行統(tǒng)計(jì)
for(num_packets = 0; valid_bits; num_packets++)
{
valid_bits &= valid_bits - 1;
}
if( num_packets >= 7) //接收區(qū)超過(guò)7個(gè)數(shù)據(jù)包,停止接收
{
RXCN = RXINH;
}
}
//以下步驟參考CP2200數(shù)據(jù)手冊(cè)的接收部分
rx_ok = (CPINFOL & RXOK) && (CPINFOH & RXVALID);
if(rx_ok)
{
cplen.Char[0] = CPLENH;
cplen.Char[1] = CPLENL;
buf=inbuf1;
}
else
{
cplen.Int = 0;
skip = 1;
buf = NULL;
}
if(1)
{
for(i = 0; i < cplen.Int; i++)
{
buf[i] = RXAUTORD;
}
rcve_buf_allocated = TRUE;
}
else
{
cplen.Int = 0;
skip = 1;
}
if(skip)
{
RXCN |= 0x02;
}
else
{
RXCN |= 0x04;
}
if(TLBVALID == 0x00)
{
RXCN = 0x00;
}
return(buf);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -