diff --git a/tb/sw/src/SlvMain.c b/tb/sw/src/SlvMain.c index eafb9c8..cac04a1 100644 --- a/tb/sw/src/SlvMain.c +++ b/tb/sw/src/SlvMain.c @@ -37,15 +37,19 @@ static inline void error() { void main() { uint32_t readDat; - uint8_t operator; - uint16_t downRecvLen; - uint16_t upRecvLen; + uint32_t operator; + uint32_t downRecvLen; + uint32_t upRecvLen; - uint8_t slvNum; - uint8_t totNum; + uint32_t slvNum; + uint32_t totNum; + + uint32_t isLast; while(1){ + isLast = *ReadIsLast; + asm volatile ( "1:\n" "andi ra, sp, 0x04\n" @@ -62,11 +66,11 @@ void main() if( operator == 0 ){ slvNum = 64 - ( downRecvLen >> 3 ); - uint16_t localLen = 8; - uint16_t downSendLen = downRecvLen - 8; + uint32_t localLen = 8; + uint32_t downSendLen = downRecvLen - 8; //接收本地包 - for( uint8_t i = 0; i < 8/4; i++ ){ + for( uint32_t i = 0; i < 8/4; i++ ){ asm volatile ( "andi ra, sp, 0x08\n" "1:\n" @@ -75,36 +79,52 @@ void main() readDat = *cdr_0_rx_rxFifo; } - // 下行包头 - *cdr_0_tx_txLen = downRecvLen; //downSendLen + 8 - *cdr_0_tx_txFifo = (downSendLen << 20) |( 0 << 16) | 0; - *cdr_0_tx_txFifo = 0; + if(!isLast){ + // 下行转发新建包头 + *cdr_0_tx_txLen = downRecvLen; //downSendLen + 8 + *cdr_0_tx_txFifo = (downSendLen << 20) |( 0 << 16) | 0; + *cdr_0_tx_txFifo = 0; - //下行负载 + //下行转发负载 asm volatile ( "lui t0, %hi(0x40000000)\n" ); - for( uint32_t i = 0; i < (downSendLen >> 2); i++ ){ //一次传4byte + for( uint32_t i = 0; i < (downSendLen >> 2); i++ ){ //一次传4byte + asm volatile ( + // "andi ra, sp, 0x08\n" + // "1:\n" + // "bnez ra, 1b\n" //error 速度不够,不再检查接收 + // "lui t0, %hi(0x40000000)\n" + "lw t1, 0x1c(t0)\n" + "sw t1, 0x08(t0)\n" + + // : : : "a0", "a1" + ); + //*cdr_0_tx_txFifo = *cdr_0_rx_rxFifo; //接收即发送 + } + } else{ //isLast + + //空转掉剩余负载 asm volatile ( - // "andi ra, sp, 0x08\n" - // "1:\n" - // "bnez ra, 1b\n" //error 速度不够,不再检查接收 - // "lui t0, %hi(0x40000000)\n" - "lw t1, 0x1c(t0)\n" - "sw t1, 0x08(t0)\n" - - // : : : "a0", "a1" - ); - //*cdr_0_tx_txFifo = *cdr_0_rx_rxFifo; //接收即发送 + "lui t0, %hi(0x40000000)\n" + ); + for( uint32_t i = 0; i < (downSendLen >> 2); i++ ){ //一次传4byte + asm volatile ( + // "andi ra, sp, 0x08\n" + // "1:\n" + // "bnez ra, 1b\n" //error 速度不够,不再检查接收 + // "lui t0, %hi(0x40000000)\n" + "lw t1, 0x1c(t0)\n" + ); + } } - - //CRC - asm volatile ( - "andi ra, sp, 0x08\n" - "1:\n" - "bnez ra, 1b\n" //error - ); - uint32_t crc = *cdr_0_rx_rxFifo; //CRC + //CRC + asm volatile ( + "andi ra, sp, 0x08\n" + "1:\n" + "bnez ra, 1b\n" //error + ); + uint32_t crc = *cdr_0_rx_rxFifo; //CRC //等待接收完成标志 asm volatile ( @@ -115,63 +135,86 @@ void main() ); - //上行转发 + if(!isLast){ + //上行转发 - //接收第一个包 - asm volatile ( - "1:\n" - "andi ra, sp, 0x40\n" - "beqz ra, 1b\n" - "andi sp, sp, 0xBF\n" - ); - - readDat = *cdr_1_rx_rxFifo; - operator = (readDat >> 16) & 0xf; - upRecvLen = readDat >> 20; - totNum = slvNum + (upRecvLen >> 3) - 1; - - //接收第二个包 - asm volatile ( - "andi ra, sp, 0x80\n" + //接收第一个包 + asm volatile ( "1:\n" - "bnez ra, 1b\n" //error - ); - readDat = *cdr_1_rx_rxFifo; + "andi ra, sp, 0x40\n" + "beqz ra, 1b\n" + "andi sp, sp, 0xBF\n" + ); - //发送上行包头 - *cdr_1_tx_txLen = upRecvLen + 16; //downSendLen + 8 - *cdr_1_tx_txFifo = ((upRecvLen + 8) << 20) |( 0 << 16) | 0; - *cdr_1_tx_txFifo = 0; + readDat = *cdr_1_rx_rxFifo; + operator = (readDat >> 16) & 0xf; + upRecvLen = readDat >> 20; + totNum = slvNum + (upRecvLen >> 3) - 1; - for( uint8_t i = 0; i < 8/4; i ++ ){ + //接收第二个包 + asm volatile ( + "andi ra, sp, 0x80\n" + "1:\n" + "bnez ra, 1b\n" //error + ); + readDat = *cdr_1_rx_rxFifo; + + //发送上行包头 + *cdr_1_tx_txLen = upRecvLen + 16; //upSendLen + 8 + *cdr_1_tx_txFifo = ((upRecvLen + 8) << 20) |( 0 << 16) | 0; *cdr_1_tx_txFifo = 0; - } - for( uint16_t i = 0; i < upRecvLen >> 2; i ++ ){ //一次传4byte + for( uint8_t i = 0; i < 8/4; i ++ ){ + *cdr_1_tx_txFifo = 0; + } + + //上行转发负载 + asm volatile ( + "lui t0, %hi(0x40000000)\n" + ); + for( uint16_t i = 0; i < upRecvLen >> 2; i ++ ){ //一次传4byte + asm volatile ( + // "andi ra, sp, 0x80\n" + // "1:\n" + // "bnez ra, 1b\n" //error 速度不够,不再检查接收 + "lw t1, 0x9c(t0)\n" + "sw t1, 0x88(t0)\n" + ); + + // *cdr_1_tx_txFifo = *cdr_1_rx_rxFifo; //接收即发送 + } + + //CRC asm volatile ( "andi ra, sp, 0x80\n" "1:\n" "bnez ra, 1b\n" //error ); + crc = *cdr_1_rx_rxFifo; //CRC - *cdr_1_tx_txFifo = *cdr_1_rx_rxFifo; //接收即发送 + //等待接收完成标志 + asm volatile ( + "1:\n" + "andi ra, sp, 0x80\n" + "beqz ra, 1b\n" + "andi sp, sp, 0x7F\n" + ); + + + } else { //islast + //发送上行包头 + *cdr_1_tx_txLen = 16; //upSendLen + 8 + *cdr_1_tx_txFifo = (8 << 20) |( 0 << 16) | 0; + *cdr_1_tx_txFifo = 0; + + for( uint8_t i = 0; i < 8/4; i ++ ){ + *cdr_1_tx_txFifo = 0; + } } - //CRC - asm volatile ( - "andi ra, sp, 0x80\n" - "1:\n" - "bnez ra, 1b\n" //error - ); - crc = *cdr_1_rx_rxFifo; //CRC - //等待接收完成标志 - asm volatile ( - "1:\n" - "andi ra, sp, 0x80\n" - "beqz ra, 1b\n" - "andi sp, sp, 0x7F\n" - ); + + } else if ( operator == 1 ){ error();