软硬件都开源!基于千兆以太网的温度传感应用

2020-08-10 10:13:02 浏览数 (1)

今天和大家分享一个基于千兆以太网的项目应用方案,是一种应用思路,如果想要添加其他功能或者传感器可以在此基础上进行改进。

需要声明的是,本次分享的内容包含整个工程(FPGA工程 上位机软件)全部代码,转载请注明出处,先行谢过!视频中对代码与IP都进行了较为详细的介绍,如需对内部结构进一步了解可参考《基于Aurora的网口通信笔记》,链接:基于Aurora的网口通信笔记,个人认知难免存在纰漏,还请大家指出并修正。

工程使用ZYNQ作为主控芯片,利用ds18b20进行温度采集,内部所涉及的所有OSI均由ZYNQ固有IP构成,无外接芯片,物理层PHY使用1G/2.5G Ethernet PCS/PMA or SGMII IP,数据链路层MAC使用Tri Mode Ethernet MAC IP,(传输层 网络层)控制模块使用udp_ip_protocol_stack,设计温度采集实时传输系统,处理结果通过SFP发送给上位机,系统运行高速、稳定,可有效反映温度变化。

工程示例包含两种情况,分别为单路ds18b20温度采集传输与双路温度采集传输,两者区别不大。

上位机使用Qt软件设计,包含UDP数据发送与接收功能,并设计有接收内容存储功能。(后台回复:千兆以太网即可获得全部代码链接)

SFP实拍

温度数据变化

视频讲解

由于视频中已经对硬件与软件工程进行了介绍,最后就再补充一些调试时遇到的bug:

1、上拉电阻的设置

DS18B20为one-wire型通行总线,也就是其通信引脚只有一个,该引脚既做为输出也做为输入使用,所以在进行引脚分配时需要对其设置成弱上拉,使用的指令为:

代码语言:javascript复制
set_property PULLUP true [get_ports {DS18B20}]

2、状态机问题

在设计过程中状态机遇到一个问题,首先是在从等待数据发送状态WAIT_UDP_DATA跳转到WAIT_ACK状态后,FPGA发送到上位机的是三条完全相同的数据拼在一起,解决时浪费了较多的时间。

后经过程序分析,是因为发送的话只需要在WAIT_ACK状态判断TX_ack信号,之后跳转到SEND_UDP_DATA[x]状态时,不需要判断tx_ack信号,否则的话会从SEND_UDP_DATA状态跳回到WAIT_ACK,而WAIT_ACK状态只会发送前8字节的数据,这样的话三次发送24字节数据,UDP_STACK接收到设定的24byte数据(udp_ip_protocol_stack才不管你发的对不对,反正是24byte就好了),即开始向上位机发送,所以SEND_UDP_DATA状态对数据的填充语句一直未执行导致bug,特此记录。

3、网络字节序

在以太网中,网络字节序是一个常谈的话题,网络字节序基本就是大端对齐,即内部地址的低位存放高序字节。在以太网发送时发送的顺序是先发送数据的高位,即从内存地址的低位读待发送数据,所以在数据发送时,要把待发送的数据手动按照大端对齐的方式放到传输线上,比如要发送的第一个8byte数据为:“The tem”(空格也是一位),那么传输线上的数据格式为:{m,e,t, ,e,h,T}的ASCII码值。

0 人点赞