简介
该项目使用了TEENSY4.1板卡,通过自己设计网口扩展板,连接本地局域网,通过PC网络调试助手,UDP发送固定报文,进行点亮与关闭LED。
项目介绍:
本项目主要使用teensy4.1开发板,通过板载的dp83825百兆网卡,嘉立创画的网口板,进行与电脑上位机进行通信。通过上位机调试助手,发送特定指令,teensy开发板收到网络数据进行解析,来控制LED的亮灭。
硬件配置:
1, teensy4.1开发板
(1) 主控介绍
i.MX RT1062处理器,基于ARM Cortex-M7内核,运行频率高达600 MHz,通过arduino软件可超频至1Ghz,性能非常强悍。
具有 1 MB 片上 RAM,强过RT1050系统的512KB。
片内集成UART、SPI、I2C、USB、2x 10/100M 以太网和 3x CAN。
64 和 32 位浮点数学单元
加密加速和随机数生成器
2个 I2S/TDM 和 1 个 S/PDIF 数字音频端口
用于日期/时间的 RTC
可编程 FlexIO
(2) 板卡外设介绍
7936K 闪存、1024K RAM(512K紧密耦合)、4K EEPROM(仿真)
QSPI 存储器扩展,可容纳 2 个额外的 RAM 或闪存芯片
2 个 USB 端口,速度均为 480MBit/S
55 个数字输入/输出引脚,35 个 PWM 输出引脚
18 个模拟输入引脚
8 个串行端口、3 个 SPI 端口、3 个 I2C 端口
包含了一个以太网控制器和一个以太网PHY芯片(DP83825),支持10/100Mbit的速度,我们的项目正是使用这个接口完成的设计。
2, 网口转接板
我们通过嘉立创软件进行设计,通过排针引出网口,如图:
其PCB如下:
实物如下:0.1uf电容焊接在网口座子下面
软件工具
arduino
我们使用的是软件arduino1.8.9版本。新版本由于我网络问题,teensy库一直安装不成功。
网络调试助手
架构框图
步骤实现
硬件连接
我们通过焊接好的排针,通过6针杜邦线与网口转接板相连,要注意板卡上的丝印与转接板的丝印一一对应,如下图
软件部分介绍
开发板初始化网络参数及设置LED
void setup() {
Serial.begin(115200);
while (!Serial && millis() < 4000) {
// Wait for Serial
}
printf("Starting...\r\n");
pinMode(led, OUTPUT);
// Unlike the Arduino API (which you can still use), QNEthernet uses
// the Teensy's internal MAC address by default, so we can retrieve
// it here
uint8_t mac[6];
Ethernet.macAddress(mac); // This is informative; it retrieves, not sets
printf("MAC = %02x:%02x:%02x:%02x:%02x:%02x\r\n",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
printf("Starting Ethernet with DHCP...\r\n");
if (!Ethernet.begin()) {
printf("Failed to start Ethernet\r\n");
return;
}
if (!Ethernet.waitForLocalIP(kDHCPTimeout)) {
printf("Failed to get IP address from DHCP\r\n");
} else {
IPAddress ip = Ethernet.localIP();
printf(" Local IP = %u.%u.%u.%u\r\n", ip[0], ip[1], ip[2], ip[3]);
ip = Ethernet.subnetMask();
printf(" Subnet mask = %u.%u.%u.%u\r\n", ip[0], ip[1], ip[2], ip[3]);
ip = Ethernet.gatewayIP();
printf(" Gateway = %u.%u.%u.%u\r\n", ip[0], ip[1], ip[2], ip[3]);
// ip = Ethernet.dnsServerIP();
//printf(" DNS = %u.%u.%u.%u\r\n", ip[0], ip[1], ip[2], ip[3]);
// Start the server
//printf("Listening for clients on port %u...\r\n", kServerPort);
//server.begin();
// start UDP
Udp.begin(localPort);
printf("udp start %u...\r\n", localPort);
}
解析网络报文,进行控制LED开关
//EthernetClient client = server.accept();
delay(1000);
int packetSize = Udp.parsePacket();
if (packetSize) {
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remote = Udp.remoteIP();
for (int i=0; i < 4; i++) {
Serial.print(remote[i], DEC);
if (i < 3) {
Serial.print(".");
}
}
Serial.print(", port ");
Serial.println(Udp.remotePort());
// read the packet into packetBufffer
for (int i=0; i < 64; i++) {
packetBuffer[i] = 0;
}
Udp.read(packetBuffer, 64);
Serial.println("Contents:");
Serial.println(packetBuffer);
// send a reply to the IP address and port that sent us the packet we received
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
if(led_open == packetBuffer){
//Serial.println("led open");
digitalWrite(led, HIGH);
Udp.write(ReplyBuffer);
Udp.endPacket();
}
if(led_close == packetBuffer){
// Serial.println("led close");
digitalWrite(led, LOW);
Udp.write(ReplyBuffer);
Udp.endPacket();
}
项目中遇到的难题和解决方法
Arduino2.3.4版本在安装teensy特定库的时候,可能是网络问题,一直安装不成功,最后没有办法,降低arduino降到到1.8.19,才能安装teensy软件包。第二,用错了网络库,导致一直通讯不上,查了很久,最后用qnethernet库,就通信OK了。
对本地活动的体会
虽然顺利的完成的项目的要求,但是对于该板卡的强大功能,只实现了其一小部分,后续要多花时间来研究该板卡。小巧的封装,极高的主频,特别适合做一些实时性的项目。来凸显该板卡的性能优势。