📄 halat91rm9200emac.h
字号:
#define AT91C_EMAC_UNI ((T_UWORD) 0x1 << 7) //(EMAC) Unicast Hash使能。当目的地址的6位指向的hash寄存器置为位,Unicast帧接收。#define AT91C_EMAC_BIG ((T_UWORD) 0x1 << 8) //(EMAC) MAC最多接收1522字节。(通常接收帧长为1518字节)#define AT91C_EMAC_EAE ((T_UWORD) 0x1 << 9) //(EMAC) 外部地址匹配使能。#define AT91C_EMAC_CLK ((T_UWORD) 0x3 << 10) //(EMAC) 系统时钟(MCK)分频产生MDC(MDIO时钟)。MCK64分频。#define AT91EMAC_CLK_HCLK_8 ((T_UWORD) 0x0 << 10) //(EMAC) MCK8分频。#define AT91EMAC_CLK_HCLK_16 ((T_UWORD) 0x1 << 10) //(EMAC) MCK16分频。#define AT91EMAC_CLK_HCLK_32 ((T_UWORD) 0x2 << 10) //(EMAC) MCK32分频。#define AT91EMAC_CLK_HCLK_64 ((T_UWORD) 0x3 << 10) //(EMAC) MCK64分频。#define AT91C_EMAC_RTY ((T_UWORD) 0x1 << 12) //(EMAC) 重新测试。#define AT91C_EMAC_RMII ((T_UWORD) 0x1 << 13) //(EMAC) 使能RMⅡ操作模式。复位时,选择MⅡ模式。///EMAC_SR(EMAC状态寄存器): (EMAC 偏移: 0x8)#define AT91C_EMAC_MDIO ((T_UWORD) 0x1 << 1) //(EMAC) MDIO引脚设置。0 = MDIO引脚未设置。#define AT91C_EMAC_IDLE ((T_UWORD) 0x1 << 2) //(EMAC) PHY逻辑运行。0 = PHY逻辑空闲。///EMAC_TCR(EMAC发送控制寄存器): (EMAC 偏移: 0x10)#define AT91C_EMAC_LEN ((T_UWORD) 0x7FF << 0)//(EMAC) 发送帧长。#define AT91C_EMAC_NCRC ((T_UWORD) 0x1 << 15) //(EMAC) 无CRC。假设CRC包含在写入的长度中,MAC不会在发送帧中添加CRC。///EMAC_TSR(发送状态寄存器): (EMAC 偏移: 0x14)#define AT91C_EMAC_OVR ((T_UWORD) 0x1 << 0) //(EMAC) 以太网发送缓冲溢出。#define AT91C_EMAC_COL ((T_UWORD) 0x1 << 1) //(EMAC) 冲突出现。#define AT91C_EMAC_RLE ((T_UWORD) 0x1 << 2) //(EMAC) 超出限制重试。#define AT91C_EMAC_TXIDLE ((T_UWORD) 0x1 << 3) //(EMAC) 发送器空闲。#define AT91C_EMAC_BNQ ((T_UWORD) 0x1 << 4) //(EMAC) 以太网发送缓冲器无队列。有帧发送就绪或有其他正在发送帧时清除。#define AT91C_EMAC_COMP ((T_UWORD) 0x1 << 5) //(EMAC) 发送结束。#define AT91C_EMAC_UND ((T_UWORD) 0x1 << 6) //(EMAC) 发送欠载运行。当发送DMA不能即时从存储器中读取数据时。此时,发送器强制破坏CRC。///EMAC_RSR(EMAC接收状态寄存器): (EMAC 偏移: 0x20)#define AT91C_EMAC_BNA ((T_UWORD) 0x1 << 0) //(EMAC) 缓冲器无效。尝试得到新缓冲器失败。#define AT91C_EMAC_REC ((T_UWORD) 0x1 << 1) //(EMAC) 帧接收。已收到一个或多个帧。///EMAC_ISR(EMAC中断状态寄存器): (EMAC 偏移: 0x24)#define AT91C_EMAC_DONE ((T_UWORD) 0x1 << 0) //(EMAC) 管理完成。PHY维护寄存器完成其操作。#define AT91C_EMAC_RCOM ((T_UWORD) 0x1 << 1) //(EMAC) 接收完成。帧已存入存储器。#define AT91C_EMAC_RBNA ((T_UWORD) 0x1 << 2) //(EMAC) 接收缓冲器无效。#define AT91C_EMAC_TOVR ((T_UWORD) 0x1 << 3) //(EMAC) 发送缓冲器溢出。#define AT91C_EMAC_TUND ((T_UWORD) 0x1 << 4) //(EMAC) 发送缓冲器欠载运行。#define AT91C_EMAC_RTRY ((T_UWORD) 0x1 << 5) //(EMAC) 重试限制超出。#define AT91C_EMAC_TBRE ((T_UWORD) 0x1 << 6) //(EMAC) 发送缓冲寄存器空。软件在发送DMA控制器中写入新缓冲器地址和长度。#define AT91C_EMAC_TCOM ((T_UWORD) 0x1 << 7) //(EMAC) 发送完成。#define AT91C_EMAC_TIDLE ((T_UWORD) 0x1 << 8) //(EMAC) 发送空闲。#define AT91C_EMAC_LINK ((T_UWORD) 0x1 << 9) //(EMAC) 当LINK引脚改变值时置位。#define AT91C_EMAC_ROVR ((T_UWORD) 0x1 << 10) //(EMAC) RX溢出。#define AT91C_EMAC_HRESP ((T_UWORD) 0x1 << 11) //(EMAC) 中止。当DMA传输时发生中止时置位。///EMAC_IER(EMAC中断使能寄存器): (EMAC 偏移: 0x28)///EMAC_IDR(EMAC中断禁止寄存器): (EMAC 偏移: 0x2c)///EMAC_IMR(EMAC中断屏蔽寄存器): (EMAC 偏移: 0x30)///EMAC_MAN(EMAC PHY维护寄存器): (EMAC 偏移: 0x34)#define AT91C_EMAC_DATA ((T_UWORD) 0xFFFF << 0)//(EMAC) 对于写操作,是要写如PHY的数据。读操作后,它的数据是由PHY读取的数据。#define AT91C_EMAC_CODE ((T_UWORD) 0x3 << 16) //(EMAC) 必须写入10,读和写相同。#define AT91C_EMAC_REGA ((T_UWORD) 0x1F << 18) //(EMAC) 寄存器地址。指定PHY访问寄存器地址。#define AT91C_EMAC_PHYA ((T_UWORD) 0x1F << 23) //(EMAC) PHY地址。#define AT91C_EMAC_RW ((T_UWORD) 0x3 << 28) //(EMAC) 无效。#define AT91C_EMAC_R ((T_UWORD) 0x2 << 28) //(EMAC) 读操作。#define AT91C_EMAC_W ((T_UWORD) 0x1 << 28) //(EMAC) 写操作。#define AT91C_EMAC_HIGH ((T_UWORD) 0x1 << 30) //(EMAC) 必须写入1,以保证PHY管理帧有效。#define AT91C_EMAC_LOW ((T_UWORD) 0x1 << 31) //(EMAC) 必须写入0,以保证PHY管理帧有效。///AT91RM9200 并行输入/输出控制器(PIO_PDR)#define AT91C_PIO_PA10 ((T_UWORD) 1 << 10) //引脚由PA10控制。#define AT91C_PA10_ETX1 ((T_UWORD) AT91C_PIO_PA10) //EMAC发送数据1。#define AT91C_PIO_PA11 ((T_UWORD) 1 << 11) //引脚由PA11控制。#define AT91C_PA11_ECRS_ECRSDV ((T_UWORD) AT91C_PIO_PA11) //EMAC Carrier Sense/Carrier Sense 有效数据#define AT91C_PIO_PA12 ((T_UWORD) 1 << 12) //引脚由PA12控制。#define AT91C_PA12_ERX0 ((T_UWORD) AT91C_PIO_PA12) //EMAC接收数据0。#define AT91C_PIO_PA13 ((T_UWORD) 1 << 13) //引脚由PA11控制。#define AT91C_PA13_ERX1 ((T_UWORD) AT91C_PIO_PA13) //EMAC接收数据1。#define AT91C_PIO_PA14 ((T_UWORD) 1 << 14) //引脚由PA14控制。#define AT91C_PA14_ERXER ((T_UWORD) AT91C_PIO_PA14) //EMAC接受错误。#define AT91C_PIO_PA15 ((T_UWORD) 1 << 15) //引脚由PA15控制。#define AT91C_PA15_EMDC ((T_UWORD) AT91C_PIO_PA15) //EMAC时钟管理。#define AT91C_PIO_PA16 ((T_UWORD) 1 << 16) //引脚由PA16控制。#define AT91C_PA16_EMDIO ((T_UWORD) AT91C_PIO_PA16) //Ethernet MAC Management Data Input/Output#define AT91C_PIO_PA7 ((T_UWORD) 1 << 7) //引脚由PA7控制。#define AT91C_PA7_ETXCK_EREFCK ((T_UWORD) AT91C_PIO_PA7) //Ethernet MAC Transmit Clock/Reference Clock#define AT91C_PIO_PA8 ((T_UWORD) 1 << 8) //引脚由PA8控制。#define AT91C_PA8_ETXEN ((T_UWORD) AT91C_PIO_PA8) //EMAC发送使能。#define AT91C_PIO_PA9 ((T_UWORD) 1 << 9) //引脚由PA9控制。#define AT91C_PA9_ETX0 ((T_UWORD) AT91C_PIO_PA9) //EMAC发送数据0。#define AT91C_PIO_PB29 ((T_UWORD) 1 << 29) //引脚由PB29控制。#define AT91C_PB29_IRQ0 ((T_UWORD) AT91C_PIO_PB29) //中断输入0(Phylink_isr)///AT91RM9200外围ID确定(用于中断)#define AT91C_ID_SYS ((T_UWORD) 1) //系统设备。#define AT91C_ID_PIOB ((T_UWORD) 3) //PIOB。#define AT91C_ID_EMAC ((T_UWORD) 24) //EMAC。#define AT91C_ID_IRQ0 ((T_UWORD) 25) //IRQ0(Phylink_isr)。///AT91RM9200设备基地址。#define pAT91C_BASE_PMC ((tpAT91_PMC) BASE_PMC) //(PMC) 基地址。#define pAT91C_BASE_PIOC ((tpAT91_PIO) BASE_PIOC)//(PIOC) 基地址。#define pAT91C_BASE_PIOB ((tpAT91_PIO) BASE_PIOB)//(PIOB) 基地址。#define pAT91C_BASE_PIOA ((tpAT91_PIO) BASE_PIOA)//(PIOA) 基地址。#define pAT91C_BASE_AIC ((tpAT91_AIC) BASE_AIC) //(AIC) 基地址。#define pAT91C_BASE_EMAC ((tpAT91_EMAC) BASE_EMAC)//(EMAC) 基地址。#define PHYHWADDR0 (0x01 << 23)#define PHYHWADDR (0x02 << 23)#define PHYREGWRITE (0x1 << 10)#define MiiBusy (0x1 << 11)#define PHY_CNTL_REG (0x00 <<18)#define PHY_STATUS_REG (0x01 <<18)#define PHY_ID_REG1 (0x02 <<18)#define PHY_ID_REG2 (0x03 <<18)#define PHY_ANA_REG (0x04 <<18)#define PHY_ANLPAR_REG (0x05 <<18)#define PHY_ANE_REG (0x06 <<18)#define PHY_ECNTL_REG1 (0x10 <<18)#define PHY_QPDS_REG (0x11 <<18)#define PHY_10BOP_REG (0x12 <<18)#define PHY_ECNTL_REG2 (0x13 <<18)#define PHY_INT_REG (0x1b <<18)#define PHY_TXCNTL_REG (0x1f <<18)///PHY Auto-negotiation Advertisement 寄存器。#define MBPS10 0#define MBPS100 1#define MBPS_AUTO 2#define HALF_DUPLEX 0 //半双工#define FULL_DUPLEX 1 //全双工#define AUTO_NEGOTIATE 2 //自动协商///PHY 中断寄存器。#define PHY_LINKUP_EN (1 << 8)#define Clear_PHY_INT (1 << 9)#define CODE ((T_UWORD) 0x2 << 16)///PHY 控制寄存器。#define SOFT_RESET_PHY (1 << 15)#define ENABLE_LOOPBACK (1 << 14)#define DR_100MB (1 << 13)#define ENABLE_AN (1 << 12)#define PHY_MAC_ISOLATE (1 << 10)#define RESTART_AN (1 << 9)#define PHY_FULLDUPLEX (1 << 8)#define PHY_COL_TEST (1 << 7)///PHY 状态寄存器。#define AN_COMPLETE (1 << 5)#define LINK_ON 0x4///TX PHY Controller。#define PHY_STATE_AN_NOT_COMPLETE 0xffe3#define PHY_STATE_100 0x8#define PHY_STATE_10 0x4#define PHY_STATE_FULL 0x10#define RESET_PHY 0x00020000/** * @brief * 将电源控制器(PMC)提供的外设时钟使能。 * @param[in] pPMC:指向电源控制器(PMC)控制结构体的指针。 * @param[in] uwPeriphIds:要使能的外设ID。 * @return 无。 */T_INLINE T_VOID AT91PMCEnablePeriphClock(tpAT91_PMC tpPMC, T_UWORD uwPeriphIds){ tpPMC->PMC_PCER = uwPeriphIds;}///PIO软件API。/** * @brief * 给外设分配引脚,I/O线分配给外设A或外设B。 * @param[in] pPio:指向并行输入/输出控制器(PIO)控制结构体的指针。 * @param[in] uwPeriphAEnable:外设A。 * @param[in] uwPeriphBEnable:外设B。 * @return 无。 */T_INLINE T_VOID AT91PIOCfgPeriph(tpAT91_PIO tpPio, T_UWORD uwPeriphAEnable, T_UWORD uwPeriphBEnable){ tpPio->PIO_ASR = uwPeriphAEnable; tpPio->PIO_BSR = uwPeriphBEnable; tpPio->PIO_PDR = (uwPeriphAEnable | uwPeriphBEnable);}/** * @brief * 禁用引脚。 * @param[in] pPio:指向并行输入/输出控制器(PIO)控制结构体的指针。 * @param[in] uwPeriphIds:禁用PIO控制相应引脚(使能引脚外设控制)。 * @return 无。 */T_INLINE T_VOID AT91PIODisable(tpAT91_PIO tpPio, T_UWORD uwFlag){ tpPio->PIO_PDR = uwFlag;}/** * @brief * 将电源控制器(PMC)提供给EMAC的外设时钟使能。 * @param[in] 无。 * @return 无。 */T_INLINE T_VOID AT91EMACCfgPMC (T_VOID){ AT91PMCEnablePeriphClock(pAT91C_BASE_PMC,((T_UWORD) 1 << AT91C_ID_EMAC));}/** * @brief * 给EMAC分配引脚,将I/O线分配给EMAC。 * @param[in] 无。 * @return 无。 */T_INLINE T_VOID AT91EMACCfgPIO (T_VOID){ AT91PIOCfgPeriph(pAT91C_BASE_PIOA, ((T_UWORD) AT91C_PA14_ERXER) | ((T_UWORD) AT91C_PA12_ERX0) | ((T_UWORD) AT91C_PA13_ERX1) | ((T_UWORD) AT91C_PA8_ETXEN) | ((T_UWORD) AT91C_PA16_EMDIO) | ((T_UWORD) AT91C_PA9_ETX0) | ((T_UWORD) AT91C_PA10_ETX1) | ((T_UWORD) AT91C_PA11_ECRS_ECRSDV) | ((T_UWORD) AT91C_PA15_EMDC) | ((T_UWORD) AT91C_PA7_ETXCK_EREFCK), 0);}#ifdef __cplusplus}#endif /* __cplusplus */#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -