DM9051NP 乙太網芯 片驅動源代碼 介绍
一 、 DM9051NP 介 紹
DM9051NP SP I 接 口 以 太 网 模 块 是 联 杰 国 际 (DAVI COM) 为 了 方 便 嵌 入 式 ARM 、
MCU 单 片 机 系 统 进 行 以 太 网 通 信 而 开 发 出 的 解 决 方 案 。DM9051NP 芯 片 是 带 有 行 业 标
准 串 行 外 设 接 口( Serial Peripheral Interface ,SPI )的 独 立 以 太 网 控 制 器 。DM9051N P
符 合 IEEE 802.3 规 范 ,支 持 以 DMA 模 式 来 传 输 ,以 实 现 数 据 传 送 快 速 。DM9051N P
通 过 1 个 中 断 引 脚 和 SPI 接 口 来 进 行 与 主 控 制 器 MCU 单 片 机 的 通 信 , 数 据 传 输 规 格
为 10/ 100 M 。
・ Package:32 支 接 脚 封 装 ,QFN.
・ IEEE 802.3az Energy Ef ficient Ethernet (E EE)
・ Built-in integrated 3.3V to 1.8V regulator
・ 远 程 唤 醒 (W OL)
・ 并 行 线 / 交 叉 线 自 动 切 换 HP Auto-MDIX
・ Support 光 口 界 面
・ 具 有 16KB SRAM 静 态 随 机 存 取 记 忆
・ EMI (Class B) and HBM ESD Rating 8KV
・ 工 业 温 度 规 范 : –40 ℃ to +85 ℃
・ 功 耗 : ( 100/10 M ) => 429/561 mW
・ 连 续 工 作 温 度 <60 ℃
二 、 驱 动 程 序 说 明
1.DM9051 的 寄 存 器 读 写 方 式 说 明
由 于 DM9051NP 以 太 网 口 芯 片 采 用 的 是 SPI 串 行 接 口 模 式 ,其 对 内 部 寄 存 器 读 写 的 规
则 是 先 发 操 作 码 bit 7 (set 0 or 1) + 寄 存 器 地 址 < 后 7bit> ,再 发 送 欲 操 作 数 据 (bit 0~8) 。
通 过 不 同 操 作 码 来 判 别 操 作 时 读 寄 存 器 ( 缓 存 区 ) 还 是 写 寄 存 器 ( 缓 冲 区 ) 或 是 其 它 。
2.DM9051 模 式 设 定 说 明 :
(1) 设 定 DM9051 PHY Mode , DM9051 支 持 以 下 Speed 和 全 / 半 双 工 设 定
・ DM9051_AUTO Auto negot iat ion
・ DM9051_10MHD 10MHz, Half duplex
・ DM9051_10MF D 10MHz, Full duplex
・ DM9051_100MHD 100MHz, Half duplex
・ DM9051_100MFD 100MHz, Full duplex
en um DM 90 5 1_ P HY _ mo d e
{
};
DM9 0 51 _ 10 M HD
= 0,
DM9 0 51 _ 10 0 MH D
= 1,
DM9 0 51 _ 10 M FD
= 4,
DM9 0 51 _ 10 0 MF D
= 5,
DM9 0 51 _ 10 M
DM9 0 51 _ AU T O
= 6,
= 8,
DM9 0 51 _ 1M _ HP N A = 0x1 0
以 上 模 式 透 过 SPI 写 入 Regist er , 可 参 考 DM9051 Driver 。
(2) 选 择 DM9051 Chip Type , 目 前 使 用 的 TYPE_DM9051
en um DM 90 5 1_ T YP E
{
};
TYP E _D M 90 0 0E ,
TYP E _D M 90 0 0A ,
TYP E _D M 90 0 0B ,
TYP E _D M 90 5 1
(3) 在 上 述 建 立 Mode 和 Tyep 表 后 , 放 入 struct DM9051_eth , 以 便 后 续 设 定 使 用 。
st ru c t DM 90 5 1_ e th
{
/* 设 定 目 前 使 用 的 网 络 芯 片 类 型 */
enu m DM9 0 51 _ TY P E typ e ;
/* 设 定 PH Y 使 用 的 Sp ee d an d Du pl e x */
enu m DM9 0 51 _ PH Y _m o de mo de ;
/* In te r ru p t Ma sk Re sg i st e r 设 定 值 */
uin t 8_ t
imr _ al l ;
/* pa ck e t I or II */
uin t 8_ t
pac k et _ cn t ;
/* qu eu e d pa ck e t (pa c ke t II )* /
uin t 16 _ t qu eu e _p a ck e t_ l en ;
/* in te r fa c e MA C add r es s in fo . */
uin t 8_ t
dev _ ad d r[ 6 ];
};
st at i c st ru c t DM 90 5 1_ e th DM 90 5 1_ d ev i ce ;
3.DM9051 驱 动 程 序 说 明
(1)MCU SPI Configure
如 同 上 述 介 绍 的 DM9051NP 以 太 网 口 芯 片 采 用 的 是 SPI 串 行 接 口 模 式 ,首 先 第 一 步 先
确 认 MCU 有 支 持 SPI ,再 来 配 置 SP I Master 的 相 关 设 定 ,在 这 以 STM32F103Z E SPI1
设 定 为 参 考 , 其 他 MCU 可 直 接 参 考 MCU 的 SPI example 设 定 。
Source code :
vo id DM 90 5 1_ S PI _ Co n fi gu r at i on ( vo i d)
{
SPI _ In i tT y pe D ef
SP I_ I ni t St r uc t ur e;
GPI O _I n it T yp e De f GPI O _I n it S tr u ct ur e ;
EXT I _I n it T yp e De f EXT I _I n it S tr u ct ur e ;
DMA _ In i tT y pe D ef
DM A_ I ni t St r uc t ur e;
/* 使 能 SPI 1 时 钟 */
RCC _ AP B 2P e ri p hC l oc k Cm d( R CC _ AP B 2P e ri p h_ S PI 1, En ab l e) ;
/* 找 出 MC U SP I Pi n , 在 这 以 配 置 SP I1 pin s 为 例 : SC K, MI SO an d MOS I */
GPI O _I n it S tr u ct u re . GP IO _ Pi n = DM 90 5 1_ S PI _S C K_ P IN |
DM 90 5 1_ S PI _ MI S O_ P IN | DM 90 5 1_ S PI _ MO S I_ P IN ;
GPI O _I n it S tr u ct u re . GP IO _ Mo d e = GP IO _ Mo d e_ A F_ P P;
GPI O _I n it S tr u ct u re . GP IO _ Sp e ed = GP IO _ Sp e ed _ 50 M Hz ;
GPI O _I n it ( DM 9 05 1 _S P I_ PI N _G R OU P , &G PI O _I n it S tr u ct u re ) ;
/* Co nf i gu r e I/ O for DM 90 5 1 Ch ip se le c t */
GPI O _I n it S tr u ct u re . GP IO _ Pi n = DM 90 5 1_ S PI _C S _P I N;
GPI O _I n it S tr u ct u re . GP IO _ Mo d e = GP IO _ Mo d e_ O ut _ PP ;
GPI O _I n it ( DM 9 05 1 _S P I_ CS _ GR O UP , &G PI O _I n it S tr u ct u re ) ;
GPI O _S e tB i ts ( DM 9 05 1 _S PI _ PI N _G R OU P , DM 90 5 1_ S PI _ SC K _P I N |
DM 90 5 1_ S PI _ MI S O_ P IN | DM 90 5 1_ S PI _ MO S I_ P IN ) ;
/* SP I1 为 Ma st e r 相 关 设 定 参 考 */
/* 设 置 SP I 单 向 或 者 双 向 的 数 据 模 式 :S PI 设 置 为 双 线 双 向 全 双 工 */
SPI _ In i tS t ru c tu r e. S PI _D i re c ti o n = SP I_ D ir e ct i on _ 2L in e s_ F ul l Du p le x ;
/* 设 置 SP I 工 作 模 式 : 设 置 为 主 SP I */
SPI _ In i tS t ru c tu r e. S PI _M o de = SP I_ M od e _M a st e r;
/* 设 置 SP I 的 数 据 大 小 :S PI 发 送 接 收 8 位 帧 结 构 */
SPI _ In i tS t ru c tu r e. S PI _D a ta S iz e = SP I_ D at a Si ze _ 8b ;
/* 选 择 了 串 行 时 钟 的 稳 态 : 时 钟 拉 低 */
SPI _ In i tS t ru c tu r e. S PI _C P OL = SP I_ C PO L _L o w;
/* 资 料 捕 获 于 第 一 个 时 钟 沿 */
SPI _ In i tS t ru c tu r e. S PI _C P HA = SP I_ C PH A _1 E dg e ;
/* NS S 信 号 由 硬 件 ( NS S 管 脚 ) 还 是 软 件 ( 使 用 SSI 位 ) 管 理 : 内 部 NSS 信 号 有
SS I 位 控 制 */
SPI _ In i tS t ru c tu r e. S PI _N S S = SP I_ N SS _ So f t;
/* 定 义 波 特 率 预 分 频 的 值 : 波 特 率 预 分 频 值 为 2 */
SPI _ In i tS t ru c tu r e. S PI _B a ud R at e Pr e sc a le r = SP I_ B au d Ra te P re s ca l er _ 2;
/* 指 定 数 据 传 输 从 MS B 位 还 是 LSB 位 开 始 : 数 据 传 输 从 MS B 位 开 始 */
SPI _ In i tS t ru c tu r e. S PI _F i rs t Bi t = SP I_ F ir s tB it _ MS B ;
/* CR C 值 计 算 的 多 项 式 */
SPI _ In i tS t ru c tu r e. S PI _C R CP o ly n om i al = 7;
/* 根 据 SP I_ I ni t St r uc t 中 指 定 的 参 数 初 始 化 外 设 SP Ix 寄 存 器 */
SPI _ In i t( D M9 0 51 _ SP I , &S PI _ In i tS t ru c tu r e) ;
/* 使 能 DM 90 5 1_ S PI
*/
SPI _ Cm d (D M 90 5 1_ S PI , ENA B LE ) ;
}
以 上 ST M32F 103ZE SPI1 相 关 配 置 , 需 注 意 的 设 定 如 下 :
/* 资 料 捕 获 于 第 一 个 时 钟 沿 */
SP I_ I ni t St r uc t ur e .S P I_ CP H A = SP I_ C PH A _1 E dg e ;
/* NSS 信 号 由 硬 件 ( NS S 管 脚 ) 还 是 软 件 ( 使 用 SS I 位 ) 管 理 : 内 部 NSS 信 号 有 SS I 位
控 制 */
SP I_ I ni t St r uc t ur e .S P I_ NS S = SP I_ N SS _ So ft ;
SPI 的 Master 、 Slave 必 须 配 置 成 相 同 的 时 序 模 式 , 此 部 分 参 考 MCU SPI mode 和
DM9051 SPI mode 相 对 应 的 设 定 。
(2) MCU SPI 读 写 一 字 节 程 序 和 读 写 DM9051 Regist er & Memory 说 明
a. 此 程 序 可 参 考 STM32 SPI example 或 网 络 上 搜 寻 相 关 写 法 参 考
st at i c co ns t __ in l in e ui nt 8 _t SP I_ D M9 0 51 _ Se n dB y te ( ui nt 8 _t by te )
{
}
/* 检 查 指 定 的 SP I 标 志 位 设 置 与 否 : 发 送 缓 存 空 */
whi l e (S PI _ I2 S _G e tF l ag S ta t us (D M 90 5 1_ S PI , SP I_ I 2S _ FL A G_ T XE ) == 0) ;
/* 通 过 外 设 SP Ix 发 送 一 个 数 据 */
SPI _ I2 S _S e nd D at a (D M 90 51 _ SP I , by te ) ;
/* 判 断 接 收 是 否 完 成 */
whi l e (S PI _ I2 S _G e tF l ag S ta t us (D M 90 5 1_ S PI , SP I_ I 2S _ FL A G_ R XN E ) == 0) ;
/* 返 回 通 过 SP Ix 最 近 接 收 的 数 据 */
ret u rn SP I_ I 2S _ Re c ei v eD at a (D M 90 5 1_ S PI ) ;
在 撰 写 完 SP I 读 写 一 个 字 节 程 序 后 ,即 可 撰 写 MCU 读 写 DM9051 Registe r 和 Memory
function 。
b. MCU 读 取 DM9051 Register
ui nt 8 _t DM 90 5 1_ R ea d _R e g( ui n t8 _ t Re g_ O ff )
{
ui nt 8 _t sp i_ d at a ;
#i fd e f DM 90 5 1_ I NT
/* 关 闭 MCU 所 有 In te r ru p t */
IN T_ A LL _ DI S AB L E( ) ;
#e nd i f // DM 9 05 1 _I N T
/* 使 能 SPI CS S , SP I 开 始 送 收 */
SP I_ D M9 0 51 _ CS _ LO W () ;
/* SPI tr an s fe r DM 90 5 1 Re ad - Co m ma n d an d Re g. of fs e t. */
SP I_ D M9 0 51 _ Se n dB y te ( Re g_ O ff ) ;
/* Dum m y for re ad reg i st e r va lu e . */
sp i_ d at a = SP I_ D M9 0 51 _ Se n dB yt e (0 x 0) ;
/* 禁 止 SPI CS S , 完 成 操 作 */
SP I_ D M9 0 51 _ CS _ HI G H( ) ;
#i fd e f DM 90 5 1_ I NT
/* 打 开 MCU 所 有 In te r ru p t */
IN T_ A LL _ EN A BL E () ;
#e nd i f // DM 90 5 1_ I NT
re tu r n sp i_ d at a ;
}
c. MCU 写 入 DM9051 Register
vo id DM 90 5 1_ W ri t e_ R eg (u i nt 8 _t Re g_ O ff , ui nt 8 _t sp i_ d at a )
{
uin t 8_ t cmd a dd r ;
cmd a dd r = (R eg _ Of f | 0x 80 ) ;
#if d ef DM 90 5 1_ I NT
/* 关 闭 MC U 所 有 In te r ru p t */
INT _ AL L _D I SA B LE ( );
#en d if // DM 9 05 1 _I N T
/* 使 能 SP I CS S , SP I 开 始 送 收 */
SPI _ DM 9 05 1 _C S _L O W( ) ;
/* SP I tr an s fe r DM 90 5 1 Rea d -C o mm a nd an d Re g. of fs e t. */
SPI _ DM 9 05 1 _S e nd B yt e (c md a dd r );
/* SP I1 写 操 作 数 据 */
SPI _ DM 9 05 1 _S e nd B yt e (s pi _ da t a) ;
/* 禁 止 SP I CS S , 完 成 操 作 */
SPI _ DM 9 05 1 _C S _H I GH ( );
#if d ef DM 90 5 1_ I NT
/* 打 开 MC U 所 有 In te r ru p t */
INT _ AL L _E N AB L E( ) ;
#en d if // DM 9 05 1 _I N T
ret u rn ;
}
d. MCU 读 取 DM9051 Memory
vo id DM 90 5 1_ R ea d _M e m( ui n t8 _ t* pu 8d a ta , ui nt 1 6_ t da ta l en )
{
uin t 32 _ t i;
uin t 8_ t bu rs t cm d = SPI _ RD _ BU R ST ; // Re ad SPI _ Da t a_ A rr a y ba ck fr om
th e sl av e
#if d ef DM 90 5 1_ I NT