关于DP83640不能打时间戳的问题
我用DP83640用于同步两个时钟节点,同步的关键是对同步报文打时间戳,但是在主节点发出Sync报文的时候却一直无法产生时间戳,读取PTP发送时间寄存器PTP_TXTS里的值一直都是0,困扰了很久,一直未能解决。下面的是对DP93640初始化程序,求各位大神给于指导
void Init_DP83640(void)
{
TimeInternal ts;
u16_t val;
u16_t set;
u16_t cfg0,ver;
ts.nanoseconds = 0;
ts.seconds = 0;
ETH_WritePHYRegister(PHYAddress, PAGESEL, 4);
ETH_WritePHYRegister(PHYAddress, PTP_CTL, PTP_DISABLE); //禁止PTP时钟
ETH_WritePHYRegister(PHYAddress, PAGESEL, 6);
ETH_WritePHYRegister(PHYAddress, PTP_COC, PTP_CLOCK_SET);//设置PTP时钟源,125MHz,周期8ns
ETH_WritePHYRegister(PHYAddress, PAGESEL, 4);
ETH_WritePHYRegister(PHYAddress, PTP_CTL, PTP_ENABLE); //使能PTP时钟
ptp_dp83640_settime(&ts);//设置PTP时钟初值
ETH_WritePHYRegister(PHYAddress, PAGESEL, 5);
ETH_WritePHYRegister(PHYAddress, PTP_TXCFG0, 0x0000);
ETH_WritePHYRegister(PHYAddress, PTP_TXCFG1, 0x0000);//禁止发送时间戳功能
ETH_WritePHYRegister(PHYAddress, PAGESEL, 4);
val = ETH_ReadPHYRegister(PHYAddress, PTP_STS); //读取状态寄存器
if(val & (1<<11)) get_send_timestamp(&ts);
if(val & (1<<10)) get_receive_timestamp(&ts);
ETH_WritePHYRegister(PHYAddress, PAGESEL, 5);
//set = TX_IPV4_EN|TX_TS_EN;
ETH_WritePHYRegister(PHYAddress, PTP_TXCFG0, 0x23); //使能发送时间戳功能
ETH_WritePHYRegister(PHYAddress, PTP_RXCFG0, 0x21); //使能接收时间戳功能
cfg0 = PSF_EVNT_EN | PSF_RXTS_EN | PSF_TXTS_EN | PSF_ENDIAN;
ETH_WritePHYRegister(PHYAddress, PSF_CFG0, cfg0);//设置状态帧
ETH_WritePHYRegister(PHYAddress, PAGESEL, 6);
ver = (PSF_PTPVER & VERSIONPTP_MASK) << VERSIONPTP_SHIFT;
ETH_WritePHYRegister(PHYAddress, PSF_CFG1, ver);//设置状态帧
}
有没有谁能给个解答啊?
是软件的原因还是硬件的原因?软件方面我用抓包工具wireshake抓取Sync包没问题,那就是对DP83640初始化的问题?对PTP_TXCFG0寄存器除了TX_TS_EN和TX_IPV4_EN置1还需要别的什么操作?硬件方面检查了一下,把TXD_3拉低了到0,难道是它的原因?有没有知道的。。。
同求!zm_wh2007@126.com,求交流!不晓得是哪里出问题了。。。
你好
这个问题你解决了吗?