|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 e! b( A3 w% r4 u' v1 @
! u& \/ N$ ]5 P6 r7 `
问题描述:( [2 y5 n# \4 Y0 m' q
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ } C; a' H+ n
- _) j/ i: N8 F图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* `' I. t, S. d3 U0 @
, z( k W1 h: m7 {测试结果如下:
' \1 H, t4 M2 Q9 i/ X: ]138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 W& U3 g& u& K- E5 N% |7 H/ n
# Z0 K' d% s ?- H6 [ E+ m/ r
+ T8 W' E+ Y% O q% _. `" M. a" ^备注:, g: r3 \7 b/ ?- R( U, m
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 r; o1 ~" t" [& ~7 U9 g2、相关代码如下:+ @6 E4 o* D6 ?8 h5 M- q
//UPP DMA缓冲大小512字节4 B* G' O( A \ _5 @, C% _
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍3 t" J; T/ v5 b: y9 S7 M
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 [2 E# Y9 h7 n
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)+ b6 C/ S3 x7 K2 C
( F& {* {. T8 D- A7 a
9 \4 {, n( X2 m1 S//upp接收、发送buffer1 ]1 K- N2 H- W" W4 t& m
#pragma DATA_ALIGN(upp_buffer_a, 8)& @4 \8 q0 Z+ n% M. S. Z
#pragma DATA_ALIGN(upp_buffer_b, 8)
" g' D* I" d! M, o2 X& x! C9 \# \; L) E! D' a- i
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
3 i+ D n# J9 h. ~+ c! D2 q9 ]unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];7 F. [) H# [- b; I/ X
. z/ U& m5 P/ i, V6 Y6 Q
: `4 n2 ?! Z" t3 n0 b4 a
static bool server_upp_data_recv(Server *server)
5 \! y3 I- Y9 T7 ]{! a: h3 Y6 K1 c/ r& D- |" e$ e
if(server->upp_channel_a_recv == false) {" Q4 p- X& {# T8 d
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 c( G# Z, p: T2 } r if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 {) O, A7 Z. m1 [# L0 J" k* o4 M
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");. _' x F7 w1 I# ]& T5 W* l
2 E* ^8 F/ P& u/ A& F+ `: c
' o) y$ I7 q( D, [( Q, P4 }1 c5 z memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ H) b+ V1 j* K' C2 {$ H' ?
7 U1 a" }3 M* n# q. W7 t. _ server->upp_channel_a_recv = true;//
* I- ^8 {2 K) [ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
5 |; V: c) D2 L( s5 H* P server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;* s: w; m) M: ~( T" C$ ?- n9 w! L
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;! R& e# u! I: l/ X
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ E6 x9 e& \$ j) V) O' @
0 o* _. l: x6 W. o. L upp_error_count = 0;+ f6 P$ n% c! K8 b+ m" |7 ?6 A6 R
upp_dmai_int_cut = 0;
) a% ]9 c, [$ U1 T1 ^ l3 `( G+ D. R4 ], ^" V$ l. Z1 V
// fill in data . L1 h5 W# t, _4 x$ R F
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
# s* O8 V: c! \& F) |6 [2 [( D server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");% a; R/ b/ o2 I* E! W1 [2 g
}
3 s1 ]/ v- v: Z0 ^6 O1 \' a }7 @0 g5 ^0 ]) [2 k/ E
else{9 r# \: F" \" Z
if (upp_dmai_int_cut > 0){- q J7 c7 @9 Q! R; w
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);% c, E7 h# ?. L; R+ }4 N6 M
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- b h1 X' N/ C6 f
5 U `0 X9 z& }3 X
. g" I8 F' z& O& Y+ T //copy data to upp_recv_list_busy
) E0 M0 v/ N/ S7 j! U, [& x5 }9 v memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) ~) ^$ o6 v9 X4 Z/ q
E/ l" t( a1 T8 g) D2 y! ~$ m
//2 {" r/ K* C0 K8 b) ]7 S" i! k
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 F, q" h* _7 K( ?: W. v. S
$ c$ {( U9 {3 X$ k9 s+ i //
+ c) q1 g( T' g$ D2 j9 C server->upp_channel_a_recv = false;//8 M8 N0 ] {1 S; G9 |2 M5 z( {
* [9 l7 z" W3 s5 p( |% ]
server_msg_send(server, APP_CMD_LOG, "upp recv: success");' R$ J' c. t4 W
}
) a4 P8 a: c! k. |' K2 I }
) T: N5 M6 b; C" b3 E4 W. v
& K% n- C( A& W* f" `( X
) g( r% d" @. z7 H return true;1 J! Z. ^, K8 v5 E1 b4 r, G
}
3 }9 p1 S! o8 v' I! P& G& U1 n+ ]
3 A1 }# u+ i d4 A' \static bool server_upp_data_send(Server *server)
' S! Q9 n# V6 Y' [" Q6 P{
1 n1 }& D. E. ?& Q if(ListMP_empty(server->upp_send_list_busy) == FALSE){* l7 W8 X& p3 m) k
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 Y4 T8 N" ]$ \0 t. \& S unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);/ a5 B" G7 @( i t; Q
char tmp[128] ={0};# G0 H/ L( |% C- K: e6 h% y
3 D: i4 v. N1 T$ v
server_msg_send(server, APP_CMD_LOG, "upp send: start");
( Q! k; R; R( q2 ]. a& [ print_log(server, data, 64);3 p- D0 t6 n5 G7 A; J3 R
6 h z3 ~5 l4 f6 @. u A* w3 K) C
//* }3 o7 Y a; n% Y. o1 f! d/ ^3 I
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
5 l. d' g, C0 a' p. ^5 h Q memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);7 A( U% i7 L! P7 v- j
print_log(server, upp_buffer_b, 64);' V2 m# P; H4 J! f& P
; K$ S" }9 C3 Z0 o1 g# L
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
3 H8 ^ f W1 K+ L server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; & y Q+ V% F1 ]: [7 [4 K! S3 I
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;) D2 M/ u1 n- w$ D* O2 ^
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' E$ C8 m4 c5 E. a. K9 z5 R1 X- I" Y9 z3 [& w6 e( R
memset(tmp, 0, sizeof(tmp));
% q7 T' d( g; v0 Y' H sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
/ C# i; ?* Y! G! H- a sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( H! n3 B/ E4 E @- B$ ] server_msg_send(server, APP_CMD_LOG, tmp);
. y, u* t( D( N+ f k9 b5 J1 i3 Y/ o$ B$ R, h
upp_error_count = 0;
' b3 x. ]8 \: h6 S: {" Q upp_dmaq_int_cut = 0;5 c2 [6 r8 \6 U' h* R9 `
// fill in data
4 I* s! h& a5 P% N. p5 U u4 ~ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ( {* Q, l: z7 f: n0 I& b1 `; \
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& `5 _6 ]( }( A7 O' a$ n5 f5 W" R
6 T+ C3 e+ W9 ?, |4 f. S. S' ?
// wait send success* R( Z: v( y. n' \; A
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
6 g$ o* {& Z j2 Q6 Q% H: Q9 ]3 W* r/ T6 d. W- V
// make data node in free list 0 t5 R$ V2 X' D# k* P) B
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- _ Z7 j! A+ |5 C server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 x* a4 a1 R) _* { }; i+ G4 H$ Z8 m8 r
return true;; _1 i7 x) V9 A+ E5 A
}
/ S% W% O4 M& A% ^$ G! I0 ]7 i
5 M4 I4 c: V$ [; n, Z- _ N/ x4 s* L9 K [( `* i" Y; C& E7 T) ]
: B) G/ |7 P: c1 X9 q; ?: [- g5 E0 F! \+ k+ O" ]- C, {; A
5 `7 Y# g, W0 w6 E" ~- ^+ |' w |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|