|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& N/ l) _! K" w1 @9 J" v$ |' M+ V7 B2 p; M+ ]( Z( E
问题描述:" a' b% X, M3 {7 D: [
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% M7 S$ ?$ {! a7 ^8 C7 t7 X* {7 ^' B! e
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. y8 N0 ?7 S6 i9 e
4 W3 B0 N! G1 C+ \# c+ O测试结果如下:3 t& j# L8 c5 b- V$ Q( m: E
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 ~ y: Z" E, ~5 n4 N
1 Y$ }% h5 Q$ e% t3 u7 o# ?: c( l6 T
备注:* t% @7 f. N9 Q @9 i
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?6 }5 ] | s4 k
2、相关代码如下:
3 l# J/ v4 y4 X; B4 a//UPP DMA缓冲大小512字节 \ d N) F) o& P5 F
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! q8 w6 o( ]5 U F#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 R0 M5 q/ I. V5 G2 @: P5 T0 _
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ S2 K- e9 D& H, O! X+ z+ S8 Z
) y9 d" s' |# x, ?. {# w) N
. b8 w1 z! S8 @1 [8 J3 P//upp接收、发送buffer- @1 x; J( m0 m' v0 v
#pragma DATA_ALIGN(upp_buffer_a, 8)) {& s3 k" p7 _* s( A5 R
#pragma DATA_ALIGN(upp_buffer_b, 8): ?2 Y( s, c8 d2 G
% D$ X7 w- g/ Dunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) g9 ^# r2 n$ E" B) [& B
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
( i$ T1 `( ?8 x9 b
8 G7 V! G4 y8 G7 |! C+ P9 a* R
. n" W) \# j6 f, s2 L. o. H2 @1 ystatic bool server_upp_data_recv(Server *server)
+ j8 V8 A+ z2 R/ r& k( l{
! N5 X' |! ?+ ` if(server->upp_channel_a_recv == false) {$ [9 z7 M; v) X" ^4 `
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, ^! x7 {" z: B; g0 r$ A if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
/ D$ c* h1 o7 r" n. s server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");% `1 Y: e( }+ o: s
& D# s& O. b8 t# u S1 X
' F6 G7 [( E) B& F memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% N8 w8 A- W- u* |3 R) |
1 q7 q, }5 j1 l" M3 d server->upp_channel_a_recv = true;//
( L% I' v, T' I5 } server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
. p, Y6 s8 I8 t% a/ R5 o* w1 W server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 b$ }; w0 c; p4 h/ x
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
! q" k" w j. e+ d3 l( B% i) i server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% J* E1 X5 O2 | O+ y- {
. g" ?) X; \+ ]7 m
upp_error_count = 0;
9 F, B6 E! e: Z1 W upp_dmai_int_cut = 0;
% m; l! M/ X4 \1 t4 @- q, {6 @" p
' O+ F8 G- f; K9 N$ _( X! j5 R' R // fill in data 8 b3 y5 F* v5 M. t: P
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);; h5 h- p$ b" D4 e. y9 ^ u
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ h8 o& _- e/ ]) |/ ]3 G. I }
# S" F, j) B9 C, u }! _* |" v4 D" n4 s- j6 \
else{
. Y0 O$ g' }- A if (upp_dmai_int_cut > 0){$ Q" s5 G& d$ C% e/ h' j' i
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 G0 F- \: C$ t7 e s Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' T, b5 ]0 f( {% }# R- }( X" T- |
) I; @* y1 k& [% \' i
* N( }5 T8 x1 ~1 s$ {" x //copy data to upp_recv_list_busy
) W- b- `8 A& L* n$ K5 @6 S r* ^* B memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
: V1 r2 Y- G( R7 @' y5 }" J# F3 ~* x
0 R/ q$ Z" C/ S) k3 l: Z: k //6 {+ o3 N- }8 C1 w) k; W
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" P6 V( @$ M' ]4 D$ S8 j, w* F; r! q
//
. S8 ~# p+ C- [" { server->upp_channel_a_recv = false;//( h# ~: N9 n4 P: B" q
% l8 ] {2 m" H# Q) z" f/ @& E
server_msg_send(server, APP_CMD_LOG, "upp recv: success");/ M8 \& h- a& e. y- |; j7 F$ \. L
}
; `" q( k! q- r) E6 ^, F }( m- P/ B0 L0 O8 n
s* y n& A( C6 S& z# F1 f" s( d: g, W1 N) u
return true;
: A1 u. s; ~! J1 P: c}: V$ [8 W% U2 Q- Y! ^: k" z; ^+ k c
( @: W- U3 x5 ]$ k S: [0 Zstatic bool server_upp_data_send(Server *server)
4 r" f+ Y6 G8 \{
4 ~: J. R) v8 t: \ if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ b5 s- G" E& u DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 G! f% _) p/ u& G' r% |% I
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 q# H j. j- O, H3 r& e" |
char tmp[128] ={0};
: E) B& r; ]. D- n& U
3 m" Q; _0 d. D6 L/ D$ B server_msg_send(server, APP_CMD_LOG, "upp send: start");
1 z+ S! k V! q+ u7 ^; B print_log(server, data, 64);
1 C3 j2 ]& v" w$ `- N- T ]1 B. J2 j1 H" I, d. v* Z7 e
//) [5 J9 }8 [$ A) S" j
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 |% \) t* h' @- F6 h, l
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 [1 Y( `9 \8 j$ l" n" W( ? print_log(server, upp_buffer_b, 64);
7 u9 T% W5 ?1 |8 {) U% b/ Y& k; G4 O% i g
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);7 f, G J& w/ h9 I T7 {0 a% g- m; y" }
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
6 C# A8 r9 E3 w) I server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT; P2 O+ G1 t) { S/ F
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: K7 v) y1 q5 }$ ^4 [
! \1 s7 _( p3 T* r
memset(tmp, 0, sizeof(tmp));
1 e; }9 I4 y* e% y2 c& I% n' d- t* z sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 6 G5 `- w J) w8 S+ e
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
% q' t" |, j! p2 \5 z6 o server_msg_send(server, APP_CMD_LOG, tmp);
?# A) e- E! \2 f$ c
3 d+ v' Y* S3 l- m$ s9 E upp_error_count = 0;
- B1 {. L. s! R2 Y2 c" p upp_dmaq_int_cut = 0;" d0 T r1 n* O' j% z9 Q4 S
// fill in data ' ?! ?+ r) X" S; u: d, Z8 Y |
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 ^1 O; D( x! {- G# J$ G4 d5 ~
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
% g/ C7 g- \+ P, E- G% e9 U
+ M: _. j/ d) o# e) x7 ]- A // wait send success
8 V9 O# }) y" {+ g while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! H t1 F, i [/ I5 V O9 x' V
7 r. e4 r* C& L/ Y // make data node in free list
+ g, P4 R% g6 a' u5 I ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 _+ z% c Z% @
server_msg_send(server, APP_CMD_LOG, "upp send: success");
3 ~4 h) [$ C. y/ y }
' T9 {8 b# \. K% H return true;+ t+ F/ E0 _; R+ R; t/ ]* _9 T
}
: O2 h4 r3 [8 q4 N! m& f! ]( z' t
+ h/ q% ?' S6 ?- G3 G
+ J' w a5 O( m/ _$ w6 x/ U; L; l. f- Q+ ^5 H2 x# r0 O/ o- \
: E) C+ ?. o- `2 L9 b |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|