|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' _- F9 Q7 [0 v4 q- G/ j6 w2 {
) j0 z) c1 R, y8 y, O问题描述:
7 s1 N7 ]$ q; u" U2 i, W在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) m; b* g0 k6 h; h( a
. H6 Q. V, w: g6 n- Q- B图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% \ o4 |! M6 E- f
+ c' w ^7 x* \% ?2 c# l测试结果如下:
' U3 E: n, x. `* {9 _6 Q138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 c- A9 Z, u$ d5 K7 t
, w, H* ^( P7 ]. \
/ g" e$ W. \9 h1 x2 t. H0 E5 w+ s) Y: a备注:
6 ~6 s" F: D: k2 e/ v$ D2 N% H1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; g; h* ?7 W9 r# _1 C2、相关代码如下:/ u$ J0 g5 J0 z! z
//UPP DMA缓冲大小512字节
4 z0 F' Z+ e1 o) z1 s#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ h$ F) ]9 y$ n: N7 g+ J+ u#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
! @1 R+ o0 v0 L4 _( B#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 Z8 J9 h( D- b. P& O/ m1 u
7 A6 s- }* b5 l& I# p4 o" l9 A) m! }$ K5 r/ W3 B
//upp接收、发送buffer5 }5 Y5 H) z1 |
#pragma DATA_ALIGN(upp_buffer_a, 8)* Z5 H* p1 @ M4 L5 H1 d
#pragma DATA_ALIGN(upp_buffer_b, 8)6 [+ p& j8 _6 W) M+ \3 T! w
* M* e; P/ P% E7 Y; h
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' W; k- I. o4 Q! s) Bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% i) v4 u: d2 F) v' U) ~5 J4 y5 B; I) E. i
$ r4 z$ N1 K7 c/ X
static bool server_upp_data_recv(Server *server) ; {* u' J/ {, b2 q
{5 j# ^$ U, c+ R/ w4 c8 A' o$ B- i5 O/ \
if(server->upp_channel_a_recv == false) {# [+ g$ E3 X* i, {2 H' d3 j
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( E. n. N+ x, Z/ y! \* Y, c" V if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 @# S( U0 e& N+ W# z2 g server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
: t9 n+ j7 s4 Y$ t, z2 J+ q
' w% A! j9 a C- }8 ^9 L
5 p2 n: `8 Y, F4 n: ~ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);# D' b; ^% B# ~" c
3 H. ~3 B/ [ @ server->upp_channel_a_recv = true;//
9 ?- F1 r6 ~0 X" w; y5 I# Z server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);$ l5 R: A' D) l/ H6 f, B
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
6 v/ ?' g H: D0 i) v8 b server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
9 h' a) ^6 Q" V9 O" U server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//( T* b3 O6 |% r. P6 q! H' H
- i8 {( Y" v% a2 o: Z. s8 Y% N* a8 b. I upp_error_count = 0;
1 m6 q0 s: W& y$ N+ o upp_dmai_int_cut = 0;
3 X; j) Y0 F7 |; |7 C' Z. c: j) U- u8 X% Q+ i, U. I/ i6 I3 c y
// fill in data
, b0 m9 O, v8 ?1 F uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) H5 c: P, s- o/ C: p, j. r
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- |3 H9 Y) K5 u n( ?# P }
$ v0 Q1 V5 N: t4 k6 N K- x! D; e! d }
* Q$ h% n. X# B7 c+ E* k6 M0 ^2 e8 S else{) m- k" o# Z! x) Y
if (upp_dmai_int_cut > 0){) n, \* m2 Z* n e2 l7 Y9 d$ F: s
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& H& N- F5 C8 W' w% c
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 b# o+ D' L/ s/ O9 b! k4 n
{5 z+ L* p0 y
6 E; r7 h- h) O9 A8 Y& S //copy data to upp_recv_list_busy
' w+ e2 ~, T# K memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% Q3 a" K$ u# {6 e5 m' ?0 Q
2 T( E2 F9 R% g: H; D //' j$ b# _' v& L" A
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
8 W6 a q& B0 ^* ?* o" w0 X5 [, a+ p1 _3 j+ N
//9 i+ F2 D/ Z9 M x, h+ x: X \
server->upp_channel_a_recv = false;//
( }; m8 _/ t5 d& q
x V7 W+ R/ I# N2 X server_msg_send(server, APP_CMD_LOG, "upp recv: success");& m8 E8 @* o/ y( v( g' Z- x7 i
}& a; n9 X; C+ t! B; Z
}
, H. I* T6 P. [3 [) _0 v
5 }6 J/ @! ^1 ^$ Z# \1 L2 \$ |" u& q5 k# p6 {" F' m) ]
return true;
! Q( y& `8 [1 J# ^}
9 \7 T @. O% U
, W, [5 v. T: A! cstatic bool server_upp_data_send(Server *server)
+ K% C6 i+ o+ A+ j, b. J6 F) {{' L' m" E6 f( Q2 n. H. k
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) n3 N- [- V& ]) x DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
, |3 a" P! @9 V- ]5 ~6 E' g8 S, j7 | unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 V+ m# i5 W% d' y4 a1 f+ C ? char tmp[128] ={0};
& A! }* f L7 p8 V! t
) r0 O9 [7 l. N3 w( ^7 D' X server_msg_send(server, APP_CMD_LOG, "upp send: start");3 D4 f' E% R* B, V* `
print_log(server, data, 64);
. [8 ]" q: n' [6 C% c
$ z9 X6 w( y2 o, i //
+ P) y+ T0 b0 G3 T! f* W* ? memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);5 W- }8 I" \! e- t+ Q I9 n. X
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
3 g* _1 @8 B- ] print_log(server, upp_buffer_b, 64);
" w m4 T5 G7 @1 X6 {# n( s
$ [% t/ K1 W4 f% G ?7 \ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);( K! [8 _. R/ {3 e/ S4 N
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
* h/ o9 q6 Q8 j# [5 D( Y# m server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;, Z/ \1 F/ B' Y* e% t& ? H
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 w; _- e ~" N `/ x
% m( v0 N% S& ]7 W+ T. d% \3 m
memset(tmp, 0, sizeof(tmp));/ \# t/ z' K0 }! a
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 N) F* `6 E/ p! f sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);0 d( B- k6 m0 J1 Q$ j0 @7 @* ?
server_msg_send(server, APP_CMD_LOG, tmp);& V% j4 Y) W/ Q
- y* P+ l* t# h- O upp_error_count = 0;
0 _% {- u! P% [0 [. X( B upp_dmaq_int_cut = 0;4 e+ Z, X5 l' i: Q$ p' a) a
// fill in data
3 u9 m* a/ g3 R5 q uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
: G: {3 L m$ m2 r server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' Q* L F5 N# B& ~1 F
9 G( q2 G1 z; ?5 {6 p* v6 [ // wait send success
: {1 |; h& t. [! b- { while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( x# Z' |7 j6 D$ k! i3 ]7 W) A6 s* `) G# j. A
// make data node in free list ( ~& K o, c* D U5 k
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" K$ W1 r+ _& N( K4 m6 N server_msg_send(server, APP_CMD_LOG, "upp send: success");
x9 x6 X# h6 S2 m% C5 @ }9 B% i8 _) o6 Q; y, K7 }2 |
return true; U2 c, I( Z' C+ s+ d
}
: B$ K, w" G3 d$ d7 B- w; E& S) M, A, }' L C& U1 f
( G! ?) m/ H+ l
. e( ^- v* y6 j% h- k+ Q
! p9 q, E+ b( f6 v& @( w- d$ o1 {# I! u5 E! G3 @
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|