PTP移植笔记六:Delay_Req

Delay_Req的时间戳终于没有问题,可以继续进行了,中途遇到了各种问题,测试了不知道多少次,耗时两天,终于成功了。
按照协议,发送Delay_Req应能从硬件读取精确的发送时间。
调试代码是偶然发现硬件时间戳功能好像是在发送时置了一个标志位,也就是说这个时间戳是可以打在任何发送出去的数据包上面的,那么驱动后面还应该有一个读取这个时间戳的代码。以后有空的时候再看。

发现的其它问题:
PRINTF %d %x均不能显示64位类型数据,会出现显示错误:
代码如下:
ptpTime_->seconds = ptpData.timeStamp.second;
ptpTime_->nanoseconds = ptpData.timeStamp.nanosecond;

	PRINTF("\r\nTX %x second, %x nanosecond", (uint32_t) ptpData.timeStamp.second , ptpData.timeStamp.nanosecond);
	PRINTF("\r\nTX OUT1 %x second, %x nanosecond", (uint32_t) ptpTime_->seconds , ptpTime_->nanoseconds);
	PRINTF("\r\nTX OUT2 %x second, %x nanosecond", ptpTime_->seconds , ptpTime_->nanoseconds);
	{
		unsigned char *ps,*pn;
		ps = (unsigned char*)&ptpData.timeStamp.second;
		pn = (unsigned char*)&ptpData.timeStamp.nanosecond;
		PRINTF("\r\nchar senconds:");
		for( int s = 0 ; s < 8 ; s++ )
		{
			PRINTF("%02x " , ps[s]);
		}
		PRINTF("\r\nchar nanosecodes:");
		for( int n = 0 ; n < 4 ; n++ )
		{
			PRINTF("%02x " , pn[n]);
		}
		ps = (unsigned char*)&ptpTime_->seconds;
		pn = (unsigned char*)&ptpTime_->nanoseconds;
		PRINTF("\r\nchar senconds:");
		for( int s = 0 ; s < 8 ; s++ )
		{
			PRINTF("%02x " , ps[s]);
		}
		PRINTF("\r\nchar nanosecodes:");
		for( int n = 0 ; n < 4 ; n++ )
		{
			PRINTF("%02x " , pn[n]);
		}
	}

运行输出如下:
第一行:TX 8 second, 36d55468 nanosecond
第二行:TX OUT1 8 second, 36d55468 nanosecond
第三行:TX OUT2 2002fd44 second, 8 nanosecond
第四行:char senconds:08 00 00 00 00 00 00 00
第五行:char nanosecodes:68 54 d5 36
第六行:char senconds:08 00 00 00 00 00 00 00
第七行:char nanosecodes:68 54 d5 36
其中:
第三行有错误,好几次落到这个坑里面。

这里吐槽一下飞思卡尔的K64库与软件开发文档(用过的其它厂家芯片也一样,一直不懂为什么,憋了好久了):
1.首先是芯片软件开发文档:各种寄存器,看着都烦。难道信号不跟自来水管线一样,无论怎么共用,多少支路,无非就是分叉和阀门,定好出口,顺着找阀门就行了。怎么硬件的配置那么复杂,从一大堆内容里面找哪些寄存器,还有寄存器的哪一位,怎么赋值等等……。
2.官方的驱动库:写的太复杂了,跟x86应用软件似的,各种定义还有分层。这种跟芯片配套的代码,本身就没两行,不应该越简单越好吗。感觉硬件的一点点问题,几行代码都要浪费半天时间。
3.还有那个使用USB的调试,不太稳定,每天都要重启电脑几次。

你可能感兴趣的:(PTP移植笔记六:Delay_Req)