增加了检测邻居的协议
This commit is contained in:
@@ -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,11 +110,34 @@ uint32_t HLM_poll(uint32_t mode)
|
|||||||
}
|
}
|
||||||
else if (mode == WORKMODE_SLAVE)
|
else if (mode == WORKMODE_SLAVE)
|
||||||
{
|
{
|
||||||
|
HLM_slave_poll();
|
||||||
|
}
|
||||||
|
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 rx_index = 0;
|
||||||
uint32_t tx_pkt_len;
|
uint32_t tx_pkt_len;
|
||||||
uint32_t rx_pkt_len = 0;
|
uint32_t rx_pkt_len = 0;
|
||||||
uint32_t rx_start = 0;
|
|
||||||
|
uint32_t down_rx_start = 0;
|
||||||
|
uint32_t detect_start = 0;
|
||||||
|
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
uint32_t is_terminal = 1;
|
||||||
|
|
||||||
|
//填充检测下行设备的包
|
||||||
|
uint32_t detect_pkt = MAGIC_NUM;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
*rx0_rxTxPair = 1;
|
*rx0_rxTxPair = 1;
|
||||||
*rx0_rxTimerAim = 0; //240;
|
*rx0_rxTimerAim = 0; //240;
|
||||||
@@ -130,26 +145,27 @@ uint32_t HLM_poll(uint32_t mode)
|
|||||||
*rx1_rxTimerAim = 0;
|
*rx1_rxTimerAim = 0;
|
||||||
*plic_enable_0_31 = 0;
|
*plic_enable_0_31 = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __riscv_e
|
#ifdef __riscv_e
|
||||||
sys_call(SYS_SLAVE_WORK);
|
sys_call(SYS_SLAVE_WORK);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
while(1)
|
|
||||||
{
|
|
||||||
status = *HLM_status;
|
|
||||||
if (status & HLM_RX0_VALID)
|
|
||||||
{
|
|
||||||
rx_start = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
if (is_terminal)
|
||||||
|
{//是终节点
|
||||||
status = *HLM_status;
|
status = *HLM_status;
|
||||||
|
if ((!down_rx_start) && (status & HLM_RX0_VALID))
|
||||||
|
down_rx_start = 1;
|
||||||
|
|
||||||
if (rx_start && (status & HLM_RX0_VALID))
|
for (i = 0; i < HLM_RX0_FIFO_LEFT(status); i++)
|
||||||
{
|
{
|
||||||
|
if (down_rx_start) // && (status & HLM_RX0_VALID))
|
||||||
|
{//处理上行接收
|
||||||
uint32_t data;
|
uint32_t data;
|
||||||
data = *rx0_rxFifo;
|
data = *rx0_rxFifo;
|
||||||
if (rx_index == 0)
|
if (rx_index == 0)
|
||||||
@@ -162,22 +178,46 @@ uint32_t HLM_poll(uint32_t mode)
|
|||||||
*tx1_txFifo = data;
|
*tx1_txFifo = data;
|
||||||
if (rx_pkt_len <= (rx_index * 4))
|
if (rx_pkt_len <= (rx_index * 4))
|
||||||
{
|
{
|
||||||
rx_start = 0;
|
down_rx_start = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
if ((rx_index & 0x1f) == 10)
|
||||||
}
|
detect_start = 1;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user