|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
_. A% _; `) l6 J1 p2 y/ S) f0 ^' K; @# x5 B
问题描述:' ^- P& |/ d% C/ U9 B: S
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:2 U7 o( y$ q0 z8 P% I3 b7 v
# t$ ~3 U" j* [, C图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
' }" u8 f* u0 V Q X% H/ p% g& e( b' v+ h: {. {+ |
测试结果如下:- k- o l/ J9 o+ B$ W( S
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?* v, j/ t1 C* h( ^
+ B( v8 n- y3 ], I& b9 L+ N# N7 G+ n) q" e
备注:# A0 W8 e1 G6 E
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 G- l! r" ]2 o" J! {# d* D7 w
2、相关代码如下:# ~3 M% C0 Q. `: }
//UPP DMA缓冲大小512字节0 F! Z+ O- b& C, c: G2 ?9 n
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) X1 D/ ]2 d5 {# [
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' T/ j: u5 M6 m$ D4 P% c7 x( N
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)8 K7 }1 y. K" c# E; j
4 F9 I# o' E% L- r6 F* ^: S5 T7 H, J
//upp接收、发送buffer
" n) P7 ~5 [: U8 ?; s8 e$ V# B#pragma DATA_ALIGN(upp_buffer_a, 8)* j, g4 h0 `% R7 g* m5 M
#pragma DATA_ALIGN(upp_buffer_b, 8)2 v9 U) m4 ^% K1 [' `9 V
3 g( w& o, S$ G! [+ Tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ }! `3 ~& O$ I( o8 junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ ^ c4 m$ T5 z' ?! ?
9 f+ \/ Q5 Z6 f6 h7 n9 v; f
8 t) a: T; h2 S$ R6 i Astatic bool server_upp_data_recv(Server *server)
: e, ?8 D! w1 E( E/ [{, o6 x3 L3 r& a- t; B; w9 i
if(server->upp_channel_a_recv == false) {
; n+ k+ P1 E# ^1 j7 W" c/ ^ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
3 c/ y; z5 _8 o" ] if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: w( S8 L: b4 t8 U
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");7 B; Z& A. ]9 N! Y3 Z" k: f4 S
2 ^! x, M4 L0 |/ R! S
. S; t: U$ G1 \0 a2 w
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);' n! p7 [! P9 i7 B
k. b% i* v, K7 q
server->upp_channel_a_recv = true;//
9 J0 Q7 o/ E( R/ w+ F2 f) l server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);0 N6 Y( B9 v$ W9 u- f: {6 ]
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;9 c' S( r8 E& [1 x9 {% T
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;, X0 ^* a, G2 I' W
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% Z" P5 @, A4 m O V- _* j5 h& E
upp_error_count = 0;+ e. |4 |) `9 S7 {* H
upp_dmai_int_cut = 0;
6 q9 }4 P- t% Z0 _. m! W2 u
' k( k+ i; R* d9 W% m // fill in data " U0 M& \; q* t+ W5 q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, \0 V& G% M( ~8 Z0 p+ R server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, a9 D ^5 K# H1 k2 y0 A* P9 c }/ r' x: m% c/ T# V- y* m6 V
}; f5 O- j* Q# S
else{1 M7 r% i8 D- ]) [
if (upp_dmai_int_cut > 0){: d" \1 c% d) N5 b% @
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 W3 L( K( D4 I( ^ S Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
8 K. G: g1 S1 y8 h; n# y. r: n6 A0 P. e) o! I, N
4 N' _; C4 r9 x
//copy data to upp_recv_list_busy
$ f& ~( Q# R( T6 ~ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 R3 x- L( f! T2 }; V& B o' r8 m
W" r8 N; X# j, r
//
$ L9 g: n; C5 f2 e- i: n ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);4 h. p& h! I- J# F3 u
5 M$ h. K7 `* X8 N3 W
//
0 c. L( d+ w& u/ w- r0 k1 n server->upp_channel_a_recv = false;//
8 e o. z8 x L* n( x- I4 J b% g1 O# ]% z+ N9 X v( X' l/ o
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 y" ?7 `# k( o( Z$ p8 T }
/ k2 }/ U; f5 K }
0 ?5 p9 O% k% @. q; l2 F
7 ?4 u [* Y5 v
: w( n& u- [3 n1 D( l- l5 K% L return true;
$ u4 p6 D6 x' B; i}
* m2 S% B: I5 j
/ u* t, T ?- K, U) a; D: L% Wstatic bool server_upp_data_send(Server *server)
2 {4 [/ k* P( v) _' \3 P% l; H, @' ?{$ W2 f. G% z- m; J8 `$ i% d* W( f
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 a' w7 _2 j" j: S3 s" |+ O2 ] DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 e' T$ B. `, B0 D% j
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);: ?9 c, V/ `# ~3 J. X9 g3 B
char tmp[128] ={0};
6 {' i! [/ q9 D# c" N ^* x+ B
server_msg_send(server, APP_CMD_LOG, "upp send: start"); C" S% ^0 o! @9 M* q4 V% D
print_log(server, data, 64); l8 n# t n5 K+ |" x
; [+ M/ Y' O( P" a/ Z# J4 G //5 Y1 z K( X! e
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);% A- F. |2 \& k- Y5 D; D) }! B* W
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 D7 [3 Q/ h2 m$ g print_log(server, upp_buffer_b, 64);
# o# L- A/ k; ], B9 y- X) i' I( Y+ V( g
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
5 l+ s, \% l( b& N server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 2 ~; r* Y. o6 F; I. H, [) G! i
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;, l/ ?% A9 H8 s/ `3 W S& f% `7 f2 A4 V
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ {9 _2 _- a1 s
1 F# E* P* ^6 [ memset(tmp, 0, sizeof(tmp));6 ~" ]5 F4 V8 p2 k$ |5 y- [/ @
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: ]0 N' C. k/ X5 Z: f! R6 G sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);2 Y6 s7 u7 F2 E. `
server_msg_send(server, APP_CMD_LOG, tmp);. h4 Q$ E. K" F& z& o& a
; `9 N" |2 X4 V1 x- w9 w& }( @ upp_error_count = 0;
. Q/ e3 g! t; a4 O: R- A$ I upp_dmaq_int_cut = 0;
. t" g- e5 `6 E. |, j // fill in data ' ]% ^0 r1 d3 K0 _) @
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; e( L. o$ L& J& W; W server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 x- O7 C8 b8 P
/ [9 v. Q F7 }" j3 z
// wait send success
! f. ]6 k1 a* A( v, Y6 e: }7 [ while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 {+ l( z. j% v8 g2 S% }* ]
) G2 Q9 R( F( Y& c
// make data node in free list
# k" _0 O7 q8 V" k3 |: c" ? ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
4 W' [2 ]1 X6 T server_msg_send(server, APP_CMD_LOG, "upp send: success");. c" t0 _8 D$ q" u/ k3 S
}
: Z0 K) n9 L, K return true;
( P3 K( a B4 b/ m# q0 I}
7 P0 @9 Z( e% C, w* G9 m: ^9 c, ~" }/ O r9 j! g- s0 l& Z7 z" ~7 ]
/ w, ]9 R$ m' q. i; }
3 p3 G/ F( \" {: A9 g
. h- z7 K, ^5 @, e5 [* q# B' g/ G2 h. ?" x' F
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|