first commit
This commit is contained in:
BIN
Lab/0_EnOceanLab/Lab2/meterial.zip
Normal file
BIN
Lab/0_EnOceanLab/Lab2/meterial.zip
Normal file
Binary file not shown.
580
Lab/0_EnOceanLab/Lab2/meterial/Enocean实验下_第9组_柯劲帆_李桦炅_王子励_李志民.md
Normal file
580
Lab/0_EnOceanLab/Lab2/meterial/Enocean实验下_第9组_柯劲帆_李桦炅_王子励_李志民.md
Normal file
@@ -0,0 +1,580 @@
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 目录
|
||||
|
||||
[TOC]
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# 实验分工
|
||||
|
||||
| 姓名 | 学号 | 分工 |
|
||||
| :----: | :------: | :----------------------------------------------------------- |
|
||||
| 柯劲帆 | 21281280 | 主要负责完成实验一二三的操作,对实验器材与软件进行测试,在测试中发现问题并与队员协作解决,在实验中也发现部分模块有损坏无法正常使用。 |
|
||||
| 李桦炅 | 21281282 | 主要负责队员之间的沟通协作,协助完成实验并对实验过程中发现的问题进行记录,再进行沟通完善报告的描述。 |
|
||||
| 王子励 | 21281292 | 负责实验报告的撰写,查阅背景知识资料工作。 |
|
||||
| 李志民 | 20281146 | 中途加入小组,完成了实验一的环境配置后,协助了实验中遇到问题的解决。 |
|
||||
|
||||
|
||||
|
||||
# **实验四** EnOcean门卡实验
|
||||
|
||||
## 4.1. 实验目的
|
||||
|
||||
学习易能森门卡Profile,模拟一个门卡监测设备发送数据,使用Sniffer进行抓包。
|
||||
|
||||
## 4.2. 工具/原料
|
||||
|
||||
- 计算机(Windows操作系统)
|
||||
- IAR FOR ARM 7.20安装包
|
||||
- TI-TM4C-SDK工具包
|
||||
- DolphinView安装包
|
||||
- J-link安装包
|
||||
- 调试单板模块(转接板)一个
|
||||
|
||||
## 4.3. 预备知识
|
||||
|
||||
1. 门卡实验是通过记录是否刷卡,可以用于门禁卡的应用;
|
||||
2. TCM310F工作于模式0(单向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;TCM310F工作于模式1(双向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;同时可将外部主机串口发送的数据或命令通过无线发射出去。
|
||||
3. 利用DolphinView 可以实现是否刷门卡的检测。
|
||||
|
||||
## 4.4. 核心代码
|
||||
|
||||
大致阅读代码,将代码的大致思想写在下面的注释中。
|
||||
|
||||
```c
|
||||
// CardStatus: 当卡插入时,传参为0x70; 当卡拔出时,传参为0x00
|
||||
// main函数中会循环调用这个函数发送门卡状态,且通过标志变量在每次门卡状态变化之后只发送1次
|
||||
uint8_t SendCardStatus(uint8_t CardStatus) {
|
||||
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0,表示开始传输数据
|
||||
|
||||
// 设置数据包的各个字段
|
||||
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
|
||||
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
|
||||
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x07; // 数据包长度低位字节
|
||||
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
|
||||
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
|
||||
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验和
|
||||
|
||||
// 数据字段
|
||||
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备RORG
|
||||
EnOceanTelegramBuf[datalen++] = CardStatus; // 卡片状态
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
|
||||
}
|
||||
EnOceanTelegramBuf[datalen++] = 0xA0; // 状态
|
||||
|
||||
// 选项数据
|
||||
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
|
||||
}
|
||||
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm,发送情况:FF
|
||||
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别,0表示电报未加密
|
||||
|
||||
// 计算并设置数据包的校验和
|
||||
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
|
||||
|
||||
// 检查数据包长度是否符合预期
|
||||
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
|
||||
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
|
||||
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 发送数据包
|
||||
}
|
||||
else return 1; // 如果数据包长度不符合预期,返回错误代码
|
||||
|
||||
// 等待数据包接收完成
|
||||
while (!EnOceanTelegramRxflags);
|
||||
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
|
||||
EnOceanRxCount = 0; // 重置接收缓冲区计数
|
||||
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1,表示数据传输完成
|
||||
|
||||
// 检查接收到的数据包是否包含返回OK的标志
|
||||
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志,返回成功代码
|
||||
return 1; // 否则返回错误代码
|
||||
}
|
||||
```
|
||||
|
||||
## 4.5. 实验步骤
|
||||
|
||||
### 4.5.1. 步骤一 连接模块
|
||||
|
||||
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连,此实验需要给EnOcean-CORE下载程序。
|
||||
|
||||
给EnOcean-CORE下载,用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
|
||||
|
||||
### 4.5.2. 步骤二 加载工程文件
|
||||
|
||||
加载Key_Card工程:打开IAR FOR ARM,点击“File”->“Open”->“Workspace”,选择本机中“EnOcean\EnOcean_CODE\1.3Key_Card\IAR_Files”目录下的“Key_Card.eww”工程文件,点击“打开”。
|
||||
|
||||
### 4.5.3. 步骤三 编译并下载
|
||||
|
||||
**设置:**
|
||||
|
||||
执行以下步骤设置工程选项:
|
||||
|
||||
- 右键工程->“Options”,在“General Options”->“Target”选择“TI TM4c123GH6PM”
|
||||
|
||||
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
|
||||
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
|
||||
- 完成设置后,点击“OK”。
|
||||
|
||||
**编译:**
|
||||
|
||||
点击菜单栏中“Project”->“Rebuild All”选项编译程序,也可在工程上右键“Rebuild All”。
|
||||
|
||||
**烧录:**
|
||||
|
||||
编译没有错误后,点击菜单栏“Project”->“DownLoad and Debug”。
|
||||
|
||||
**加载EnOcean_Sniffer工程:**
|
||||
|
||||
点击工具栏的红叉退出调试,拔掉下载Key_Card程序的OURS-EnOcean模块电源,用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
|
||||
|
||||
### 4.5.4. 步骤四 实验结果
|
||||
|
||||
1. 打开DolphinView软件,正确选择串口(与设备管理器中一致),点击连接。
|
||||
2. 将下载Key_Card程序的OURS_EnOcean模块,用一根micro USB线和PC机相连(用于供电)。
|
||||
|
||||
3. 摁下下载Key_Card程序的OURS_EnOcean模块S3/S4按键,观察DolphinView软件的显示结果。
|
||||
|
||||
## 4.6. 实验结果
|
||||
|
||||
按下烧有Key_Card工程的OURS-EnOcean模块的S4按键,观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。
|
||||
|
||||
按下S4键,模拟门卡插入,发送数据包的Data为0x70;松开S4键,模拟门卡拔出,发送数据包的Data为0x00。所以按一次S4按钮,DolphinView窗口会显示收到两个数据包。
|
||||
|
||||
<img src="p1.png" alt="p1" style="zoom:67%;" />
|
||||
|
||||
## 4.7. 实验感想
|
||||
|
||||
通过这次门卡状态检测实验,我们进一步理解和掌握了EnOcean无线通信模块的使用。我们模拟门卡插入和拔出的状态,按照EnOcean协议格式组装数据并无线发送。同时模拟了一个门卡监测设备,使用Sniffer进行抓包,并在Sniffer端成功捕获了发送的门卡状态数据包,验证了无线传输的正确性。这样可以监测和分析EnOcean门卡的通信数据。通过分析抓包数据,我们可以了解门卡的工作状态、通信协议以及与其他设备的交互过程。这对于门卡系统的优化和故障排查非常有帮助。通过这个实验,我们对EnOcean技术有了更深入的了解。
|
||||
|
||||
本次实验我们小组分工明确,合作顺畅。通过合理的分工,我们提高了实验效率。我们会在今后的项目中,继续提升团队协作能力,以适应未来更复杂的系统开发任务。
|
||||
|
||||
|
||||
|
||||
# 实验五 易能森开关控制实验
|
||||
|
||||
## 5.1. 实验目的
|
||||
|
||||
学习易能森开关控制Profile,模拟一个开关发送开关指令,使用Sniffer抓包。
|
||||
|
||||
## 5.2. 工具/原料
|
||||
|
||||
- 计算机(WINDOWS操作系统)
|
||||
- 2个OURS-EnOcean实验模块
|
||||
- IAR for ARM 7.20软件
|
||||
- J-link仿真器一个
|
||||
- DolphinView软件
|
||||
- 调试单板模块(转接板)一个
|
||||
|
||||
## 5.3. 预备知识
|
||||
|
||||
1. TCM310F工作于模式0(单向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;TCM310F工作于模式1(双向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;同时可将外部主机串口发送的数据或命令通过无线发射出去。
|
||||
2. 利用DolphinView 可以实现对于翘板开关打开关闭的检测。
|
||||
|
||||
## 5.4. 核心代码
|
||||
|
||||
大致阅读代码,将代码的大致思想写在下面的注释中。
|
||||
|
||||
```c
|
||||
// SwitchStatus: 当开关打开时,传参为0x10; 当开关关闭时,传参为0x00
|
||||
// main函数中会循环调用这个函数发送开关状态,且通过标志变量在每次开关状态变化之后只发送1次
|
||||
uint8_t SendSwitchStatus(uint8_t SwitchStatus) {
|
||||
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0,表示开始传输数据
|
||||
|
||||
// 设置数据包的各个字段
|
||||
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
|
||||
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
|
||||
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x07; // 数据包长度低位字节
|
||||
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
|
||||
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
|
||||
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验和
|
||||
|
||||
// 数据字段
|
||||
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备RORG
|
||||
EnOceanTelegramBuf[datalen++] = SwitchStatus; // 开关状态(0表示关闭,1表示打开)
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
|
||||
}
|
||||
EnOceanTelegramBuf[datalen++] = 0xA0; // 状态
|
||||
|
||||
// 选项数据
|
||||
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
|
||||
}
|
||||
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm,发送情况:FF
|
||||
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别,0表示电报未加密
|
||||
|
||||
// 计算并设置数据包的校验和
|
||||
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
|
||||
|
||||
// 检查数据包长度是否符合预期
|
||||
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
|
||||
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
|
||||
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 发送数据包
|
||||
}
|
||||
else return 1; // 如果数据包长度不符合预期,返回错误代码
|
||||
|
||||
// 等待数据包接收完成
|
||||
while (!EnOceanTelegramRxflags);
|
||||
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
|
||||
EnOceanRxCount = 0; // 重置接收缓冲区计数
|
||||
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1,表示数据传输完成
|
||||
|
||||
// 检查接收到的数据包是否包含返回OK的标志
|
||||
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志,返回成功代码
|
||||
return 1; // 否则返回错误代码
|
||||
}
|
||||
```
|
||||
|
||||
## 5.5. 实验步骤
|
||||
|
||||
### 5.5.1. 步骤一 连接模块
|
||||
|
||||
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连,此实验需要给EnOcean-CORE下载程序。
|
||||
|
||||
给EnOcean-CORE下载,用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
|
||||
|
||||
### 5.5.2. 步骤二 加载工程文件
|
||||
|
||||
加载Rocker_Switch工程:打开IAR FOR ARM,点击“File”->“Open”->“Workspace”,选择本机中“EnOcean\EnOcean_CODE\1.4Rocker_Switch\IAR_Files”目录下的“Rocker_Switch.eww”工程文件,点击“打开”。
|
||||
|
||||
### 5.5.3. 步骤三 编译并下载
|
||||
|
||||
**设置:**
|
||||
|
||||
执行以下步骤设置工程选项:
|
||||
|
||||
- 右键工程->“Options”,在“General Options”->“Target”选择“TI TM4c123GH6PM”
|
||||
|
||||
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
|
||||
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
|
||||
- 完成设置后,点击“OK”。
|
||||
|
||||
**编译:**
|
||||
|
||||
点击菜单栏中“Project”->“Rebuild All”选项编译程序,也可在工程上右键“Rebuild All”。
|
||||
|
||||
**烧录:**
|
||||
|
||||
编译没有错误后,点击菜单栏“Project”->“DownLoad and Debug”。
|
||||
|
||||
**加载EnOcean_Sniffer工程:**
|
||||
|
||||
点击工具栏的红叉退出调试,拔掉下载Rocker_Switch程序的OURS-EnOcean模块电源,用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
|
||||
|
||||
### 5.5.4. 步骤四 实验结果
|
||||
|
||||
1. 打开DolphinView软件,正确选择串口(与设备管理器中一致),点击连接。
|
||||
2. 将下载Rocker_Switch程序的OURS_EnOcean模块,用一根micro USB线和PC机相连(用于供电)。
|
||||
|
||||
3. 摁下下载Rocker_Switch程序的OURS_EnOcean模块S3/S4按键,观察DolphinView软件的显示结果。
|
||||
|
||||
## 5.6. 实验结果
|
||||
|
||||
按下烧有Rocker_Switch工程的OURS-EnOcean模块的S3、S4按键,观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。
|
||||
|
||||
按下S3键,表示关闭开关,发送数据包的Data为固定值:00;按下S4键,表示打开开关,发送数据包的Data为固定值:10。
|
||||
|
||||
<img src="p2.png" alt="p2" style="zoom:67%;" />
|
||||
|
||||
## 5.7. 实验感想
|
||||
|
||||
通过这次开关状态检测实验,我们进一步掌握了EnOcean无线通信模块的使用方法。我们学习了如何模拟开关的打开和关闭状态,按照EnOcean协议要求组装无线数据包。在Sniffer端成功捕获了发送的开关状态数据,验证了无线传输的正确性。
|
||||
|
||||
这个实验让我们意识到,在物联网时代,各种智能设备之间的通信变得越来越重要。了解和掌握设备的通信协议和控制方式,可以帮助我们更好地理解和应用这些智能设备。这对于我今后在物联网领域的学习和研究将会非常有帮助。
|
||||
|
||||
本次实验我们小组分工明确,合作顺畅。通过合理的分工,提高了实验效率。我们会在今后的项目中,继续提升团队协作能力,以适应更复杂的系统开发。
|
||||
|
||||
|
||||
|
||||
# 实验六 易能森照明控制实验
|
||||
|
||||
## 6.1. 实验目的
|
||||
|
||||
学习通过开关控制Profile发送控制指令控制另一个设备上的LED,实现模拟照明控制。
|
||||
|
||||
## 6.2. 工具/原料
|
||||
|
||||
- 计算机(WINDOWS操作系统)
|
||||
- 2个OURS-EnOcean实验模块
|
||||
- IAR for ARM 7.20软件
|
||||
- J-link仿真器一个
|
||||
- DolphinView软件
|
||||
- 调试单板模块(转接板)一个
|
||||
|
||||
## 6.3. 预备知识
|
||||
|
||||
1. TCM310F工作于模式0(单向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;TCM310F工作于模式1(双向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;同时可将外部主机串口发送的数据或命令通过无线发射出去。
|
||||
2. 与EnOcean一位翘板开关结合,以实现智能控制LED灯的目的。
|
||||
|
||||
## 6.4. 核心代码
|
||||
|
||||
大致阅读代码,将代码的大致思想写在下面的注释中。
|
||||
|
||||
```c
|
||||
int main(void) {
|
||||
// 启用延迟堆栈,允许在中断处理程序中使用浮点指令,但会增加额外的堆栈使用。
|
||||
ROM_FPULazyStackingEnable();
|
||||
|
||||
// 设置时钟运行在50MHz的PLL模式下
|
||||
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
|
||||
|
||||
// 启用系统滴答定时器
|
||||
ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICK_PERIOD_MS - 1);
|
||||
ROM_SysTickIntEnable();
|
||||
ROM_SysTickEnable();
|
||||
|
||||
// 启用用于板载LED的GPIO端口
|
||||
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
|
||||
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_4);
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
|
||||
|
||||
// 启用用于其他设备的GPIO端口
|
||||
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
|
||||
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_7);
|
||||
ROM_GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7);
|
||||
|
||||
// 启用处理器中断
|
||||
ROM_IntMasterEnable();
|
||||
|
||||
// 初始化EEPROM
|
||||
HW_Initeeprom();
|
||||
|
||||
// 初始化定时器0A
|
||||
Timer0AInit();
|
||||
|
||||
// 初始化EnOcean UART
|
||||
EnOcean_uart_Init();
|
||||
|
||||
// 初始化按键
|
||||
InitKey();
|
||||
|
||||
// 初始化TCM310F设备
|
||||
InitTCM310F();
|
||||
|
||||
while (1) {
|
||||
// 处理LightLRNFlags标志,该标志用于表示系统正在学习中
|
||||
if (LightLRNFlags) {
|
||||
// 启用定时器和禁用过滤器
|
||||
ROM_TimerEnable(TIMER0_BASE, TIMER_A);
|
||||
FilterEnable(0);
|
||||
|
||||
// 在LightLRNFlags标志被清除前,持续处理EnOcean数据包
|
||||
while (LightLRNFlags) {
|
||||
// 处理EnOcean数据包的接收标志EnOceanTelegramRxflags
|
||||
if (EnOceanTelegramRxflags) {
|
||||
// 关闭LED指示灯
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0);
|
||||
|
||||
// 复制接收到的EnOcean数据包到缓冲区
|
||||
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount);
|
||||
EnOceanRxCount = 0;
|
||||
EnOceanTelegramRxflags = 0; // 清除接收标志
|
||||
|
||||
// 检查数据包的CRC校验和和数据包类型
|
||||
if (EnOceanTelegramBuf[HEADER_CRC8_SEQ] == GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN) &&
|
||||
EnOceanTelegramBuf[PACKET_TYPE_SEQ] == PACKET_TYPES_RADIO) {
|
||||
// 计算数据包的总长度
|
||||
uint16_t datalen = (EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] << 8) + EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] + EnOceanTelegramBuf[OPTION_LENGTH_SEQ];
|
||||
|
||||
// 检查数据包的尾部CRC校验和
|
||||
if (EnOceanTelegramBuf[BASE_PACKET_LEN + datalen - 1] == GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen)) {
|
||||
// 检查数据包类型是否为EN_DEVICE_RORG
|
||||
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == EN_DEVICE_RORG) {
|
||||
// 提取设备ID
|
||||
uint32_t DeviceID = (EnOceanTelegramBuf[FIRST_DATA_SEQ + 2] << 24) +
|
||||
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 3] << 16) +
|
||||
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 4] << 8) +
|
||||
EnOceanTelegramBuf[FIRST_DATA_SEQ + 5];
|
||||
|
||||
// 检查设备ID是否需要被控制
|
||||
if (PollControlDeviceID(DeviceID)) {
|
||||
// 存储控制的设备ID,然后切换灯的状态
|
||||
ControlDeviceIDMsg.ControlDeviceID[ControlDeviceIDMsg.ControlDeviceIDNum % 32] = DeviceID;
|
||||
ControlDeviceIDMsg.ControlDeviceIDNum += 1;
|
||||
Light_Toggle(); // 切换灯的状态(开关)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 打开LED指示灯
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 处理LightExitLRNFlags标志,该标志用于表示系统学习结束
|
||||
if (LightExitLRNFlags) {
|
||||
// 禁用定时器、重置学习计时器、清除学习标志
|
||||
ROM_TimerDisable(TIMER0_BASE, TIMER_A);
|
||||
LRNTimeCount = 0;
|
||||
LightLRNFlags = 0;
|
||||
|
||||
// 将控制设备ID的信息存储到EEPROM中
|
||||
ROM_EEPROMProgram((uint32_t*)&ControlDeviceIDMsg, EEPROM_FLAGS_ADDR, sizeof(ControlDeviceIDMsg));
|
||||
SetControlDevice(); // 设置控制设备
|
||||
|
||||
// 启用过滤器并关闭灯
|
||||
FilterEnable(1);
|
||||
Light_OFF(); // 关闭灯
|
||||
LightExitLRNFlags = 0;
|
||||
}
|
||||
|
||||
// 处理LightCLRFlags标志,该标志用于表示需要清除控制设备ID的信息
|
||||
if (LightCLRFlags) {
|
||||
// 删除所有过滤器并启用新的过滤器
|
||||
FilterDelAll();
|
||||
FilterEnable(1);
|
||||
|
||||
// 清除控制设备ID的信息
|
||||
ControlDeviceIDMsg.ControlDeviceIDNum = 0;
|
||||
ROM_EEPROMProgram((uint32_t*)&ControlDeviceIDMsg, EEPROM_FLAGS_ADDR, sizeof(ControlDeviceIDMsg));
|
||||
|
||||
LightCLRFlags = 0;
|
||||
}
|
||||
|
||||
// 处理EnOcean数据包
|
||||
if (EnOceanTelegramRxflags) {
|
||||
// 关闭LED指示灯
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0);
|
||||
|
||||
// 复制接收到的数据包到缓冲区
|
||||
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount);
|
||||
EnOceanRxCount = 0;
|
||||
EnOceanTelegramRxflags = 0; // 清除接收标志
|
||||
|
||||
// 检查数据包的CRC校验和和数据包类型
|
||||
if (EnOceanTelegramBuf[HEADER_CRC8_SEQ] == GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN) &&
|
||||
EnOceanTelegramBuf[PACKET_TYPE_SEQ] == PACKET_TYPES_RADIO) {
|
||||
// 计算数据包的总长度
|
||||
uint16_t datalen = (EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] << 8) + EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] + EnOceanTelegramBuf[OPTION_LENGTH_SEQ];
|
||||
|
||||
// 检查数据包的尾部CRC校验和
|
||||
if (EnOceanTelegramBuf[BASE_PACKET_LEN + datalen - 1] == GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen)) {
|
||||
// 检查数据包类型是否为EN_DEVICE_RORG
|
||||
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == EN_DEVICE_RORG) {
|
||||
// 提取设备ID
|
||||
uint32_t DeviceID = (EnOceanTelegramBuf[FIRST_DATA_SEQ + 2] << 24) +
|
||||
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 3] << 16) +
|
||||
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 4] << 8) +
|
||||
EnOceanTelegramBuf[FIRST_DATA_SEQ + 5];
|
||||
|
||||
// 检查设备ID是否需要被控制
|
||||
if (!PollControlDeviceID(DeviceID)) {
|
||||
// 提取数据包的信息,控制灯的状态
|
||||
uint8_t data = EnOceanTelegramBuf[FIRST_DATA_SEQ + 1] & 0xf0;
|
||||
if (data == 0x10 || data == 0x50) {
|
||||
Light_ON(); // 打开灯
|
||||
}
|
||||
else if (data == 0x30 || data == 0x70) {
|
||||
Light_OFF(); // 关闭灯
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 打开LED指示灯
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
主要实现的功能是:
|
||||
|
||||
- **学习模式**:不断从接收到的数据包中提取设备ID,然后将其存储到EEPROM中。
|
||||
- **工作模式**:不断从接收到的数据包中提取设备ID,然后在EEPROM中检索设备ID,如果检索到则亮灯。
|
||||
|
||||
## 6.5. 实验步骤
|
||||
|
||||
### 6.5.1. 步骤一 连接模块
|
||||
|
||||
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连,此实验需要给EnOcean-CORE下载程序。
|
||||
|
||||
给EnOcean-CORE下载,用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
|
||||
|
||||
### 6.5.2. 步骤二 加载工程文件
|
||||
|
||||
加载Light_Control工程:打开IAR FOR ARM,点击“File”->“Open”->“Workspace”,选择本机中“EnOcean\EnOcean_CODE\1.5Light_Control\IAR_Files”目录下的“Light_Control.eww”工程文件,点击“打开”。
|
||||
|
||||
### 6.5.3. 步骤三 编译并下载
|
||||
|
||||
**设置:**
|
||||
|
||||
执行以下步骤设置工程选项:
|
||||
|
||||
- 右键工程->“Options”,在“General Options”->“Target”选择“TI TM4c123GH6PM”
|
||||
|
||||
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
|
||||
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
|
||||
- 完成设置后,点击“OK”。
|
||||
|
||||
**编译:**
|
||||
|
||||
点击菜单栏中“Project”->“Rebuild All”选项编译程序,也可在工程上右键“Rebuild All”。
|
||||
|
||||
**烧录:**
|
||||
|
||||
编译没有错误后,点击菜单栏“Project”->“DownLoad and Debug”。
|
||||
|
||||
**加载EnOcean_Sniffer工程:**
|
||||
|
||||
点击工具栏的红叉退出调试,拔掉下载Light_Control程序的OURS-EnOcean模块电源,用同样的方法向另外两块OURS-EnOcean模块加载Rocker_Switch工程。
|
||||
|
||||
### 6.5.4. 步骤四 实验结果
|
||||
|
||||
1. 长按Light_Control模块的S4按键至左上角LED灯闪烁一下,清除EEPROM缓存的设备ID;
|
||||
1. 长按Light_Control模块的S3按键至右上角LED灯不断闪烁,进入学习模式;
|
||||
1. 按下Rocker_Switch模块的S3按键,向Light_Control模块发送数据包;
|
||||
1. 按一下Light_Control模块的S3按键结束学习模式,进入工作模式;
|
||||
1. 按下Rocker_Switch模块的S3按键,Light_Control模块右上角的LED会点亮;按下Rocker_Switch模块的S4按键,Light_Control模块右上角的LED会熄灭。
|
||||
|
||||
<img src="p3.jpg" alt="p3" style="zoom: 33%;" />
|
||||
|
||||
## 6.6. 实验结果
|
||||
|
||||
Light_Control模块学习到了收到的数据包的设备ID。
|
||||
|
||||
进入工作模式后,再次接收到记录的设备ID的数据包后,能够辨认该设备并且点亮/熄灭LED灯。
|
||||
|
||||
<img src="p4.jpg" alt="p4" style="zoom:33%;" />
|
||||
|
||||
|
||||
|
||||
## 6.7. 实验感想
|
||||
|
||||
通过这次灯光控制实验,我们掌握了EnOcean无线通信的学习和控制模式。我们实现了存储控制设备ID,并据此点亮和熄灭灯光。在Sniffer端成功捕获了整个过程的无线数据包,验证了系统的正确运行。
|
||||
|
||||
在阅读代码时,我们学习到了如何实现EnOcean设备的双向通信、数据存储和控制。这为我们后续开发基于EnOcean的智能照明控制系统奠定了基础。在配置和调用TM4C单片机外设的过程中,进一步加深了对单片机编程的理解。
|
||||
|
||||
本次实验我们小组分工明确,合作顺畅。通过合理的分工,提高了实验效率。
|
||||
Binary file not shown.
BIN
Lab/0_EnOceanLab/Lab2/meterial/cover.png
Normal file
BIN
Lab/0_EnOceanLab/Lab2/meterial/cover.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 177 KiB |
BIN
Lab/0_EnOceanLab/Lab2/meterial/p1.png
Normal file
BIN
Lab/0_EnOceanLab/Lab2/meterial/p1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 133 KiB |
BIN
Lab/0_EnOceanLab/Lab2/meterial/p2.png
Normal file
BIN
Lab/0_EnOceanLab/Lab2/meterial/p2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 135 KiB |
BIN
Lab/0_EnOceanLab/Lab2/meterial/p3.jpg
Normal file
BIN
Lab/0_EnOceanLab/Lab2/meterial/p3.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 190 KiB |
BIN
Lab/0_EnOceanLab/Lab2/meterial/p4.jpg
Normal file
BIN
Lab/0_EnOceanLab/Lab2/meterial/p4.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 285 KiB |
191
Lab/0_EnOceanLab/Lab2/meterial/实验五.md
Normal file
191
Lab/0_EnOceanLab/Lab2/meterial/实验五.md
Normal file
@@ -0,0 +1,191 @@
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 目录
|
||||
|
||||
[TOC]
|
||||
|
||||
---
|
||||
# 实验分工
|
||||
|
||||
| 姓名 | 学号 | 分工 |
|
||||
| :----: | :------: | :--------------------------------------------- |
|
||||
| 柯劲帆 | 21281280 | 详细解读实验代码,规划实验目的,撰写实验报告。 |
|
||||
| 李桦炅 | 21281282 | 共同完成实验具体操作部分。 |
|
||||
| 王子励 | 21281292 | 共同完成实验具体操作部分。 |
|
||||
| 李志民 | 20281146 | 对实验过程中遇到的问题与实验结果进行记录。 |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# 实验五 易能森开关控制实验
|
||||
|
||||
## 1. 实验目的
|
||||
|
||||
学习易能森开关控制Profile,模拟一个开关发送开关指令,使用Sniffer抓包。
|
||||
|
||||
|
||||
|
||||
## 2. 工具/原料
|
||||
|
||||
- 计算机(WINDOWS操作系统)
|
||||
- 2个OURS-EnOcean实验模块
|
||||
- IAR for ARM 7.20软件
|
||||
- J-link仿真器一个
|
||||
- DolphinView软件
|
||||
- 调试单板模块(转接板)一个
|
||||
|
||||
|
||||
|
||||
## 3. 预备知识
|
||||
|
||||
1. TCM310F工作于模式0(单向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;TCM310F工作于模式1(双向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;同时可将外部主机串口发送的数据或命令通过无线发射出去。
|
||||
2. 利用DolphinView 可以实现对于翘板开关打开关闭的检测。
|
||||
|
||||
|
||||
|
||||
## 4. 核心代码
|
||||
|
||||
大致阅读代码,将代码的大致思想写在下面的注释中。
|
||||
|
||||
```c
|
||||
// SwitchStatus: 当开关打开时,传参为0x10; 当开关关闭时,传参为0x00
|
||||
// main函数中会循环调用这个函数发送开关状态,且通过标志变量在每次开关状态变化之后只发送1次
|
||||
uint8_t SendSwitchStatus(uint8_t SwitchStatus) {
|
||||
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0,表示开始传输数据
|
||||
|
||||
// 设置数据包的各个字段
|
||||
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
|
||||
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
|
||||
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x07; // 数据包长度低位字节
|
||||
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
|
||||
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
|
||||
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验和
|
||||
|
||||
// 数据字段
|
||||
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备RORG
|
||||
EnOceanTelegramBuf[datalen++] = SwitchStatus; // 开关状态(0表示关闭,1表示打开)
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
|
||||
}
|
||||
EnOceanTelegramBuf[datalen++] = 0xA0; // 状态
|
||||
|
||||
// 选项数据
|
||||
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
|
||||
}
|
||||
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm,发送情况:FF
|
||||
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别,0表示电报未加密
|
||||
|
||||
// 计算并设置数据包的校验和
|
||||
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
|
||||
|
||||
// 检查数据包长度是否符合预期
|
||||
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
|
||||
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
|
||||
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 发送数据包
|
||||
}
|
||||
else return 1; // 如果数据包长度不符合预期,返回错误代码
|
||||
|
||||
// 等待数据包接收完成
|
||||
while (!EnOceanTelegramRxflags);
|
||||
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
|
||||
EnOceanRxCount = 0; // 重置接收缓冲区计数
|
||||
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1,表示数据传输完成
|
||||
|
||||
// 检查接收到的数据包是否包含返回OK的标志
|
||||
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志,返回成功代码
|
||||
return 1; // 否则返回错误代码
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 5. 实验步骤
|
||||
|
||||
### 5.1. 步骤一 连接模块
|
||||
|
||||
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连,此实验需要给EnOcean-CORE下载程序。
|
||||
|
||||
给EnOcean-CORE下载,用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
|
||||
|
||||
### 5.2. 步骤二 加载工程文件
|
||||
|
||||
加载Rocker_Switch工程:打开IAR FOR ARM,点击“File”->“Open”->“Workspace”,选择本机中“EnOcean\EnOcean_CODE\1.4Rocker_Switch\IAR_Files”目录下的“Rocker_Switch.eww”工程文件,点击“打开”。
|
||||
|
||||
### 5.3. 步骤三 编译并下载
|
||||
|
||||
**设置:**
|
||||
|
||||
执行以下步骤设置工程选项:
|
||||
|
||||
- 右键工程->“Options”,在“General Options”->“Target”选择“TI TM4c123GH6PM”
|
||||
|
||||
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
|
||||
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
|
||||
- 完成设置后,点击“OK”。
|
||||
|
||||
**编译:**
|
||||
|
||||
点击菜单栏中“Project”->“Rebuild All”选项编译程序,也可在工程上右键“Rebuild All”。
|
||||
|
||||
**烧录:**
|
||||
|
||||
编译没有错误后,点击菜单栏“Project”->“DownLoad and Debug”。
|
||||
|
||||
**加载EnOcean_Sniffer工程:**
|
||||
|
||||
点击工具栏的红叉退出调试,拔掉下载Rocker_Switch程序的OURS-EnOcean模块电源,用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
|
||||
|
||||
### 5.4. 步骤四 实验结果
|
||||
|
||||
1. 打开DolphinView软件,正确选择串口(与设备管理器中一致),点击连接。
|
||||
2. 将下载Rocker_Switch程序的OURS_EnOcean模块,用一根micro USB线和PC机相连(用于供电)。
|
||||
|
||||
3. 摁下下载Rocker_Switch程序的OURS_EnOcean模块S3/S4按键,观察DolphinView软件的显示结果。
|
||||
|
||||
|
||||
|
||||
## 6. 实验结果
|
||||
|
||||
按下烧有Rocker_Switch工程的OURS-EnOcean模块的S3、S4按键,观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。
|
||||
|
||||
按下S3键,表示关闭开关,发送数据包的Data为固定值:00;按下S4键,表示打开开关,发送数据包的Data为固定值:10。
|
||||
|
||||
<img src="p2.png" alt="p2" style="zoom:67%;" />
|
||||
|
||||
|
||||
|
||||
## 7. 实验感想
|
||||
|
||||
通过这次开关状态检测实验,我们进一步掌握了EnOcean无线通信模块的使用方法。我们学习了如何模拟开关的打开和关闭状态,按照EnOcean协议要求组装无线数据包。在Sniffer端成功捕获了发送的开关状态数据,验证了无线传输的正确性。
|
||||
|
||||
这个实验让我们意识到,在物联网时代,各种智能设备之间的通信变得越来越重要。了解和掌握设备的通信协议和控制方式,可以帮助我们更好地理解和应用这些智能设备。这对于我今后在物联网领域的学习和研究将会非常有帮助。
|
||||
|
||||
本次实验我们小组分工明确,合作顺畅。通过合理的分工,提高了实验效率。我们会在今后的项目中,继续提升团队协作能力,以适应更复杂的系统开发。
|
||||
309
Lab/0_EnOceanLab/Lab2/meterial/实验六.md
Normal file
309
Lab/0_EnOceanLab/Lab2/meterial/实验六.md
Normal file
@@ -0,0 +1,309 @@
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 目录
|
||||
|
||||
[TOC]
|
||||
|
||||
---
|
||||
# 实验分工
|
||||
|
||||
| 姓名 | 学号 | 分工 |
|
||||
| :----: | :------: | :----------------------------------------------------------- |
|
||||
| 柯劲帆 | 21281280 | 详细解读了实验文件代码,具体分析了实验的含义与功能,分析了代码实现的功能对现实的映射,对实验的具体问题如信号的含义,模块的学习方式进行了分析与测试,并撰写实验报告的主要部分。 |
|
||||
| 李桦炅 | 21281282 | 完成实验的具体操作部分,协助分析模块的学习方式,通过对不同操作方式进行测试分析模块学习的具体方式。 |
|
||||
| 王子励 | 21281292 | 协助了实验操作与实验报告撰写,并协助进行二者之间的沟通,分析实验需求。 |
|
||||
| 李志民 | 20281146 | 对实验过程中发现的问题与实验结果进行记录,并对实验内容进行总结,协助撰写实验报告。 |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# 实验六 易能森照明控制实验
|
||||
|
||||
## 1. 实验目的
|
||||
|
||||
学习通过开关控制Profile发送控制指令控制另一个设备上的LED,实现模拟照明控制。
|
||||
|
||||
|
||||
|
||||
## 2. 工具/原料
|
||||
|
||||
- 计算机(WINDOWS操作系统)
|
||||
- 2个OURS-EnOcean实验模块
|
||||
- IAR for ARM 7.20软件
|
||||
- J-link仿真器一个
|
||||
- DolphinView软件
|
||||
- 调试单板模块(转接板)一个
|
||||
|
||||
|
||||
|
||||
## 3. 预备知识
|
||||
|
||||
1. TCM310F工作于模式0(单向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;TCM310F工作于模式1(双向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;同时可将外部主机串口发送的数据或命令通过无线发射出去。
|
||||
2. 与EnOcean一位翘板开关结合,以实现智能控制LED灯的目的。
|
||||
|
||||
|
||||
|
||||
## 4. 核心代码
|
||||
|
||||
大致阅读代码,将代码的大致思想写在下面的注释中。
|
||||
|
||||
```c
|
||||
int main(void) {
|
||||
// 启用延迟堆栈,允许在中断处理程序中使用浮点指令,但会增加额外的堆栈使用。
|
||||
ROM_FPULazyStackingEnable();
|
||||
|
||||
// 设置时钟运行在50MHz的PLL模式下
|
||||
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
|
||||
|
||||
// 启用系统滴答定时器
|
||||
ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICK_PERIOD_MS - 1);
|
||||
ROM_SysTickIntEnable();
|
||||
ROM_SysTickEnable();
|
||||
|
||||
// 启用用于板载LED的GPIO端口
|
||||
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
|
||||
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_4);
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
|
||||
|
||||
// 启用用于其他设备的GPIO端口
|
||||
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
|
||||
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_7);
|
||||
ROM_GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7);
|
||||
|
||||
// 启用处理器中断
|
||||
ROM_IntMasterEnable();
|
||||
|
||||
// 初始化EEPROM
|
||||
HW_Initeeprom();
|
||||
|
||||
// 初始化定时器0A
|
||||
Timer0AInit();
|
||||
|
||||
// 初始化EnOcean UART
|
||||
EnOcean_uart_Init();
|
||||
|
||||
// 初始化按键
|
||||
InitKey();
|
||||
|
||||
// 初始化TCM310F设备
|
||||
InitTCM310F();
|
||||
|
||||
while (1) {
|
||||
// 处理LightLRNFlags标志,该标志用于表示系统正在学习中
|
||||
if (LightLRNFlags) {
|
||||
// 启用定时器和禁用过滤器
|
||||
ROM_TimerEnable(TIMER0_BASE, TIMER_A);
|
||||
FilterEnable(0);
|
||||
|
||||
// 在LightLRNFlags标志被清除前,持续处理EnOcean数据包
|
||||
while (LightLRNFlags) {
|
||||
// 处理EnOcean数据包的接收标志EnOceanTelegramRxflags
|
||||
if (EnOceanTelegramRxflags) {
|
||||
// 关闭LED指示灯
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0);
|
||||
|
||||
// 复制接收到的EnOcean数据包到缓冲区
|
||||
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount);
|
||||
EnOceanRxCount = 0;
|
||||
EnOceanTelegramRxflags = 0; // 清除接收标志
|
||||
|
||||
// 检查数据包的CRC校验和和数据包类型
|
||||
if (EnOceanTelegramBuf[HEADER_CRC8_SEQ] == GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN) &&
|
||||
EnOceanTelegramBuf[PACKET_TYPE_SEQ] == PACKET_TYPES_RADIO) {
|
||||
// 计算数据包的总长度
|
||||
uint16_t datalen = (EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] << 8) + EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] + EnOceanTelegramBuf[OPTION_LENGTH_SEQ];
|
||||
|
||||
// 检查数据包的尾部CRC校验和
|
||||
if (EnOceanTelegramBuf[BASE_PACKET_LEN + datalen - 1] == GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen)) {
|
||||
// 检查数据包类型是否为EN_DEVICE_RORG
|
||||
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == EN_DEVICE_RORG) {
|
||||
// 提取设备ID
|
||||
uint32_t DeviceID = (EnOceanTelegramBuf[FIRST_DATA_SEQ + 2] << 24) +
|
||||
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 3] << 16) +
|
||||
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 4] << 8) +
|
||||
EnOceanTelegramBuf[FIRST_DATA_SEQ + 5];
|
||||
|
||||
// 检查设备ID是否需要被控制
|
||||
if (PollControlDeviceID(DeviceID)) {
|
||||
// 存储控制的设备ID,然后切换灯的状态
|
||||
ControlDeviceIDMsg.ControlDeviceID[ControlDeviceIDMsg.ControlDeviceIDNum % 32] = DeviceID;
|
||||
ControlDeviceIDMsg.ControlDeviceIDNum += 1;
|
||||
Light_Toggle(); // 切换灯的状态(开关)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 打开LED指示灯
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 处理LightExitLRNFlags标志,该标志用于表示系统学习结束
|
||||
if (LightExitLRNFlags) {
|
||||
// 禁用定时器、重置学习计时器、清除学习标志
|
||||
ROM_TimerDisable(TIMER0_BASE, TIMER_A);
|
||||
LRNTimeCount = 0;
|
||||
LightLRNFlags = 0;
|
||||
|
||||
// 将控制设备ID的信息存储到EEPROM中
|
||||
ROM_EEPROMProgram((uint32_t*)&ControlDeviceIDMsg, EEPROM_FLAGS_ADDR, sizeof(ControlDeviceIDMsg));
|
||||
SetControlDevice(); // 设置控制设备
|
||||
|
||||
// 启用过滤器并关闭灯
|
||||
FilterEnable(1);
|
||||
Light_OFF(); // 关闭灯
|
||||
LightExitLRNFlags = 0;
|
||||
}
|
||||
|
||||
// 处理LightCLRFlags标志,该标志用于表示需要清除控制设备ID的信息
|
||||
if (LightCLRFlags) {
|
||||
// 删除所有过滤器并启用新的过滤器
|
||||
FilterDelAll();
|
||||
FilterEnable(1);
|
||||
|
||||
// 清除控制设备ID的信息
|
||||
ControlDeviceIDMsg.ControlDeviceIDNum = 0;
|
||||
ROM_EEPROMProgram((uint32_t*)&ControlDeviceIDMsg, EEPROM_FLAGS_ADDR, sizeof(ControlDeviceIDMsg));
|
||||
|
||||
LightCLRFlags = 0;
|
||||
}
|
||||
|
||||
// 处理EnOcean数据包
|
||||
if (EnOceanTelegramRxflags) {
|
||||
// 关闭LED指示灯
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0);
|
||||
|
||||
// 复制接收到的数据包到缓冲区
|
||||
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount);
|
||||
EnOceanRxCount = 0;
|
||||
EnOceanTelegramRxflags = 0; // 清除接收标志
|
||||
|
||||
// 检查数据包的CRC校验和和数据包类型
|
||||
if (EnOceanTelegramBuf[HEADER_CRC8_SEQ] == GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN) &&
|
||||
EnOceanTelegramBuf[PACKET_TYPE_SEQ] == PACKET_TYPES_RADIO) {
|
||||
// 计算数据包的总长度
|
||||
uint16_t datalen = (EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] << 8) + EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] + EnOceanTelegramBuf[OPTION_LENGTH_SEQ];
|
||||
|
||||
// 检查数据包的尾部CRC校验和
|
||||
if (EnOceanTelegramBuf[BASE_PACKET_LEN + datalen - 1] == GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen)) {
|
||||
// 检查数据包类型是否为EN_DEVICE_RORG
|
||||
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == EN_DEVICE_RORG) {
|
||||
// 提取设备ID
|
||||
uint32_t DeviceID = (EnOceanTelegramBuf[FIRST_DATA_SEQ + 2] << 24) +
|
||||
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 3] << 16) +
|
||||
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 4] << 8) +
|
||||
EnOceanTelegramBuf[FIRST_DATA_SEQ + 5];
|
||||
|
||||
// 检查设备ID是否需要被控制
|
||||
if (!PollControlDeviceID(DeviceID)) {
|
||||
// 提取数据包的信息,控制灯的状态
|
||||
uint8_t data = EnOceanTelegramBuf[FIRST_DATA_SEQ + 1] & 0xf0;
|
||||
if (data == 0x10 || data == 0x50) {
|
||||
Light_ON(); // 打开灯
|
||||
}
|
||||
else if (data == 0x30 || data == 0x70) {
|
||||
Light_OFF(); // 关闭灯
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 打开LED指示灯
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
主要实现的功能是:
|
||||
|
||||
- **学习模式**:不断从接收到的数据包中提取设备ID,然后将其存储到EEPROM中。
|
||||
- **工作模式**:不断从接收到的数据包中提取设备ID,然后在EEPROM中检索设备ID,如果检索到则亮灯。
|
||||
|
||||
|
||||
|
||||
## 5. 实验步骤
|
||||
|
||||
### 5.1. 步骤一 连接模块
|
||||
|
||||
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连,此实验需要给EnOcean-CORE下载程序。
|
||||
|
||||
给EnOcean-CORE下载,用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
|
||||
|
||||
### 5.2. 步骤二 加载工程文件
|
||||
|
||||
加载Light_Control工程:打开IAR FOR ARM,点击“File”->“Open”->“Workspace”,选择本机中“EnOcean\EnOcean_CODE\1.5Light_Control\IAR_Files”目录下的“Light_Control.eww”工程文件,点击“打开”。
|
||||
|
||||
### 5.3. 步骤三 编译并下载
|
||||
|
||||
**设置:**
|
||||
|
||||
执行以下步骤设置工程选项:
|
||||
|
||||
- 右键工程->“Options”,在“General Options”->“Target”选择“TI TM4c123GH6PM”
|
||||
|
||||
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
|
||||
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
|
||||
- 完成设置后,点击“OK”。
|
||||
|
||||
**编译:**
|
||||
|
||||
点击菜单栏中“Project”->“Rebuild All”选项编译程序,也可在工程上右键“Rebuild All”。
|
||||
|
||||
**烧录:**
|
||||
|
||||
编译没有错误后,点击菜单栏“Project”->“DownLoad and Debug”。
|
||||
|
||||
**加载EnOcean_Sniffer工程:**
|
||||
|
||||
点击工具栏的红叉退出调试,拔掉下载Light_Control程序的OURS-EnOcean模块电源,用同样的方法向另外两块OURS-EnOcean模块加载Rocker_Switch工程。
|
||||
|
||||
### 5.4. 步骤四 实验结果
|
||||
|
||||
1. 长按Light_Control模块的S4按键至左上角LED灯闪烁一下,清除EEPROM缓存的设备ID;
|
||||
1. 长按Light_Control模块的S3按键至右上角LED灯不断闪烁,进入学习模式;
|
||||
1. 按下Rocker_Switch模块的S3按键,向Light_Control模块发送数据包;
|
||||
1. 按一下Light_Control模块的S3按键结束学习模式,进入工作模式;
|
||||
1. 按下Rocker_Switch模块的S3按键,Light_Control模块右上角的LED会点亮;按下Rocker_Switch模块的S4按键,Light_Control模块右上角的LED会熄灭。
|
||||
|
||||
<img src="p3.jpg" alt="p3" style="zoom: 33%;" />
|
||||
|
||||
|
||||
|
||||
## 6. 实验结果
|
||||
|
||||
Light_Control模块学习到了收到的数据包的设备ID。
|
||||
|
||||
进入工作模式后,再次接收到记录的设备ID的数据包后,能够辨认该设备并且点亮/熄灭LED灯。
|
||||
|
||||
<img src="p4.jpg" alt="p4" style="zoom:33%;" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 7. 实验感想
|
||||
|
||||
通过这次灯光控制实验,我们掌握了EnOcean无线通信的学习和控制模式。我们实现了存储控制设备ID,并据此点亮和熄灭灯光。在Sniffer端成功捕获了整个过程的无线数据包,验证了系统的正确运行。
|
||||
|
||||
在阅读代码时,我们学习到了如何实现EnOcean设备的双向通信、数据存储和控制。这为我们后续开发基于EnOcean的智能照明控制系统奠定了基础。在配置和调用TM4C单片机外设的过程中,进一步加深了对单片机编程的理解。
|
||||
|
||||
本次实验我们小组分工明确,合作顺畅。通过合理的分工,提高了实验效率。
|
||||
185
Lab/0_EnOceanLab/Lab2/meterial/实验四.md
Normal file
185
Lab/0_EnOceanLab/Lab2/meterial/实验四.md
Normal file
@@ -0,0 +1,185 @@
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 目录
|
||||
|
||||
[TOC]
|
||||
|
||||
---
|
||||
# 实验分工
|
||||
|
||||
| 姓名 | 学号 | 分工 |
|
||||
| :----: | :------: | :----------------------------------------------------------- |
|
||||
| 柯劲帆 | 21281280 | 详细解读实验代码,分析信号中不同数据对应的含义,撰写实验报告。 |
|
||||
| 李桦炅 | 21281282 | 完成实验的具体操作部分,协助分析数据含义。 |
|
||||
| 王子励 | 21281292 | 协助实验操作与报告撰写工作,并协助二者间的沟通。 |
|
||||
| 李志民 | 20281146 | 对实验过程中遇到的问题与实验结果进行记录,并协助完成报告和总结。 |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# 实验四 EnOcean门卡实验
|
||||
|
||||
## 1. 实验目的
|
||||
|
||||
学习易能森门卡Profile,模拟一个门卡监测设备发送数据,使用Sniffer进行抓包。
|
||||
|
||||
|
||||
|
||||
## 2. 工具/原料
|
||||
|
||||
- 计算机(Windows操作系统)
|
||||
- IAR FOR ARM 7.20安装包
|
||||
- TI-TM4C-SDK工具包
|
||||
- DolphinView安装包
|
||||
- J-link安装包
|
||||
- 调试单板模块(转接板)一个
|
||||
|
||||
|
||||
|
||||
## 3. 预备知识
|
||||
|
||||
1. 门卡实验是通过记录是否刷卡,可以用于门禁卡的应用;
|
||||
2. TCM310F工作于模式0(单向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;TCM310F工作于模式1(双向)时,模块将无线接收到的数据,可以通过串口发送到外部主机;同时可将外部主机串口发送的数据或命令通过无线发射出去。
|
||||
3. 利用DolphinView 可以实现是否刷门卡的检测。
|
||||
|
||||
|
||||
|
||||
## 4. 核心代码
|
||||
|
||||
大致阅读代码,将代码的大致思想写在下面的注释中。
|
||||
|
||||
```c
|
||||
// CardStatus: 当卡插入时,传参为0x70; 当卡拔出时,传参为0x00
|
||||
// main函数中会循环调用这个函数发送门卡状态,且通过标志变量在每次门卡状态变化之后只发送1次
|
||||
uint8_t SendCardStatus(uint8_t CardStatus) {
|
||||
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0,表示开始传输数据
|
||||
|
||||
// 设置数据包的各个字段
|
||||
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
|
||||
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
|
||||
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x07; // 数据包长度低位字节
|
||||
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
|
||||
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
|
||||
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验和
|
||||
|
||||
// 数据字段
|
||||
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备RORG
|
||||
EnOceanTelegramBuf[datalen++] = CardStatus; // 卡片状态
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
|
||||
}
|
||||
EnOceanTelegramBuf[datalen++] = 0xA0; // 状态
|
||||
|
||||
// 选项数据
|
||||
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
|
||||
}
|
||||
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm,发送情况:FF
|
||||
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别,0表示电报未加密
|
||||
|
||||
// 计算并设置数据包的校验和
|
||||
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
|
||||
|
||||
// 检查数据包长度是否符合预期
|
||||
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
|
||||
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
|
||||
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 发送数据包
|
||||
}
|
||||
else return 1; // 如果数据包长度不符合预期,返回错误代码
|
||||
|
||||
// 等待数据包接收完成
|
||||
while (!EnOceanTelegramRxflags);
|
||||
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
|
||||
EnOceanRxCount = 0; // 重置接收缓冲区计数
|
||||
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
|
||||
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1,表示数据传输完成
|
||||
|
||||
// 检查接收到的数据包是否包含返回OK的标志
|
||||
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志,返回成功代码
|
||||
return 1; // 否则返回错误代码
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 5. 实验步骤
|
||||
|
||||
### 5.1. 步骤一 连接模块
|
||||
|
||||
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连,此实验需要给EnOcean-CORE下载程序。
|
||||
|
||||
给EnOcean-CORE下载,用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
|
||||
|
||||
### 5.2. 步骤二 加载工程文件
|
||||
|
||||
加载Key_Card工程:打开IAR FOR ARM,点击“File”->“Open”->“Workspace”,选择本机中“EnOcean\EnOcean_CODE\1.3Key_Card\IAR_Files”目录下的“Key_Card.eww”工程文件,点击“打开”。
|
||||
|
||||
### 5.3. 步骤三 编译并下载
|
||||
|
||||
**设置:**
|
||||
|
||||
执行以下步骤设置工程选项:
|
||||
|
||||
- 右键工程->“Options”,在“General Options”->“Target”选择“TI TM4c123GH6PM”
|
||||
|
||||
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
|
||||
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
|
||||
- 完成设置后,点击“OK”。
|
||||
|
||||
**编译:**
|
||||
|
||||
点击菜单栏中“Project”->“Rebuild All”选项编译程序,也可在工程上右键“Rebuild All”。
|
||||
|
||||
**烧录:**
|
||||
|
||||
编译没有错误后,点击菜单栏“Project”->“DownLoad and Debug”。
|
||||
|
||||
**加载EnOcean_Sniffer工程:**
|
||||
|
||||
点击工具栏的红叉退出调试,拔掉下载Key_Card程序的OURS-EnOcean模块电源,用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
|
||||
|
||||
### 5.4. 步骤四 实验结果
|
||||
|
||||
1. 打开DolphinView软件,正确选择串口(与设备管理器中一致),点击连接。
|
||||
2. 将下载Key_Card程序的OURS_EnOcean模块,用一根micro USB线和PC机相连(用于供电)。
|
||||
|
||||
3. 摁下下载Key_Card程序的OURS_EnOcean模块S3/S4按键,观察DolphinView软件的显示结果。
|
||||
|
||||
|
||||
|
||||
## 6. 实验结果
|
||||
|
||||
按下烧有Key_Card工程的OURS-EnOcean模块的S4按键,观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。
|
||||
|
||||
按下S4键,模拟门卡插入,发送数据包的Data为0x70;松开S4键,模拟门卡拔出,发送数据包的Data为0x00。所以按一次S4按钮,DolphinView窗口会显示收到两个数据包。
|
||||
|
||||
<img src="p1.png" alt="p1" style="zoom:67%;" />
|
||||
|
||||
|
||||
|
||||
## 7. 实验感想
|
||||
|
||||
通过这次门卡状态检测实验,我们进一步理解和掌握了EnOcean无线通信模块的使用。我们模拟门卡插入和拔出的状态,按照EnOcean协议格式组装数据并无线发送。同时模拟了一个门卡监测设备,使用Sniffer进行抓包,并在Sniffer端成功捕获了发送的门卡状态数据包,验证了无线传输的正确性。这样可以监测和分析EnOcean门卡的通信数据。通过分析抓包数据,我们可以了解门卡的工作状态、通信协议以及与其他设备的交互过程。这对于门卡系统的优化和故障排查非常有帮助。通过这个实验,我们对EnOcean技术有了更深入的了解。
|
||||
|
||||
本次实验我们小组分工明确,合作顺畅。通过合理的分工,我们提高了实验效率。
|
||||
BIN
Lab/0_EnOceanLab/Lab2/实验五.pdf
Normal file
BIN
Lab/0_EnOceanLab/Lab2/实验五.pdf
Normal file
Binary file not shown.
BIN
Lab/0_EnOceanLab/Lab2/实验六.pdf
Normal file
BIN
Lab/0_EnOceanLab/Lab2/实验六.pdf
Normal file
Binary file not shown.
BIN
Lab/0_EnOceanLab/Lab2/实验四.pdf
Normal file
BIN
Lab/0_EnOceanLab/Lab2/实验四.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user