⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib_emac.h

📁 基于sam7x256平台做的CAN与网口互转接口
💻 H
📖 第 1 页 / 共 2 页
字号:

#define SPECIFIED_INTR_REG                    21                /* PHY Specified Interrupt Reg */


/*
*********************************************************************************************************
*                                               DEFINES
*********************************************************************************************************
*/

#define  EMAC_MAN_WRITE             (0x01 << 28)                        /* 01: Transfer is a write.                             */
#define  EMAC_MAN_READ              (0x02 << 28)                        /* 10: Transfer is a read.                              */
#define  EMAC_MAN_CODE              (0x02 << 16)                        /* IEEE Code. MUST have value of 10.                    */

#define  EMAC_RXBUF_ADDRESS_MASK    (0xFFFFFFFC)                        /* Addr of Rx Descriptor Buf's (wrap/ownership ignored  */
#define  EMAC_RXBUF_ADD_WRAP        (0x01 <<  1)                        /* This is the last buffer in the ring.                 */
#define  EMAC_RXBUF_SW_OWNED        (0x01 <<  0)                        /* Software owns the buffer.                            */
#define  EMAC_RXBUF_LEN_MASK        (0x00000FFF)                        /* Length of frame including FCS. (12 bits)             */
#define  EMAC_RXBUF_SOF_MASK        (0x01 << 14)                        /* Start of frame mask                                  */
#define  EMAC_RXBUF_EOF_MASK        (0x01 << 15)                        /* End of frame mask                                    */
#define  EMAC_RXBUF_OFF_MASK        (0x03 << 12)                        /* Data offset mask (up to three bytes possible)        */

#define  EMAC_TXBUF_ADD_WRAP        (0x01 << 30)                        /* This is the last buffer in the ring.                 */
#define  EMAC_TXBUF_TX_SIZE_MASK    (0x000007FF)                        /* Length of frame including FCS. (11 bits)             */
#define  EMAC_TXBUF_ADD_LAST        (0x01 << 15)                        /* This is the last buffer for the current frame        */

#define  EMAC_TXBUF_STATUS_USED     (CPU_INT32U)(0x01 << 31)            /* Status Used Bit. Indicates when a buf has been read  */

/*
*********************************************************************************************************
*                                               MACROS
*********************************************************************************************************
*/

#define  EMAC_MAN_REGA(_x_)         (_x_         << 18)                 /* Specifies the register in the PHY to access.         */
#define  EMAC_MAN_PHYA(_x_)        ((_x_ & 0x1F) << 23)                 /* PHY address. Normally 0.                             */
#define  EMAC_MAN_DATA(_x_)         (_x_ & 0xFFFF)                      /* PHY Read/Write Data Mask. */

/*
*********************************************************************************************************
*                                     PHYSICAL LAYER DEFINITIONS
*********************************************************************************************************
*/
#define  BSP_XTAL_FREQ 18432L   /* onboard crystal frequency (khz) */

#define  NET_PHY_SPD_0                                     0    /* Link speed unknown, or link down                     */
#define  NET_PHY_SPD_10                                   10    /* Link speed = 10mbps                                  */
#define  NET_PHY_SPD_100                                 100    /* Link speed = 100mbps                                 */
#define  NET_PHY_SPD_1000                               1000    /* Link speed = 1000mbps                                */

#define  NET_PHY_DUPLEX_UNKNOWN                            0    /* Duplex uknown or auto-neg incomplete                 */
#define  NET_PHY_DUPLEX_HALF                               1    /* Duplex = Half Duplex                                 */
#define  NET_PHY_DUPLEX_FULL                               2    /* Duplex = Full Duplex                                 */
/* 接收缓冲区描述符标志位及状态位宏定义 */
#define		RxDESC_FLAG_WARP			0x00000002				//* 标记接收缓冲区描述符列表中的最后一个描述符
#define		RxDESC_FLAG_OWNSHIP			0x00000001				//* 标记接收缓冲区为程序所有

/* 发送缓冲区描述状态信息宏定义 */
#define 	TxDESC_STATUS_BUF_SIZE		((ULONG)0x000007FF)		//* 缓冲区长度
#define 	TxDESC_STATUS_LAST_BUF		((ULONG)(1 << 15))		//* 帧的最后一个缓冲区
#define		TxDESC_STATUS_NO_CRC		((ULONG)(1 << 16))		//* 没有CRC被附加到当前帧	
#define		TxDESC_STATUS_BUF_EXHAUSTED	((ULONG)(1 << 27))		//* 发送中途缓冲区就被用光
#define		TxDESC_STATUS_Tx_UNDERRUN	((ULONG)(1 << 28))		//* 发送欠速
#define		TxDESC_STATUS_Tx_ERROR		((ULONG)(1 << 29))		//* 发送错误
#define		TxDESC_STATUS_WRAP			((ULONG)(1 << 30))		//* 最后一个缓冲区
#define		TxDESC_STATUS_USED			((ULONG)(1 << 31))		//* 如果成功发送,缓冲区描述符队列的第一个缓冲区描述符的USED状态位被EMAC置位

//* 接收缓冲区描述符结构,参见AT91SAM7X256数据手册(完整版)
#define		EMAC_RxB_ADDR_MASK			0xFFFFFFFC
typedef struct{
	ULONG ulRxBAddrAndFlag;
	union
	{
		ULONG ulStatus;
		struct {
			ULONG bitLen					:12;
			ULONG bitRxBOffset				:2;
			ULONG bitStartOfFrm				:1;
			ULONG bitEndOfFrm				:1;
			ULONG bitCFI					:1;
			ULONG bitVLANPrio				:3;
			ULONG bitPrioTag				:1;
			ULONG bitVLANTag				:1;
			ULONG bitTypeID					:1;
			ULONG bitSA4Match				:1;
			ULONG bitSA3Match				:1;
			ULONG bitSA2Match				:1;
			ULONG bitSA1Match				:1;
			ULONG bitRsrved0				:1;
			ULONG bitExtAddrMatch			:1;
			ULONG bitUniCastHashMatch		:1;
			ULONG bitMultiCastHashMatch		:1;
			ULONG bitIsBroadCastAddr		:1;
		}bstStatus;		
	}uStatus;
}AT91S_RxBDescriptor, *AT91PS_RxBDescriptor;

//* 发送缓冲区描述符结构,按照EMAC数据手册的描述建立,参见AT91SAM7X256数据手册(完整版)EMAC部分 
typedef struct{
	ULONG ulTxBAddr;
	union
	{
		ULONG ulStatus;
		struct {
			ULONG bitLen			:11;
			ULONG bitRsrved0		:4;
			ULONG bitIsLastBuf		:1;
			ULONG bitIsNoCRC		:1;
			ULONG bitRsrved1		:10;
			ULONG bitIsBExhausted	:1;
			ULONG bitIsTxUnderrun	:1;
			ULONG bitTxError		:1;
			ULONG bitIsWrap			:1;
			ULONG bitIsUsed			:1;
		}bstStatus;		
	}uStatus;
}AT91S_TxBDescriptor, *AT91PS_TxBDescriptor;										
										
										
//* 使能EMAC管理数据接口
#define		EnableMDI()										\
{															\
	AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE;			\
}

//* 禁止EMAC管理数据接口
#define		DisableMDI()							\
{													\
	AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE;	\
}										
//*-----------------------------------------函数原型生命--------------------------------------------
extern void EMACInit(NET_ERR  *perr);
//*-------------------------------------------------------------------------------------------------
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -