first commit

This commit is contained in:
2024-09-05 13:29:00 +08:00
commit 53515a5a50
75 changed files with 3863 additions and 0 deletions

Binary file not shown.

View File

@@ -0,0 +1,580 @@
![cover](cover.png)
---
# 目录
[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.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

View File

@@ -0,0 +1,191 @@
![cover](cover.png)
---
# 目录
[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端成功捕获了发送的开关状态数据验证了无线传输的正确性。
这个实验让我们意识到,在物联网时代,各种智能设备之间的通信变得越来越重要。了解和掌握设备的通信协议和控制方式,可以帮助我们更好地理解和应用这些智能设备。这对于我今后在物联网领域的学习和研究将会非常有帮助。
本次实验我们小组分工明确,合作顺畅。通过合理的分工,提高了实验效率。我们会在今后的项目中,继续提升团队协作能力,以适应更复杂的系统开发。

View File

@@ -0,0 +1,309 @@
![cover](cover.png)
---
# 目录
[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单片机外设的过程中进一步加深了对单片机编程的理解。
本次实验我们小组分工明确,合作顺畅。通过合理的分工,提高了实验效率。

View File

@@ -0,0 +1,185 @@
![cover](cover.png)
---
# 目录
[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技术有了更深入的了解。
本次实验我们小组分工明确,合作顺畅。通过合理的分工,我们提高了实验效率。

Binary file not shown.

Binary file not shown.

Binary file not shown.