Lan9252-FPGA调试笔记

1.接口完成以后先去读,0x64寄存器。如果值为0x87654321,则时序okay;否,则修改时序
2.访问Lan9252接口的时候
  Byte1 Byte2 Byte3 Byte4
数据线 add[0+:16] add[16+:16] data[0+:16] data[16+:16]
地址线1组 00000 00010 00100 00110
地址线2组 01000   01100 01110
3.DMA流程
1)CPU做状态机初始化
2) DMA写数据初始化
a) 读地址0x314;判断data[31]==1;是则跳转到状态b;否则跳转到状态c【这一步是为了判断当前是不是在写过程数据】
b) 写地址0x314,data[30]<= 1;【这一步是为了停止当前写过程数据】
c) 写地址0x310,data<={length,address};【address <= 0x1400,这是Lan9252写过程数据区的起始地址;Length <= 待搬运的数据长度,单位为byte】
d) 写地址0x314,data[31]<=1;【启动写操作】
e) 读地址0x314,判断data[0]==0?是,则开始DMA数据搬运;否,则停留在这个操作等待可用。【判断是否有可用空间,如果有,则Fifocnt <= data[8+:5]】
3)DMA数据搬运状态
a)发送第一个数据,fifocnt <= fifocnt - 1'b1;跳至b
b)判断Fificnt ==0?是,则跳转到c;否,则跳转到d
c) 读地址0x314,取Fifocnt <= data[8+:5],跳转到d
d)发送下一个数据,fifocnt <= fifocnt - 1'b1;跳转到e
e)判断是否发送完成;是,则跳转到f;否则跳转到b)
f)读0x310,判断当前数据是否写入【仅供测试】
g)读0x314,data[31]==0?是,则跳转到h;否,则等到
h)结束发送
 
4.DMA如果遇到问题排查的顺序
a)时序问题;(读寄存器0x64)
b)流程问题:
i. 确保DMA开始的时候,CPU已经完成初始化,从站状态机==8(仅适合当前工程)
ii.如果DMA不成功,DMA完成后,读0x310,看数据写入状态
 
 
5.调试Lan9252碰到的问题:
a)时序太快(CS持续时间太短;CS间隔时间太短)
b)DMA的时候,写入0x310的数据,地址和长度弄反了
c)DMA的时候,用两个cs写数据,三个cs读fifocnt;继续搬运数据的时候地址没有改回来
d)搬运长度不够
 
 
原文地址:https://www.cnblogs.com/xiz-cheng/p/6899510.html