增加了检测邻居的协议

This commit is contained in:
2025-02-12 19:41:33 +08:00
parent 80010b89e9
commit 8c3c0112fb
2 changed files with 108 additions and 71 deletions

View File

@@ -13,21 +13,13 @@ uint8_t MST_RX_BUF[RX_BUF_NUM * RX_BUF_MAX_LEN] __attribute__((aligned(32)));
extern const uint8_t int_svr_code[]; extern const uint8_t int_svr_code[];
uint32_t (*sys_call)(uint32_t no, ...); uint32_t (*sys_call)(uint32_t no, ...);
/*
#define CDR_INT_TX0END 14U
#define CDR_INT_TX1END 15U
#define CDR_INT_RX0ERROR 16U static uint32_t HLM_slave_poll(void);
#define CDR_INT_RX1ERROR 17U
#define CDR_INT_RX0START 18U
#define CDR_INT_RX1START 19U
#define CDR_INT_RX0END 20U
#define CDR_INT_RX1END 21U
#define CDR_INT_TX0_FIFO_DEQ 22U
#define CDR_INT_TX1_FIFO_DEQ 23U
#define CDR_INT_RX0_FIFO_ENQ 24U
#define CDR_INT_RX1_FIFO_ENQ 25U
*/
volatile uint32_t isr_flag[32] = {0}; volatile uint32_t isr_flag[32] = {0};
uint32_t HLM_poll(uint32_t mode) uint32_t HLM_poll(uint32_t mode)
{ {
sys_call = (void *)int_svr_code; sys_call = (void *)int_svr_code;
@@ -40,7 +32,7 @@ uint32_t HLM_poll(uint32_t mode)
if (mode == WORKMODE_MASTER) if (mode == WORKMODE_MASTER)
{ {
uint32_t tx_pkt_len = 256; uint32_t tx_pkt_len = 1024;
uint32_t rx_pkt_len = 0; uint32_t rx_pkt_len = 0;
uint32_t rx_start = 0; uint32_t rx_start = 0;
uint32_t status; uint32_t status;
@@ -118,66 +110,114 @@ uint32_t HLM_poll(uint32_t mode)
} }
else if (mode == WORKMODE_SLAVE) else if (mode == WORKMODE_SLAVE)
{ {
uint32_t rx_index = 0; HLM_slave_poll();
uint32_t tx_pkt_len;
uint32_t rx_pkt_len = 0;
uint32_t rx_start = 0;
uint32_t status;
*rx0_rxTxPair = 1;
*rx0_rxTimerAim = 0; //240;
*rx1_rxTxPair = 0;
*rx1_rxTimerAim = 0;
*plic_enable_0_31 = 0;
#ifdef __riscv_e
sys_call(SYS_SLAVE_WORK);
#else
while(1)
{
status = *HLM_status;
if (status & HLM_RX0_VALID)
{
rx_start = 1;
break;
}
}
while (1)
{
status = *HLM_status;
if (rx_start && (status & HLM_RX0_VALID))
{
uint32_t data;
data = *rx0_rxFifo;
if (rx_index == 0)
{
rx_pkt_len = (data >> 20) + 4;
*tx1_txLen = rx_pkt_len;
}
rx_index++;
*tx1_txFifo = data;
if (rx_pkt_len <= (rx_index * 4))
{
rx_start = 0;
break;
}
}
}
#endif
} }
else else
{ {
} }
return 0;
}
#define DETECT_DEVICE_PKT_LEN 4
#define DETECT_DEVICE_PKT_TX_LEN (DETECT_DEVICE_PKT_LEN + 4)
#define MAGIC_NUM 0xa53fd1a0U
uint32_t HLM_slave_poll(void)
{
uint32_t rx_index = 0;
uint32_t tx_pkt_len;
uint32_t rx_pkt_len = 0;
uint32_t down_rx_start = 0;
uint32_t detect_start = 0;
uint32_t status;
uint32_t is_terminal = 1;
//填充检测下行设备的包
uint32_t detect_pkt = MAGIC_NUM;
int i;
*rx0_rxTxPair = 1;
*rx0_rxTimerAim = 0; //240;
*rx1_rxTxPair = 0;
*rx1_rxTimerAim = 0;
*plic_enable_0_31 = 0;
#ifdef __riscv_e
sys_call(SYS_SLAVE_WORK);
#else
while (1)
{
if (is_terminal)
{//是终节点
status = *HLM_status;
if ((!down_rx_start) && (status & HLM_RX0_VALID))
down_rx_start = 1;
for (i = 0; i < HLM_RX0_FIFO_LEFT(status); i++)
{
if (down_rx_start) // && (status & HLM_RX0_VALID))
{//处理上行接收
uint32_t data;
data = *rx0_rxFifo;
if (rx_index == 0)
{
rx_pkt_len = (data >> 20) + 4;
*tx1_txLen = rx_pkt_len;
}
rx_index++;
*tx1_txFifo = data;
if (rx_pkt_len <= (rx_index * 4))
{
down_rx_start = 0;
break;
}
if ((rx_index & 0x1f) == 10)
detect_start = 1;
}
else
break;
}
if (detect_start)
{
*tx0_txLen = DETECT_DEVICE_PKT_TX_LEN;
*tx0_txFifo = (DETECT_DEVICE_PKT_LEN << 20) | 1;
*tx0_txFifo = detect_pkt;
detect_start = 0;
}
if (status & HLM_RX1_VALID)
{
uint32_t data;
uint32_t num;
data = *rx1_rxFifo;
num = *rx1_rxFifo;
if ((data & 0x1) && (num == MAGIC_NUM))
{
*rx1_softReset = 1;
*tx0_softReset = 1;
}
}
}
else
{//不是终节点
}
}
#endif
} }

View File

@@ -3,10 +3,7 @@
#include "stdint.h" #include "stdint.h"
uint32_t HLM_poll(uint32_t mode); uint32_t HLM_poll(uint32_t mode);
uint32_t HLM_work_with_isr(uint32_t mode);
#endif #endif