无法初始化sram

This commit is contained in:
RuigeLee
2025-01-15 15:44:29 +08:00
parent 074321ae58
commit 8236d45154
7 changed files with 218 additions and 75 deletions

View File

@@ -5,8 +5,29 @@
// #include "timer.h"
#include "tl2cdr.h"
volatile uint32_t *plic_pending_0_31 = (uint32_t*)( 0xc000000U + 0X001000 );
volatile uint32_t *plic_enable_0_31 = (uint32_t*)( 0xc000000U + 0X002000 );
volatile uint32_t *plic_claim = (uint32_t*)( 0xc000000U + 0X200004 );
uint32_t flag_intTxEnd = 0;
uint32_t flag_intRxError = 0;
uint32_t flag_intRxStart = 0;
uint32_t flag_intRxEnd = 0;
void trap_entry(){
if( *plic_claim == 3 ){
flag_intTxEnd = 1;
} else if( *plic_claim == 4 ){
flag_intRxError = 1;
} else if( *plic_claim == 5 ){
flag_intRxStart = 1;
} else if( *plic_claim == 6 ){
flag_intRxEnd = 1;
}
return;
}
@@ -40,9 +61,12 @@ void main()
uint32_t led = 0;
*plic_enable_0_31 = 1 << 3 | 1 << 4 | 1 << 5 | 1 << 6;
*cdr_softReset = 1; //复位脉冲
*cdr_direct = 0;
register uint32_t flag;
asm volatile ( //timer 2s
@@ -75,26 +99,34 @@ void main()
}
//等待发送完成标志
asm volatile (
"1:\n"
"andi %0, sp, 0x01\n"
"beqz %0, 1b\n"
"andi sp, sp, 0xFE\n"
:"+r"(flag)
);
// asm volatile (
// "1:\n"
// "andi %0, sp, 0x01\n"
// "beqz %0, 1b\n"
// "andi sp, sp, 0xFE\n"
// :"+r"(flag)
// );
while( !flag_intTxEnd );
flag_intTxEnd = 0;
*cdr_softReset = 1; //复位脉冲
*cdr_direct = 1; //方向切换上行
//接收第一个包
asm volatile (
"1:\n"
"andi %0, sp, 0x04\n"
"beqz %0, 1b\n"
"andi sp, sp, 0xFB\n"
:"+r"(flag)
);
// asm volatile (
// "1:\n"
// "andi %0, sp, 0x04\n"
// "beqz %0, 1b\n"
// "andi sp, sp, 0xFB\n"
// :"+r"(flag)
// );
while(!flag_intRxStart);
flag_intRxStart = 0;
readDat = *cdr_rxFifo;
@@ -105,44 +137,57 @@ void main()
//接收第二个包
// asm volatile (
// "andi %0, sp, 0x08\n"
// "1:\n"
// "bnez %0, 1b\n" //error //速度不够,不校验
// :"+r"(flag),
// );
// asm volatile (
// "andi %0, sp, 0x08\n"
// "1:\n"
// "bnez %0, 1b\n" //error //速度不够,不校验
// :"+r"(flag),
// );
if( flag_intRxError ){
while(1);
}
uint32_t temp = *cdr_rxFifo;
//上行转发负载
for( uint32_t i = 0; i < (upRecvLen >> 2); i ++ ){ //一次传4byte
register uint32_t upData;
asm volatile (
"andi %0, sp, 0x80\n"
"1:\n"
"bnez %0, 1b\n" //error 速度不够,不再检查接收
"lw %1, 0x01c(x0)\n"
:"+r"(flag), "+r"(upData)
);
if( flag_intRxError ){
while(1);
}
// register uint32_t upData;
// asm volatile (
// "andi %0, sp, 0x80\n"
// "1:\n"
// "bnez %0, 1b\n" //error 速度不够,不再检查接收
// "lw %1, 0x01c(x0)\n"
// :"+r"(flag), "+r"(upData)
// );
}
//CRC
asm volatile (
"andi %0, sp, 0x08\n"
"1:\n"
"bnez %0, 1b\n" //error
:"+r"(flag)
);
if( flag_intRxError ){
while(1);
}
// asm volatile (
// "andi %0, sp, 0x08\n"
// "1:\n"
// "bnez %0, 1b\n" //error
// :"+r"(flag)
// );
uint32_t crc = *cdr_rxFifo; //CRC
//等待接收完成标志
asm volatile (
"1:\n"
"andi %0, sp, 0x08\n"
"beqz %0, 1b\n"
"andi sp, sp, 0xF7\n"
:"+r"(flag)
);
// asm volatile (
// "1:\n"
// "andi %0, sp, 0x08\n"
// "beqz %0, 1b\n"
// "andi sp, sp, 0xF7\n"
// :"+r"(flag)
// );
while(!flag_intRxEnd);
flag_intRxEnd = 0;
totNum = (upRecvLen >> 3);