M57Control
用M5通道举例,M5通道负责解码,也就是接收数据,receive
首先看DSP的程序,
*wrctrl=0x1fc;
0000 0001 1111 1100
M2T_R =0
M2MR =0
M5RST=1
M7RST=1
CLEARM2FIFO=1
CLEARM5FIFO=1
CLEARM7FIFO=1
RESET_M2=1
INIT_D=0
再看M5通道的输入输出
再思考,他是如何工作的
首先,他是解码,实现的是串转并,也就是 M5SDO~M5D[15…0]
关键的三个信号如图 DCLK SDO NVM
DCLK 一直存在,当NVM为高电平时,SDO的数据才有效
来看FPGA程序,首先sin_pout,是一个IP核,串并转换
NVM平时为低,NVMVLR就为高,一直复位,无输出。
NVM为高时,SDO输入,在每个DCLK时钟沿,进行移位操作,在SROUT[15…0]处移出,SROUT[15…0]又连到了D[15…0],等会儿输入fifo。
什么时候输入fifo,得靠计数器来完成
这个计数器,NVM为高时开始工作,每个DCLK时钟周期计数一次,输出BC[4…0]当它计数从0到16时 由00000~10000,也就是BC4=1。换句话说,计数满16,BC4=1。
先看这部分的初始状态。INIT_D=0 MRST=1 没有处于复位
BC4=1后,下一个时钟周期 WRREQ=1 然后马上使其复位,也就是说。这个WRREQ=1 只存在一个CLK的时钟周期,它是一个脉冲
也会使计数器清零
将D[16…0]写入这个FIFO FE就变为0了 也就是 M5FE=0
检测到rdstatus寄存器第6位不为空之后,就去读取rdm5fifo的数据
status_edib=*rdstatus;
if(checkbit16(status_edib,5)==0)
{
temp=*rdm5fifo;
*extram5=temp;
m5++;
*extram5++;
timeout_num=0;
}
造成M5_SEL=0 RDM5FIFO=0
RDM5FIFO=0 RDDATA=0 rdreq=1,数据就会从DOUT[16…0]输出。
M5_SEL=0 D[15…0]上输出的就是M5D[15…0]的数据
注意:NVM要16个周期以上!