- 博客(32)
- 收藏
- 关注
原创 CRC的手算过程——MODBUS
按字节取反(输入取反) = “10001000 01000100 11001100 00100010 10101010 01100110 11101110 0000 0000 0000 0000”;原始数据 = “00010001 00100010 00110011 01000100 01010101 01100110 01110111 0000 0000 0000 0000”;MODBUS采用16位CRC,初始值0xFFFF,输入取反,输出取反。最后16位取反(输出取反),得0xE177。
2024-08-01 10:43:16
662
原创 SM470 GIO中断
ADS1278SHFQ的SPI模式比较特殊,它是通过DRDY引脚的一个高到低电平变化通知MCU数据采集。MCU检测到之后要立即开始采集,因为ADS1278有自己的时钟和时序,必须要在DRDY自动拉高前读取完成,否则读取的数据会出错。// 关键,中断优先级,必须配置为high。MCU为SM470R1B1MHFQ,通过ADS1278SHFQ的SPI采集3路加表,3路磁信号。SM470的GIO要想触发中断,必须将GIOPRY1 中对应脚的配置设置为1。但是ADS1278芯片的DRDY时长无法满足这个要求。
2024-05-10 10:31:26
214
原创 局部与整体的关系
归根结底是这次买了新帽子,头部保护的很好,虽然身体很冷,但是病情并没有严重。反观之前,只是身体保护的很好,虽然身体很暖和,但是每次都会大病一场。我认为真正的集体主义是不会让个人去牺牲的,是要保护最脆弱的个体。具体例子:父母和孩子,遇到危险时,父母绝不会教孩子冲在前面,而是让孩子躲起来,自己上,牺牲自己,保护孩子。这才是集体与个人的正确关系。当个人利益与集体利益发生冲突时,提倡个人能够作出适当的牺牲和让步,舍利取义,展现出高尚的集体主义精神。当只能顾一边的时候,是保护整体,还是保护好最脆弱的局部呢。
2023-12-04 16:11:14
105
原创 S32K144W深度睡眠的问题
三个串口,全部反初始化的电流小了,但是休眠时间过后,看不到串口恢复的消息了。(感觉官S32DS的驱动有点怪,这个最后也没有解决)电源芯片是一个9到60的宽压芯片。另带一个两轴加表,两个485。10V正常工作时,电流为26mA。
2023-11-23 13:23:03
269
原创 S32DS踩坑日记——RTC芯片MCP7940N的I2C时序
4.如果从机地址正确的话,就9个CLCOCK高电平时,SDL会被MCP7940N拉低。MCP7940N是一款高温型号的RTC芯片,最高支持到125摄氏度。1.芯片断电后所有数据归零,没有备用电池的情况下。2.年月日时分秒都是BCD码表示。2023年11月17日,周五。
2023-11-17 16:57:29
235
原创 UTC秒数与年月日时分秒的转换
这个计算包括了闰年的处理,其中每4年有一个闰年,但每100年除非能被400整除,否则不是闰年。然后,通过一系列的计算,将时间戳转换为年、月、日、时、分、秒等时间信息,并填充到静态的struct tm结构体result中。需要注意的是,这只是一个简化版的示例实现,实际的gmtime函数的计算方法可能更加复杂,涉及到处理闰年、时区调整等细节。需要注意的是,这个算法是一个简化的实现,可能不考虑一些特殊情况和细节,比如闰秒和时区调整。例如,2000年是闰年,因为2000既能够被100整除,又能够被400整除。
2023-11-17 16:27:05
1895
原创 S32DS踩坑日记五-bootloader跳转APP时触发DefaultISR
在反汇编代码中跟踪进入main中后,发现其实已经进入CLOCK_SYS_Init函数里面了,这个函数的运行过程中触发了defaultisr。在APP main第一行增加了断点,显示没有运行到断点,就进入到DefaultISR了。刷了四块电路板,只有一块的APP可以启动, 另外三块只有bootloader可以启动。后面又刷了几块板子,现象也是bootloader能启动,APP运行不起来。开始认为是电路板的问题,但是bootloader能正常运行又说不通。然后将APP的编译优化都去掉了,还是相同的现象。
2023-11-15 22:07:54
772
原创 S32DS踩坑日记四-增加I2C
LPI2C_DRV_MasterReceiveDataBlocking函数的波形是这样(因为RTC地址设置的不对,所以没有应答)LPI2C_DRV_MasterSendDataBlocking函数的波形是这样(因为RTC地址设置的不对,所以没有应答)之后又打算先尝试着把RTC调试出来,然后就遇到莫名奇妙的问题了。然后又重新编译了几次,为什么是几次,因为前两次不知道为什么不行,后面发现示波器有波形了。RTC采用的MCP7940N芯片,是I2C接口的。波形不好看,示例工程中也是这样的,继续调试,
2023-11-01 16:27:18
336
原创 S32DS踩坑日记三-使用EEPROM
这个模拟的大概意思是这样:片子内置一块用于数据存储的flash,叫D-flash,大小是64K,起始地址为0x1000-0000。还有一片用来模拟EEPROM的内存,大小是4K,位置是0x1400-0000。但是经过配置FlexNVM里面的电路后,就可以在写内存的时候,自动把数据写到D-flash里面。这个片子的EEPROM是用普通的flash模拟的,所以配置比较复杂。需要先增加flash,然后再配置模拟EEPROM那块的电路。初始化:比较复杂,整个D-flash都配置成EEPROM了,配置后大小是4K。
2023-10-31 17:35:20
418
原创 S32DS踩坑日记二、调试和SPI
关于SPI配置:在之前的项目中修改SPI配置,不知道什么原因卡死在发送函数那里,所以重新创建工程,重头逐一配置。FEATURE_HAS_HIGH_SPEED_RUN_MODE需要改成0,因为高温型号不支持1。如果不修改这个,CLOCK_DRV_Init()和PINS_DRV_Init()都会卡住。新工程中第一个外设配置的就是SPI,配置如下:软件控制CS,所以CS没有配置。这是时钟(黄色)和输出(蓝色)的波形,发送的是0x03,MSB模式,8bit。这是片选(蓝色)和时钟(黄色)的波形。
2023-10-30 17:40:54
907
原创 S32DS踩坑日记一、调试
开发环境为为公司一直在使用的S32 Design Studio for ARM Version 2.2。表现为:J-Link自身供电为3.3V电压,板子供电为5V电压,使用S32DS自带的工具无法调试。解决办法1:每次用J-Flash下载后,S32DS就可以调试了。高温需要,选用了NXP 144的芯片。解决办法2:使用NXP的调试器。一:J-Link无法调试。首次接触,感觉坑很多。
2023-10-30 10:58:33
541
原创 非常简单的WEB服务器
非常简单的WEB处理程序,当有新想法的时候,可以用这个试验,不用安装、配置那种复杂的服务器软件。这个就是监听一个端口,把连接重定向到另一个程序中,而这个程序就是新想法。JAVA的类库很多,很方便。安装配置简单,写起来也简单,适合各种试验。/*——————————————————————————————————————————————————————————————————————————————作用: 这是最简单的类WEB服务程序,因为很多时候就为试验一个新想法,懒得安装和配置那种复
2022-03-02 14:37:29
1214
原创 协议栈实现-TCP的注意事项
最近正在重新编写协议栈的TCP部分,在开始的连接三次握手部分就卡住了,用K64开发板作为客户端连接电脑服务器,K64发出握手包后,服务器总是没有响应,记录下发现的问题:一:TCP校验和的问题(伪头的问题):TCP头中的校验和包含TCP和数据部分,算法和IP头的算法相同,但是需要在前面一个TCP的伪头,这个伪头看网上资料,说是历史原因造成的,没有实际用途。这个校验和必须计算,不能填0,否则服务器...
2019-07-03 14:19:03
613
原创 协议栈实现-IGMP协议实现的关键
IGMP用于接收组播数据包,实现时的关键点包括:1.发送IGMP包的目的MAC地址和组播地址是有关联的,不能随便发送。2.上面那个MAC地址要加入到硬件的接收地址中,否则即使交换机转发了,MAC芯片也会抛弃数据包,从而接收不到组播数据。...
2019-06-28 17:36:00
649
原创 协议栈实现-ARP的问题
ARP地址解析协议:用于获取IP地址对应的MAC地址。例如:局域网中192.168.0.10要向192.168.0.30发送数据,10需要首先发送广播,询问30的MAC地址。事件原由我在K64开发板中编写IPv4的地址零配置过程中发现:如果K64使用我电脑的IP地址向外发送ARP地址请求,电脑的浏览器、QQ、微信都会出现问题,同时电脑还没有IP冲突的提示,我不知道是不是我的WIN10系统有问...
2019-06-27 10:11:20
389
原创 PTP移植笔记十三:时间戳网络接口优化
K64上面IEEE1588时间戳分为接收时间戳、发送时间戳。接收时间戳全部都有,硬件自动为每个接收到的报文记录时间戳。发送时间戳需要设置标志位才有,发送前设置一个记录时间戳的标志位,发送完成后,就可以读取到时间戳。开始时操作网络接口使用的官方代码,现在出于性能优化的目的,优化时间戳部分的相关内容,官方实现的方式是这样:接收到报文后,判断是否是PTP报文,如果是,则将接收的时间戳,连同...
2019-06-03 14:12:14
2008
原创 PTP移植笔记十二:K64时钟
K64时钟由MCG模块产生,然后分发到各种不同的设备中,MCG同时生成多个不同的时钟,而每个设备使用哪个时钟是在SIM模块的SOPT寄存器中配置的。 SIM模块负责时钟信号的分发,以及选通控制。即不改变频率。...
2019-05-23 18:26:27
734
翻译 PTP移植笔记十一:PTPv2的数据集
普通时钟(和边界时钟的数据集),目前仅关心普通时钟设备。defaultDScurrentDSparentDStimePropertiesDSportDS:每个网络接口(设备的以太网口)对应一个。每个数据集包含:静态成员,动态成员(比如PTP状态机的状态),配置成员(只能通过management messages改变的成员)。defaultDS:静态-twoStepFlag静...
2019-05-15 14:31:32
3869
原创 PTP移植笔记十一:PTP状态机
经过一周奋战,PTPv2的主时钟也实现了。将PTP的状态机分成了几个部分:PTP数据IO、处理主循环。主状态机:状态与PTP文档一一对应。主时钟协商状态机。主时钟状态机:当作为主时钟时的处理逻辑。从时钟状态机:当作为从时钟时的处理逻辑。- PTP数据IO、处理主循环:主状态机:...
2019-05-14 11:34:22
2195
原创 PTP移植笔记十:LWIP与PTP的关系
用观察者模式重新实现了PTP的主控制循环:在循环中不断调用PTP的各个部分(已全部重新编写)处理函数,当发现有输出数据后,在最外部循环中调用LWIP的函数。LWIP本身为嵌入式的编写方式,所以使用起来不太方便,因为需要把代码嵌入到LWIP的框架里面。但是LWIP本身的代码简单易懂,弥补上面的不足,因为可以利用LWIP的代码编写一个新的协议栈,避免嵌入式的缺点。嵌入式的一大缺点就是无法把驱动...
2019-05-06 15:20:06
3626
1
原创 PTP移植笔记九:FRDM K64F时间戳问题
FRDM-K64F的时间戳代码位于:fsl_enet.c文件中。接收时间戳代码位于:ENET_ReadFrame()中。通过函数ENET_Ptp1588ParseFrame函数判断是否将其中的时间戳数据读取出来。也就是说,硬件本身是对所有的包打上时间戳的。发送时间戳的代码位于:ENET_TransmitIRQHandler()调用的ENET_StoreTxFrameTime()中。...
2019-05-05 15:29:56
1155
原创 PTP移植笔记八:链路时间测试
网络拓扑1:主时钟-交换机A-交换机B-从时钟链路时间:meanPathDelay:0 seconds, 67629 nanosecondsmeanPathDelay:0 seconds, 70229 nanosecondsmeanPathDelay:0 seconds, 91519 nanosecondsmeanPathDelay:0 seconds, 33329 nanosecon...
2019-04-26 10:44:50
1335
原创 PTP移植笔记七:哈哈!时钟校时功能
全部重构了原来的代码处理架构。感觉原代码处理的比较不清楚。但是从连续计算出来的数据看:meanPathDelay:0 seconds, 30729 nanosecondsmeanPathDelay:0 seconds, 37169 nanosecondsmeanPathDelay:0 seconds, 20889 nanosecondsmeanPathDelay:0 seconds, ...
2019-04-25 16:50:36
2806
1
原创 PTP移植笔记六:Delay_Req
按照协议,发送Delay_Req应能从硬件读取精确的发送时间。调试代码是偶然发现硬件时间戳功能好像是在发送时置了一个标志位,也就是说这个时间戳是可以打在任何发送出去的数据包上面的,那么驱动后面还应该有一个读取这个时间戳的代码。以后有空的时候再看。...
2019-04-23 13:54:15
2209
原创 PTP移植笔记五:SYNC报文和时间戳
SYNC报文:下图为捕获的dante设备PTPv2报文:可以看到每四次Sync一次Announce报文。编写K64上面的PTP代码时发现,K64可以为PTPv1和PTPv2两个版本的报文记录时间戳。...
2019-04-17 18:21:21
10121
1
原创 PTP移植笔记四:announce和BMC算法
ANNOUNCE报文的作用:当域中没有人为指定主时钟时,域中设备利用此报文自动选出主时钟。每个域中只能有一个主时钟。ANNOUNCE报文对外发送自身时钟的特性信息,域中的其它设备将此报文用于最佳主时钟算法。BMC算法:最佳主时钟算法。每台设备独立计算自身的主、从状态。设备之间并不通过协商决定,谁是主时钟,谁是从时钟。而是通过运算结果决定主时钟、从时钟。算法的数据来自Announce报文,...
2019-04-17 10:41:26
8236
2
原创 PTP移植笔记三:PTP定时器
PTP报文的处理函数为:void processMessage(RunTimeOpts *rtOpts, PtpClock *ptpClock, TimeInternal *timeStamp, unsigned int length)函数的处理流程为:1.检查报文头,版本号2.检查地址等以上各种检查通过后再继续向下执行。3.根据报文头中的报文类型,调用对应的处理函数。报文共有10种类...
2019-04-11 14:31:10
2352
翻译 PTP移植笔记二:PTPv2状态机状态
**说明:**边界时钟一般是交换机、网关、中继器等设备才需要的,我们的应用仅需要普通时钟就可以了。PTP状态机包含以下几种状态:INITIALIZING:初始化数据集、硬件、通讯设备。时钟端口不发送任何PTP报文。边界时钟:如果有一个端口处于这种状态,则其它所以端口都应处于这种状态。FAULTY:故障状态。在此状态下,除了响应部分管理报文外,端口不应发送任何PTP报文。边界时钟:故障端口不应...
2019-04-11 14:20:54
4131
原创 PTP移植笔记一:背景和入口
移植的PTP为linux上ptpd。目标为FRDM-K64F。目的记录下主要问题,日后好回顾整个过程。关于为什么要移植,而不是完全自己编写呢?1.因为源码中有很多数据结构,报文结构,数学公式都可以直接用,这些内容即便自己写出来,和人家的也是一样的,所以就偷懒直接用了,而且省去了逐个字节和协议文档对照的麻烦。2.代码部分就不照搬了,因为绝大部分编译不过去,而且K64上面资源有限,也不能安装...
2019-04-11 13:40:41
4825
原创 FRDM-K64F igmp测试
使用官方SDK(SDK_2.5.0_FRDM-K64F)中的基本历程:frdmk64f_lwip_udpecho_bm里面包含已经移植完成的lwip库。在此基础上修改代码实现组播功能:在udpecho_raw.c文件中:在文件的末尾增加以下组播代码:/port /#define UDP_MULTICASE_RECV_PORT 1178 // multicast port for ...
2019-04-11 11:27:17
336
原创 FRDM K64F开发环境搭建:
FRDM K64F开发环境搭建:选用的官方的FRDM-K64F开发板。1.安装MCUXpressoIDE_10.3.1_2233.exe2.安装完成后启动MCUXpressIDE3.将SDK_2.5.0_FRDM-K64F.ZIP文件拖到下面的SDK,将会自动安装SDK。SDK下载地址:https://mcuxpresso.nxp.com/en/builder4.FRDM-K64F开发板...
2019-04-11 11:25:57
1256
原创 FRDM-K64F IEEE1588硬件时间戳测试
开发板FRDMK64F用了三周了。协议栈使用LWIP,无操作系统,要实现PTPv2的内容。PTPv2的文档为IEEE 1588-2008,v1为IEEE 1588-2002,还有IEEE 802.1AS-2011。通过飞思卡尔的官方库读取MAC中IEEE 1588的硬件时间戳。发送时间戳的读取:使用例子中的UDP协议发送SYNC数据包后,可以读出对应的时间戳,输出如下:Get the...
2019-04-11 11:18:41
2368
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人