当前位置:首页 > 编程笔记 > 正文
已解决

GMAC接口(4)——编程指南

来自网友在路上 144844提问 提问时间:2023-09-19 20:08:37阅读次数: 44

最佳答案 问答题库448位专家为你答疑解惑

Note:基于DWC_ether_qos控制器 + RTL8211F PHY

1.硬件复位PHY(可选)

在这里插入图片描述
通过GPIO接口,将复位信号(持续至少10ms的低电平脉冲)发送到PHY。

2.初始化控制器

a.软复位
软件复位,gmac.DMA_Mode.SWR置1。

b.等待复位完成
复位完成,gmac.DMA_Mode.SWR自动清0。

c.关闭所有中断
gmac.MAC_Interrupt_Enable设置为0x00000000

3.配置控制器

3.1配置DMA

a.配置DMA系统总线工作模式
使能地址对齐节拍,gmac.DMA_SysBus_Mode.AAL置1。
失能固定突发长度,gmac.DMA_SysBus_Mode.FB置0。

b.设置最大分拆大小
设置gmac.DMA_CH0_Control.MSS。(推荐值为64或以上)

c.设置DMA传输总线突发长度
设置gmac.DMA_CH0_Tx_Control.TxPBL。(填充值:1/2/4/8/16/32。推荐值:8)

d.设置DMA接收总线突发长度
设置gmac.DMA_CH0_Rx_Control.RxPBL。(填充值:1/2/4/8/16/32。推荐值:8)

e.使能中断(按需选择,建议全开)
设置gmac.DMA_CH0_Interrupt_Enable.NIE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.AIE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.CDEE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.FBEE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.ERIE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.ETIE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.RWTE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.RSE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.RBUE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.RIE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.TBUE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.TXSE为0或1。
设置gmac.DMA_CH0_Interrupt_Enable.TIE为0或1。

3.2配置MTL

a.配置MTL操作模式
设置Tx调度算法,gmac.MTL_Operation_Mode.WRR置0或1。(建议关闭)
设置Rx仲裁算法,gmac.MTL_Operation_Mode.SR置0或1。(建议关闭)

b.接收队列映射路由到Q0
gmac.MTL_RxQ_DMA_MapO.Q0MDMACH置0。
gmac.MTL_RxQ_DMA_MapO.Q0DDMACH置0。

c.配置MTL TxQ0操作模式为存储转发模式
使能存储转发模式,gmac.MTL_TxQ0_Operation_Mode.TSF置1。
失能阈值控制模式,gmac.MTL_TxQ0_Operation_Mode.TTC置0。
使能传输队列,gmac.MTL_TxQ0_Operation_Mode.TSQEN设置为0x2。
设置传输队列大小为4096 byte,gmac.MTL_TxQ0_Operation_Mode.TQS设置为0x4。

TQS 大小(byte)
0x0 256
0x1 512
0x2 1024
0x3 2048
0x4 4096

d.配置MTL RxQ0操作模式为存储转发模式
使能存储转发模式,gmac.MTL_RxQ0_Operation_Mode.RSF置1。
失能阈值控制模式,gmac.MTL_TxQ0_Operation_Mode.RTC置0。
设置活动流控的阈值,gmac.MTL_RxQ0_Operation_Mode.RFA置0。
设置未活动流控的阈值,gmac.MTL_RxQ0_Operation_Mode.RFD置0。
使能转发错误包,gmac.MTL_RxQ0_Operation_Mode.FEP置1。
使能转发小型好包,gmac.MTL_RxQ0_Operation_Mode.FUP置1。
设置传输队列大小为4096 byte,gmac.MTL_RxQ0_Operation_Mode.RQS设置为0x4。

RQS 大小(byte)
0x0 256
0x1 512
0x2 1024
0x3 2048
0x4 4096

3.3配置MAC

a.设置控制器MAC地址
设置MAC_Address[31:0],gmac.MAC_Address0_Low.ADDRLO设置为期望值。
设置MAC_Address[47:32],gmac.MAC_Address0_High.ADDRHI设置为期望值。

b.配置包过滤
使能接收所有包,gmac.MAC_Packet_Filter.RA置1。
使能混合模式,gmac.MAC_Packet_Filter.PR置1。

c.流控配置
关闭传输流控,gmac.MAC_Q0_Tx_Flow_Ctrl.TFE置0。

d.MAC中断使能
设置MDIO接口中断,gmac.MAC_Interrupt_Enable.MDIOIE设置为0或1。
设置帧优先级中断,gmac.MAC_Interrupt_Enable.FPEIE设置为0或1。
设置接收状态中断,gmac.MAC_Interrupt_Enable.RXSTSIE设置为0或1。
设置传输状态中断,gmac.MAC_Interrupt_Enable.TXSTSIE设置为0或1。
设置时间戳中断,gmac.MAC_Interrupt_Enable.TSIE设置为0或1。
设置LPI(Low Power Idle)中断,gmac.MAC_Interrupt_Enable.LPIIE设置为0或1。
设置PMT(Power Management Module)中断,gmac.MAC_Interrupt_Enable.PMTIE设置为0或1。
设置PHY中断,gmac.MAC_Interrupt_Enable.PHYIE设置为0或1。
设置PCS AN(Physical Coding Sub-Layer Auto-negotiation)完成中断,gmac.MAC_Interrupt_Enable.PCSANCIE设置为0或1。
设置PCS连接状态中断,gmac.MAC_Interrupt_Enable.PCSLCHGIE设置为0或1。
设置RGMII/SMII中断,gmac.MAC_Interrupt_Enable.RGSMIIIE设置为0或1。

