|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 s9 x) H) B p8 w0 o; A& q/ J+ k% o: y A
问题描述:0 T+ f' A. B2 ~: t3 b1 J
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* Q( l. k4 X; S/ C% m, F7 \
' n0 N1 R1 U+ J
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ h% v! S4 V- J( { S) P$ D
8 ?# ]1 |- Y' t/ t测试结果如下:3 [9 {- r4 b* H% D7 W; r( w* u
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' X1 H" {6 l5 _: ?3 \
, L3 X2 Q7 X' u6 l( T
; b0 }: {4 @1 _$ `+ n# m备注:
9 R9 z7 j8 T6 z4 ?1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# W' h$ U% `7 {! T2、相关代码如下:6 l! \' g) D" f4 n7 g+ ?" \
//UPP DMA缓冲大小512字节
I. _/ G' x1 d3 B2 @: w#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 J* o8 V+ g: V9 o; _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* r5 {' i! N, m6 R, ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& h5 ~- @6 V/ j# A* x3 x2 p
' k# `9 v7 O% ^: l Q5 `# b. w
5 Z6 D. O/ @0 ~+ j% h
//upp接收、发送buffer
- ]& t8 a. i. l- Q4 Z' r- I#pragma DATA_ALIGN(upp_buffer_a, 8) g' J% j. }+ |
#pragma DATA_ALIGN(upp_buffer_b, 8)
* k; n, N7 a! R9 A( F# Y- u
) }( I5 k! g+ S" Y8 Vunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 p6 u% X0 x, z& Y. a, d: H8 junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
T2 q5 P: Y! j( [: t0 X+ ~" [$ @0 O' ]* J: ]9 R
. Y, p" I: o' T, p8 O X4 ?6 `
static bool server_upp_data_recv(Server *server)
% M. F0 l& ~9 e) G' l{
8 q' _% B+ p0 N/ r, e( B( n if(server->upp_channel_a_recv == false) {
) m7 \7 U( [( a. I; R server_msg_send(server, APP_CMD_LOG, "upp recv: start");% P+ U: u( P& z0 a
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 X' _0 m: n: \: o server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- x# i( V, F3 \) j6 a4 I
! \! F% D( T/ _0 c# Y' O( u& ]
& M$ \2 s$ h1 B8 W& b9 U memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 ^7 F4 D. x7 a- d F5 U( Q
% b7 \4 _/ g$ D" t% d( B. M( n G
server->upp_channel_a_recv = true;//
5 ]. ?, C7 j' Z, k p( }" P server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
?- y# a9 w2 E6 q8 z server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;2 U0 O% I* U* w" n4 h/ v3 ]; T
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT; U6 R5 d8 L+ H8 }+ U, {, v
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; Z7 T, c0 P6 s0 { e: y
! K" l: F5 x% e! \& o
upp_error_count = 0;4 M3 _# I; A$ y- o7 @
upp_dmai_int_cut = 0;
# u ?5 M7 c# K9 S9 p4 O' q0 k1 h, L0 n+ E# L7 u4 K- X4 s. h% Q) a
// fill in data }; \1 e/ z7 U f) i, S
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ M: i& S1 w5 m4 B% Q
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 b+ q/ y% _5 a& |" i/ r* w7 w
}1 x1 o; h0 e) D! f. V/ u) O& a1 X5 `7 @
}# X: R8 w& |$ |0 I/ `/ _+ ^& Y6 y
else{5 W0 C4 T/ s9 J3 h
if (upp_dmai_int_cut > 0){& O1 ^, t' T/ F* N0 y. W
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 }8 _' c2 L4 K8 v Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 y: W3 ]/ `3 d6 e k
5 V# j- B1 p! S( L' N' Y
5 B$ g* q7 e. B# \ //copy data to upp_recv_list_busy
: D1 x( M. ~+ G: P8 g8 @ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* T4 h" S0 h0 _$ F k. {
% _$ f0 ?$ w. j) k h1 U% f8 m& C
//
0 G, @9 E" f/ B( W ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
6 v- Y- b% I% |) W2 o4 Q' v6 @2 M- s& E; t/ I
//5 u4 o, W$ T) W! b; U$ }( Y I
server->upp_channel_a_recv = false;//( F$ m& F. S j1 g- I2 f
9 Y+ w. v' N4 G/ _, {
server_msg_send(server, APP_CMD_LOG, "upp recv: success");2 J( D/ [4 C) y) X/ Q7 y! g
}
7 t& x1 c8 Q9 p# U0 d9 r# ~ }
% Y/ R: C6 W) S. f: a9 W. O1 w9 Q! i9 x/ {6 _
) ~1 ^6 v+ I- Z; A8 f0 t6 Y9 E0 V return true;7 Z9 O9 V u5 `6 J! S
}) X! l; b' n. o( N- C; g0 O
6 u( ^% {8 O1 V9 N; q1 j! sstatic bool server_upp_data_send(Server *server), |# _/ W0 @1 H& S8 B
{7 T8 r- [: ]7 }# ~% E7 A) s5 W E7 [
if(ListMP_empty(server->upp_send_list_busy) == FALSE){4 ?1 E1 e3 s9 e/ g- v4 ?1 f
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 ^1 q3 c( p& ~; C$ @ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( Q, B8 _: k& c, C" q8 b6 k
char tmp[128] ={0};5 ^3 D: s, O! t% X$ v
1 Y$ J! o& N: t" L
server_msg_send(server, APP_CMD_LOG, "upp send: start");
+ s6 ?3 [2 q8 U print_log(server, data, 64);# k3 ]/ w A2 u8 l6 k5 F2 {
9 ~0 W9 F6 E- F2 b //
, \* J& e# e( D% b* v memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
, M( G" I; B7 V/ A1 o memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
4 i4 W! |3 |- `$ [ print_log(server, upp_buffer_b, 64);3 W3 k/ h4 H. f9 k9 S+ j( B9 o
% u$ z4 w/ K' x! _/ [6 v" I" t4 u server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
6 q7 a1 T j( u7 n) R a( m j server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 w3 i0 `) D# B, u" ]! W: l+ f server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;: [# n! Z3 q! o6 E$ X( T7 D
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: T" f" T9 V4 r' d7 J5 k5 D9 C; ^5 L3 j N3 w1 K: I& h4 d
memset(tmp, 0, sizeof(tmp));
. m; ~# N' q5 C4 v9 n1 J9 \ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
8 T. n7 D% F/ D- R, c$ K( } sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 a3 L; \; w) K* Q9 x# _
server_msg_send(server, APP_CMD_LOG, tmp);7 s$ h- G/ `; X/ W2 L, o- K$ g; O! p
6 S/ p6 Z1 B6 L% K. A6 a! [" B upp_error_count = 0;
; c* ]4 `! @' A7 X upp_dmaq_int_cut = 0;) Z# f/ _9 E3 J7 m+ ?! D
// fill in data
. `% Q4 G/ W$ N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* G! y& C I Q2 r" ^9 b: D4 _; ?0 o, t server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 C; k* A2 ^$ c- i" q. |3 \* U+ O( P
// wait send success: }) h8 \! F" i" J6 x' q1 `" V
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 R# I$ p9 A( y
* v* [( [; H2 D# Y // make data node in free list + p7 l5 w6 E6 H2 }( A( C: o: e
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 v' c2 n3 I( s( V
server_msg_send(server, APP_CMD_LOG, "upp send: success");
3 B7 H- [* h9 q }2 U; W2 D$ F5 Y3 ~( e2 C- A1 b
return true;0 G/ Z4 p5 o) E3 a( x) q$ O
}
. ?$ W- Z$ w4 A* y# c
7 j! E- {* A; f1 z& j
1 {/ i2 u/ }; t4 t, F9 [0 l; i- m3 v! s6 ]9 b% R
8 {9 l: {/ R% J9 Q- @# b3 |- Q4 i0 P
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|