feat(project): 更新项目配置并增加ESC EEPROM功能
- 添加新的SPI命令文件:app_spi_cmd_can_burst.cpp 和 app_spi_cmd_exmc_diag.cpp - 移除旧的SPI命令文件:app_spi_cmd_ota_wait.cpp, app_spi_cmd_ping.cpp, app_spi_cmd_can_bridge.cpp, app_spi_cmd_can_feedback.cpp, app_spi_cmd_id_snapshot.cpp, app_spi_cmd_adc_feedback.cpp, app_spi_cmd_motor_state.cpp, app_spi_cmd_motor_version.cpp, app_spi_cmd_motor_ota.cpp - 新增SSC EtherCAT从站协议栈相关文件组,包含头文件和源文件 - 添加ESC EEPROM操作相关的头文件和源文件 - 修正HBI寄存器EXMC偏移地址映射错误 - 实现8位、16位、32位ESC寄存器读写函数 - 改进EEPROM初始化逻辑,添加重试机制和诊断功能
This commit is contained in:
@@ -1,12 +1,14 @@
|
||||
/**
|
||||
* @file ethercat_sync.cpp
|
||||
* @brief EtherCAT SYNC0 周期同步实现。
|
||||
* @brief EtherCAT SYNC0/IRQ/SYNC1 中断入口 — 转发到 SSC 协议栈。
|
||||
*
|
||||
* SYNC0 (EXTI0, preempt=0) → Sync0_Isr() : DC 周期同步, PDO 交换
|
||||
* ESC IRQ (EXTI1, preempt=1) → PDI_Isr() : AL Event (邮箱/SM 事件)
|
||||
* SYNC1 (EXTI2, preempt=1) → Sync1_Isr() : 预留
|
||||
*/
|
||||
#include "comm/ethercat_sync.h"
|
||||
#include "comm/ethercat_slave.h"
|
||||
#include "sys/config.h"
|
||||
#include "sys/task_manager.h"
|
||||
#include "main.h"
|
||||
#include <cstdio>
|
||||
|
||||
extern "C" {
|
||||
#include "gd32e50x_rcu.h"
|
||||
@@ -16,6 +18,11 @@ extern "C" {
|
||||
#if (CONFIG_ETHERCAT_SYNC_MODE == 1)
|
||||
#include "gd32e50x_timer.h"
|
||||
#endif
|
||||
|
||||
/* SSC 协议栈 ISR 入口 (ecatappl.c) */
|
||||
void PDI_Isr(void);
|
||||
void Sync0_Isr(void);
|
||||
void Sync1_Isr(void);
|
||||
}
|
||||
|
||||
void EthercatSync::init()
|
||||
@@ -63,7 +70,7 @@ void EthercatSync::init()
|
||||
timer_init(TIMER0, &timer_initpara);
|
||||
timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
|
||||
timer_interrupt_enable(TIMER0, TIMER_INT_UP);
|
||||
nvic_irq_enable(TIMER0_IRQn, CONFIG_IRQ_PREEMPT_ETHERCAT_SYNC, 0U);
|
||||
nvic_irq_enable(TIMER0_UP_IRQn, CONFIG_IRQ_PREEMPT_ETHERCAT_SYNC, 0U);
|
||||
timer_enable(TIMER0);
|
||||
printf("[ECAT][SYNC] init: TIMER0 enabled (100us, preempt=%u)\r\n",
|
||||
(unsigned)CONFIG_IRQ_PREEMPT_ETHERCAT_SYNC);
|
||||
@@ -97,7 +104,7 @@ void EthercatSync::onSync0Exti()
|
||||
/* 直接寄存器访问,绕过 GD32 库函数以消除可变抖动 */
|
||||
if ((EXTI_PD & (uint32_t)CONFIG_ESC_SYNC0_EXTI) != RESET) {
|
||||
EXTI_PD = (uint32_t)CONFIG_ESC_SYNC0_EXTI;
|
||||
EthercatSlave::periodicIsr();
|
||||
Sync0_Isr();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,8 +112,7 @@ void EthercatSync::onEscIrqExti()
|
||||
{
|
||||
if (exti_interrupt_flag_get(CONFIG_ESC_IRQ_EXTI) != RESET) {
|
||||
exti_interrupt_flag_clear(CONFIG_ESC_IRQ_EXTI);
|
||||
/* 极简:仅置位任务,事件处理移主循环 */
|
||||
TaskManager::set(1UL << TASK_ETHERCAT_PROCESS);
|
||||
PDI_Isr();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,8 +120,7 @@ void EthercatSync::onSync1Exti()
|
||||
{
|
||||
if (exti_interrupt_flag_get(CONFIG_ESC_SYNC1_EXTI) != RESET) {
|
||||
exti_interrupt_flag_clear(CONFIG_ESC_SYNC1_EXTI);
|
||||
/* 预留:SYNC1 通道当前未承载业务,仅清 EXTI 标志防止中断挂起;
|
||||
* 启用 SYNC1 业务时在此处添加处理逻辑。 */
|
||||
Sync1_Isr();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +129,7 @@ void EthercatSync::onTimerIrq()
|
||||
#if (CONFIG_ETHERCAT_SYNC_MODE == 1)
|
||||
if (timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_UP) != RESET) {
|
||||
timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
|
||||
EthercatSlave::periodicIsr();
|
||||
Sync0_Isr();
|
||||
}
|
||||
#else
|
||||
/* EXTI 模式下 TIMER0 不使用,本函数为占位;CONFIG_ETHERCAT_SYNC_MODE=1 时激活。 */
|
||||
@@ -140,7 +145,7 @@ void EXTI0_IRQHandler(void) { EthercatSync::onSync0Exti(); }
|
||||
void EXTI1_IRQHandler(void) { EthercatSync::onEscIrqExti(); }
|
||||
void EXTI2_IRQHandler(void) { EthercatSync::onSync1Exti(); }
|
||||
#else
|
||||
void TIMER0_IRQHandler(void) { EthercatSync::onTimerIrq(); }
|
||||
void TIMER0_UP_TIMER9_IRQHandler(void) { EthercatSync::onTimerIrq(); }
|
||||
void EXTI1_IRQHandler(void) { EthercatSync::onEscIrqExti(); }
|
||||
void EXTI2_IRQHandler(void) { EthercatSync::onSync1Exti(); }
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user