|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 ?4 \8 c2 R0 W: Z
- R9 @' D" c6 V$ i& i2 j' k
问题描述:9 k& r( \; \# Z4 w& c+ k
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; K j3 X t. v" y- Q+ |' y* F2 x$ C7 O9 [7 Z! \7 _7 S7 k0 E
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% L4 d5 ^. S" P+ G- z4 K* o
# n, G" |5 V3 z测试结果如下:
6 u1 U2 F/ b0 C5 G! K) G138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?5 H: R# I2 q1 ~- y1 I
5 b; o4 ~: E% R8 x; S/ Y) g6 p, ]: \
备注:3 p U. V& C9 R
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" f' V$ ^6 |; C: ?/ e( m2、相关代码如下:
" J. Q2 |. b. {/ V. ?//UPP DMA缓冲大小512字节# a' z- P: v* j7 Z9 G
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! h0 X6 H. W. `* d
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 p8 D R, v$ |- X. ~#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
* I' }/ N- ?7 v/ o4 z5 N( p
/ a$ r% w$ O, c( ]2 b+ o1 J9 F0 Y8 h! j9 ]+ \/ [( Z
//upp接收、发送buffer* r/ ]5 f8 E& K- V" }
#pragma DATA_ALIGN(upp_buffer_a, 8)
8 U1 Z5 x: X3 g8 M& P1 r* R#pragma DATA_ALIGN(upp_buffer_b, 8)
. N. ]$ ^+ U; u* O) ?5 W& Q7 c9 i
- ^2 l. J f/ N; bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
* x: [1 U" N; t7 Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 }0 x* U" A0 l) a7 f6 J
! A2 d, y% r7 A( }1 i, t0 M
$ ^' s% P7 R" w" @; G; bstatic bool server_upp_data_recv(Server *server) , f9 Z. ~+ m# n4 I K. c( S
{
/ @" h' n, O5 U7 V7 G W9 d if(server->upp_channel_a_recv == false) {) r s) Z" {' P6 ?9 X, V5 _' V
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
8 h7 D& f# K% ]* D X9 G if(ListMP_empty(server->upp_recv_list_free) == FALSE) {, y o5 b* k6 t
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 ^, m! W) F7 v8 g6 D
4 C- {3 M$ V0 d. W0 l
|2 P+ \, z9 U memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);) p" J8 S" u1 z- x
2 e+ _2 _0 t, Q. @# C0 |$ b- m* e' o server->upp_channel_a_recv = true;//
0 U; N8 f! Z- H+ S server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);3 Q1 U. s, @" ?! N; M# l
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
+ I$ F. j' z8 ~2 P; p server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;% u( ^; O% ~# X7 A" W9 g: ?6 z' r
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
& d3 ~8 u" T/ k& Z( e: N. O
& U- [8 ]6 O& w- `7 I upp_error_count = 0;
, @ G% K/ W2 U upp_dmai_int_cut = 0;( |4 s% _0 S# W: I' N
, D. g4 I+ p- l3 g& ` [. A# d3 H' z // fill in data
: W2 `% S/ B* l. q uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
& h5 o: j0 `6 o2 j" a, w9 b+ y, e server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
9 T; l8 {2 n( I& X }
& M! w, W* N% J7 y7 G1 a4 ~ }; A3 Z, z1 F1 `! s6 X
else{
6 d/ e, R9 w8 [) [/ B; O if (upp_dmai_int_cut > 0){' n; o7 w$ d7 R2 O$ i3 I' H: o
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);1 S1 ~' q7 s- b e4 a
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# ~/ N' U+ y1 s! ]
& @2 r+ u* G0 r+ d$ t2 h2 R$ c3 n' T3 z2 w' v, Y
//copy data to upp_recv_list_busy
" V4 v8 J4 R4 f2 ]/ f memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ o' N- O( O9 ^' y( a5 Y7 R! q8 i+ p! N8 W/ h7 c- u8 G8 a
//
6 Q! ]' H) r- {; w. Z6 @( G6 S ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);) V3 u( S2 a8 m4 X. z2 M9 y }+ P
8 e% O8 X3 G7 ]0 q7 w
//' g7 C0 C" a2 |6 t
server->upp_channel_a_recv = false;//
0 J5 d2 C X4 X1 k* W" R; I5 p/ \+ ^; ~ s' A) ?( T
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
$ w: T2 w+ |4 f4 M! i: r }3 g' B( z3 R4 G8 X& v
}
- g; _+ m4 A) d% k9 w# y$ O# k+ m$ s0 B$ {3 X/ Y5 n" K; z
5 V3 S& O3 x% |2 R2 w4 z: _9 r" E: p
return true;# [! I" ^* U2 I @
}: w$ y4 B, c$ W- E
9 W7 }/ l- `- J& J: g3 @" q& g
static bool server_upp_data_send(Server *server)! x6 O2 p' r4 X
{
G9 y1 l5 I X if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 a& O) t! \; E- C% ~% `
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);% h1 ]9 g( x' J4 @3 P$ B. U1 q
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 G+ y! D! H5 e
char tmp[128] ={0};* P4 f7 H2 @7 `/ X, q5 t
1 q9 P, T2 n0 F
server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 p. ~; f' q- P3 e3 ^ print_log(server, data, 64);; K- z: ]7 ]+ o! k8 \( P5 e( Y' z
3 `2 n* _+ J: C0 W9 O
//8 r- t- s; y4 }% Z1 _3 f4 {. X
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& }4 c" R" d$ r4 Z memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 \8 M% o" J& E# M/ ?) k! k$ r
print_log(server, upp_buffer_b, 64);
( L8 E j! |; a5 Q8 t: f. r9 G! d/ ^4 ?+ o7 j; a
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
) w: G B0 t' T8 Y8 e server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
- `( J( T7 e/ F' j server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
1 ]3 \# d R$ y server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: h- ]1 H6 E* Z7 J1 x
: Z9 P) v6 |1 e; T memset(tmp, 0, sizeof(tmp));2 V0 Z8 C! @2 J# a3 C
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: x6 s! t+ L, F/ N3 E2 _1 B4 V sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 ]7 ^8 s/ [+ z, D' x: ^1 c
server_msg_send(server, APP_CMD_LOG, tmp);; O) Z5 c6 k, T
% \% v- }" m" m8 ^$ @+ m8 R4 l upp_error_count = 0;
6 d6 J7 x, h) U" t9 m4 j" G1 M$ a0 J a upp_dmaq_int_cut = 0;& C+ I! P! H: H+ z+ }$ u
// fill in data 3 c$ g9 j% j& Y* \, v2 R0 [
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
7 Z' a9 l. C) H0 ^" ^* _ server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 _8 N& L+ ?* A! L7 r) X
2 p+ m) h8 ^6 O; I. G- U
// wait send success
; V2 X+ H; p3 ?7 a. \ while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 4 c" e1 p4 ]/ E* m
}; z) }$ }8 Y7 `+ Q' r' y6 M // make data node in free list
i X: N: a0 g( P) N ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 Z' h/ A: m% Q# I- K- G8 A7 O6 w% O server_msg_send(server, APP_CMD_LOG, "upp send: success");
) V8 K# t* t5 k: W6 E }0 I! S! w' C* L9 }
return true;$ Y! b) d- b- b" t9 ~6 m6 Q
}
6 N4 v- w7 j6 E! Q4 s$ e6 u+ E; H) _: w5 C: Y0 k8 v3 ]6 A
5 k% [7 j3 a+ K+ t9 f! I
5 f$ D3 V/ N; \" h* P; h# f4 Q
1 e" `: c; H% v0 q/ ?2 H4 `- @5 F5 j8 r- J5 ]9 \9 @, e. j; _6 [
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|