EtherCAT之Lan9252调试笔记



1.接口


完成以后先去读,0x64寄存器。如果值为0x87654321,则时序okay;否,则修改时序


2.访问Lan9252接口的时候


Byte1Byte2Byte3Byte4


数据线add[0+:16]add[16+:16]data[0+:16]data[16+:16]


地址线1组00000000100010000110


地址线2组010000110001110


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

你可能感兴趣的:(EtherCAT)