CH579芯片,因為只是使用簡單的網(wǎng)絡傳輸,不想用官方的LIB庫,只需要抓取ETH貞數(shù)據(jù),自己寫網(wǎng)絡協(xié)議。
但初始化網(wǎng)絡一直不成功,進不了中斷,望提供協(xié)助。
如果有官方例子,麻煩發(fā)一份: 個人信息保護,已隱藏
以下是我的測試代碼
#include "CH57x_common.h"
__align(4) UINT8 eth_dma_tx_buf[1500];
__align(4) UINT8 eth_dma_rx_buf[1500];
void ch579_eth_init(uint8_t *mac_addr)
{
? ? printf("init eth\n");
? ? //進入安全訪問模式
? ? R8_SAFE_ACCESS_SIG = 0x57;
? ? R8_SAFE_ACCESS_SIG = 0xA8;
? ?
? ? //打開以太網(wǎng)時鐘
? ? R8_SLP_CLK_OFF1 &= (~RB_SLP_CLK_ETH);
? ?
? ? //打開以太網(wǎng)電源
? ? R8_SLP_POWER_CTRL &= (~RB_SLP_ETH_PWR_DN);
? ?
? ? //退出安全訪問模式
? ? R8_SAFE_ACCESS_SIG = 0x00;
? ? //使能ETH管腳?
? ? R16_PIN_ANALOG_IE |= RB_PIN_ETH_IE;
? ? //中斷使能寄存器,該開的都開吧
? ? R8_ETH_EIE = RB_ETH_EIE_INTIE | RB_ETH_EIE_RXIE | RB_ETH_EIE_LINKIE \
? ? ? ? | RB_ETH_EIE_TXIE | RB_ETH_EIE_R_EN50 | RB_ETH_EIE_TXERIE | RB_ETH_EIE_RXERIE;
? ?
? ? R8_ETH_EIR = 0xFF; ?//清除中斷標志
? ? R8_ETH_ESTAT = RB_ETH_ESTAT_INT | RB_ETH_ESTAT_BUFER;//清除狀態(tài)
? ? //收發(fā)模塊復位
? ? R8_ETH_ECON1 |= RB_ETH_ECON1_TXRST | RB_ETH_ECON1_RXRST;
? ? R8_ETH_ECON1 &= ~(RB_ETH_ECON1_TXRST | RB_ETH_ECON1_RXRST);
? ? R32_ETH_MACON = 0;
? ? R8_ETH_MACON1 |= RB_ETH_MACON1_MARXEN;//MAC接收使能
? ? R8_ETH_MACON2 &= 0x1F;
? ? R8_ETH_MACON2 |= 0x20;
? ? R8_ETH_MACON2 |= RB_ETH_MACON2_TXCRCEN;//硬件填充CRC
? ? R8_ETH_MACON2 &= ~RB_ETH_MACON2_HFRMEN;//不接收巨型幀
? ? R8_ETH_MACON2 |= RB_ETH_MACON2_FULDPX;//全雙工
? ? R16_ETH_MAMXFL = 1500; //MTU=1500=0x05DC 最大包長
? ? //MAC 注意字節(jié)順序
? ? R16_ETH_MAADRH = macaddr[0] << 8 | macaddr[1];
? ? R32_ETH_MAADRL = macaddr[2] << 24 | macaddr[3] << 16 | macaddr[4] << 8 | macaddr[5];
? ? //DMA buffers
? ? R16_ETH_ETXST = (uint32_t)eth_dma_tx_buf;
? ? R16_ETH_ERXST = (uint32_t)eth_dma_rx_buf;
? ? ? ?
? ? //使能接收
? ? R8_ETH_ECON1 |= RB_ETH_ECON1_RXEN;//接收使能
? ?
? ? //開啟中斷
? ? NVIC_EnableIRQ(ETH_IRQn);
? ? ? ?
? ? printf("init eth end!\n");
}
//------------------------------------------------------------
void ETH_IRQHandler(void) // 以太網(wǎng)中斷?
{
? ? printf("I");
? ? //接收到數(shù)據(jù)包
? ? if ((R8_ETH_EIR & RB_ETH_EIR_RXIF) != 0)
? ? {
? ? ? ? printf("Get data\n");
? ? ? ? R8_ETH_EIR |= RB_ETH_EIR_RXIF; //寫1 清除中斷
? ? }
? ? ??
? ? //接收錯誤
? ? if ((R8_ETH_EIR & RB_ETH_EIE_RXERIE) != 0)
? ? {
? ? ? ? printf("Get error\n");
? ? ? ? R8_ETH_EIR |= RB_ETH_EIE_RXERIE; //清除中斷
? ? }
? ? //發(fā)送完成
? ? if ((R8_ETH_EIR & RB_ETH_EIR_TXIF) != 0)
? ? {
? ? ? ? printf("send\n");
? ? ? ? R8_ETH_EIR |= RB_ETH_EIR_TXIF; //清除中斷
? ? }
? ? //發(fā)送錯誤
? ? if ((R8_ETH_EIR & RB_ETH_EIE_TXERIE) != 0)
? ? {
? ? ? ? printf("send error\n");
? ? ? ? R8_ETH_EIR |= RB_ETH_EIE_TXERIE; //清除中斷
? ? }
? ? //Link 變化標志
? ? if ((R8_ETH_EIR & RB_ETH_EIR_LINKIF) != 0)
? ? {
? ? ? ? printf("link..\n");
? ? ? ? R8_ETH_EIR |= RB_ETH_EIR_LINKIF; //清除中斷
? ? }
? ? ? ?
}
//-----------------------------------------------------------
int main()
{
? ? //--LAN LED燈使用-------
? ? GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA); //LAN_CONN_LED
? ? GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA); //LAN_DATA_LED
? ? GPIOB_ResetBits(GPIO_Pin_4);
? ? GPIOB_ResetBits(GPIO_Pin_7); ? ?
? ? //-----------------------------------------
? ?
? ? //--UART1:printf -------------------------
? ? GPIOA_SetBits(GPIO_Pin_9); ?//PA9=TX1 = printf
? ? GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); ?//PA8=RX1, ?RXD-配置上拉輸入
? ? GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // TXD-配置推挽輸出,注意先讓IO口輸出高電平
? ? UART1_DefInit();
? ? //-----------------------------------------
? ? UINT8 mac_addr[] = { 0x00, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
? ? ch579_eth_init(mac_addr);
? ? while(1)
? ? {
? ? ? ? mDelaymS( 100 ); ? ?//100ms
? ? ? ? GPIOB_InverseBits(GPIO_Pin_0); ?//LED翻轉(zhuǎn) 測試
? ? };
}