e.配置工作速率
gmac.MAC_Configuration.PS设置为0或1。
gmac.MAC_Configuration.FES设置为0或1。
在这里插入图片描述
f.配置双工模式
gmac.MAC_Configuration.DM设置为0或1。
在这里插入图片描述

4.I/O配置

5.配置PHY(举例:RTL8211F)

1.设置PHY地址
根据PCB设定值,配置gmac.MAC_MDIO_Address.PA。

2.切换Page
gmac.MAC_MDIO_Address.GB = 0//设置MDIO为Busy
gmac.MAC_MDIO_Address.RDA = 0x1F//PHY的page切换寄存器地址
gmac.MAC_MDIO_Data.GD = n//切换page n

gmac.MAC_MDIO_Address.GOC_1 = 0//设置为写操作
gmac.MAC_MDIO_Address.GOC_0 = 1//设置为写操作
gmac.MAC_MDIO_Address.GB = 1//开始MDIO处理操作

3.读操作
…//切换Page
delay 1ms
gmac.MAC_MDIO_Address.GB = 0//设置MDIO为Busy
gmac.MAC_MDIO_Address.RA = n//设置读寄存器地址n
gmac.MAC_MDIO_Address.GOC_1 = 1//设置为读操作
gmac.MAC_MDIO_Address.GOC_0 = 1//设置为读操作
gmac.MAC_MDIO_Address.GB = 1//开始MDIO处理操作
delay 1ms
data = gmac.MAC_MDIO_Data.GD //获取读数据

4.写操作
…//切换Page
delay 1ms
gmac.MAC_MDIO_Address.GB = 0//设置MDIO为Busy
gmac.MAC_MDIO_Address.RDA = n//写寄存器地址
gmac.MAC_MDIO_Data.GD = data//写数据data

gmac.MAC_MDIO_Address.GOC_1 = 0//设置为写操作
gmac.MAC_MDIO_Address.GOC_0 = 1//设置为写操作
gmac.MAC_MDIO_Address.GB = 1//开始MDIO处理操作

5.PHY初始化
a.检测PHY地址
读取范围从1到32的所有PHY地址的PHY寄存器2和3中的PHY标识符字段。注册器内容对有效的PHY地址有效。
b.检测相关的速度/双工设置
这些位可以被设置为适合该系统。有关更多信息,请参考PHY供应商数据表。
c.根据适用的情况配置PHY
这可能包括设置PHY模式的选项、PHY中的定时选项或其他适用于系统的选项。有关更多信息,请参考PHY供应商数据表。
d.等待自动协商的完成
请阅读PHY状态寄存器。有关更多信息,请参考PHY供应商数据表。
e.更新控制器与自动协商的速度和双工设置
读取相关的PHY寄存器,以确定协商的速度和双工制。

6.配置dma描述符环

6.1Rx dma描述符环

a.配置描述符环长度
gmac.DMA_CH0_Rx_Control2.RDRL置为N。(范围:1~1024。推荐值为0x4)

b.在系统内存中创建一个数量为N的环描述符实体。
在这里插入图片描述
在这里插入图片描述
每个DMA描述符占用16 Byte。

c.环描述符标记为由应用程序所有。
DMA描述符TDES3 OWN置0。

d.描述符接收完成中断使能。
DMA描述符TDES3 IOC置1。

e.设置BUF1V有效
DMA描述符TDES3 的BUF1V置1

f.更新buffer地址
将buffer地址写入到DMA描述符的TDES 0。

g.更新DMA描述符基地址
将此DMA描述符环的基地址写入gmac.DMA_CH0_RxDesc_List_Address.RDESLA寄存器。

h.环描述符标记为DMA所有。
DMA描述符OWN置1

6.2Tx dma描述符

a.配置环传输描述符长度
gmac.DMA_CH0_TxDesc_Ring_Length.TDRL置为期望值。(范围:1~1024。推荐值为0x4)

b.在系统内存中创建一个数量为N的环描述符实体。
在这里插入图片描述
在这里插入图片描述
每个DMA描述符的长度为16 Byte。

c.环描述符标记为由应用程序所有。
DMA描述符TDES 3的OWN置0。

d.设置描述符类型为普通描述符
DMA描述符TDES 3的CTXT置0。

e.设置DMA描述符环的第一个描述符
TDES 3 的FD置1。

f.设置DMA描述符环的最后一个描述符
TDES 3 的LD置1。

g.设置传输完成中断
TDES 2 的IOC置1。

h.设置buffer 1长度
DMA描述符的TDES 2的B1L设置为len。

i.更新buffer 1地址
将buffer 1地址写入到DMA描述符的TDES 0。

7.传输数据

1.DMA描述符标记为DMA所有。
DMA描述符TDES 3的OWN置1。

2.更新DMA描述符基地址
将此DMA描述符环的基地址写入gmac.DMA_CH0_TxDesc_List_Address.TDESLA。

3.更新DMA描述符尾地址
将此DMA描述符环的尾地址写入gmac.DMA_CH0_TxDesc_Tail_Pointer.TDTP。

4.启动传输
开始DMA传输,gmac.DMA_CH0_Tx_Control.ST置1。

8.接收数据

1.DMA描述符标记为DMA所有
DMA描述符TDES 3的OWN置1。

2.更新DMA描述符基地址
将此DMA描述符环的基地址写入gmac.DMA_CH0_RxDesc_List_Address.RDESLA。

3.新DMA描述符尾地址
将此DMA描述符环的尾地址写入gmac.DMA_CH0_RxDesc_Tail_Pointer.RDTP。

4.启动接收
开始DMA接收,gmac.DMA_CH0_Rx_Control.SR置1。

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"GMAC接口(4)——编程指南":http://eshow365.cn/6-9536-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!