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)搬运长度不够