|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 l; E3 a+ `! D( g
, a6 O: ^$ {) M3 e$ A/ c8 p ]问题描述:
* i3 W* p k" T$ o9 X在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% ^9 o$ J2 O6 [# `& I( W8 ?4 @3 } ]: V( Q- M0 |; c1 O4 T
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 P# c! U% I1 O H- ^& x' C6 V ^; G8 K9 D! N0 e( W2 Y# p/ |
测试结果如下:9 t8 {( I% Q5 F
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) \' E( b/ H/ N3 y2 ~' G
2 N" C- Q, h% u+ e1 k P* q" v: u( G/ b+ b% \6 `) R' }
备注:# h' D M5 I6 \& h- x- m$ e
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! s' I. ^( U( n) n% N; `& M2、相关代码如下:
% @8 a6 `; \* _9 F//UPP DMA缓冲大小512字节' |; m0 c) N9 \# p5 V, F
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 }# M* U0 B; _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 E! ^9 V+ j8 U6 }
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ M0 `) \6 f6 Y& E2 a# n/ L6 b! y6 C; H
) U+ B/ h2 K* v q9 I% O; r
//upp接收、发送buffer7 p' k# c+ Q" ~/ h* o' X
#pragma DATA_ALIGN(upp_buffer_a, 8)
1 s0 o) s- y, h2 s7 G+ Y#pragma DATA_ALIGN(upp_buffer_b, 8)% K. |2 u# |) [/ G( K6 f
& U/ p( ~1 U% R. _* L% Q
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 q( ?7 _6 j( l
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 U' V5 u1 I: }* _: s+ T u% `3 u
. A7 Z2 D' n l+ N
9 c+ k8 z# P9 v( ostatic bool server_upp_data_recv(Server *server) " {% }% g! Q0 H9 y3 ^
{% U: {! b& I) x& Z1 ]3 {2 U
if(server->upp_channel_a_recv == false) {( w; a: G9 ]5 b+ L- M. H
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
. I/ M# S3 c& Q9 r0 |6 O { if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 x* Z3 @! v; [/ j, \, S1 ~* a
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");) [; g. x+ l/ {1 p% K8 ^; W
# c8 O* }2 L* P$ i h+ G0 Q& ]# F5 F4 {6 B" T
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ ]6 j) n2 K- [1 J% G# [+ `" t, ?
1 D2 v. t" D8 C
server->upp_channel_a_recv = true;//
0 e4 l; p2 |! Y# E1 K) s server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);- N( j9 B ~$ a0 W( b1 K: o* W
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
+ Z) y! R% ~7 y server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;$ R; C8 P* X) C# C( n/ i( O, ?- c
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 }9 k! e% i1 {( x) [# b% Q
+ s6 M6 {3 z. Q" m/ i0 x2 M. e; ^ upp_error_count = 0;' C x! K/ B* R7 @, |, a- p
upp_dmai_int_cut = 0;
( l" G1 b& o- n# [ p1 }$ a; k4 U) t) @( _5 v' ~8 ?
// fill in data
6 m$ _% v* }; g. V) t uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);* m& ^/ c9 h9 Z5 X7 H/ c' ?, _
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
+ I+ N, ?2 [7 A3 @( n }' F+ M4 b2 n: p& q
}" u4 H! k9 p7 \: `( x1 ]& N
else{8 b) U5 E5 | l
if (upp_dmai_int_cut > 0){) f7 _* b$ Q/ X5 d: F1 P
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ I+ G6 H& s4 t( k7 b
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 B( W6 ?/ {" r
Q3 r: k; [; H7 J4 K) x
- l2 g. S0 u$ e2 I //copy data to upp_recv_list_busy1 L" G& o0 Z( _1 B$ I3 s0 g
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& M+ |" u) C0 G2 q ?$ J; E& L( {3 }" L8 H% T
//
& v. m' n- P& b5 C ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);4 o! O: T0 X! ]4 R) q; b
& V* G1 L6 x6 _& T% N* A
//
4 s. u3 w" Z/ [( b0 l! V! z4 Z3 r2 s server->upp_channel_a_recv = false;//7 Y4 Q! ~# \4 x8 ]/ g
7 R$ G( D# u" T$ B% L) W/ x0 K" n server_msg_send(server, APP_CMD_LOG, "upp recv: success");
. a# F8 E9 U `; W& c$ p }. z- v- l6 ]2 ]( s7 h$ O
}6 R7 d* v9 L) l" z" [
: q" \8 f9 A. y) M" U/ G. q
# o& L9 g8 f/ B5 `1 \5 q6 p return true;
" ^& A( T4 {0 _* G3 O}# ^6 \: D5 |1 X; ^* u K
0 |4 L6 s) s- ^# M4 f" ]
static bool server_upp_data_send(Server *server)" Q1 U3 p3 E; v8 Y3 [ F4 p& c
{
& ^. t1 g4 y% h( G- b: u. y if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; X+ r" i d! o, d2 @ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 N, z$ v; d' K# |* K/ m7 ?3 o
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 L: h) s1 M7 B1 Y. Z3 m% ]% {
char tmp[128] ={0};
^. A/ o( j+ x( h( n# l
! a" U+ j% q7 O, v server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 [0 |. c! ]* F print_log(server, data, 64);
! ~" s8 @) L7 M; T2 F
# k, R; D n& Y, Y$ r) g3 ^ //* r2 R5 ^) D3 o& K
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 p" o' s& Q" b, m! g- m memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* ^4 i1 Q$ [2 D( E: M
print_log(server, upp_buffer_b, 64);7 L$ t' ~! F! ?! E9 ?
8 ~+ v& Q% x; G4 [* r% t' d; R
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);; f$ I! E. h S# z8 H" g
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
$ _6 d+ z- P& T1 U" R server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;; g& y. P# i9 {) l% O. Q) s
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 t# _ \; _5 b5 I2 Z- ]& s; t
4 r9 b$ ]6 a6 E3 D/ ] memset(tmp, 0, sizeof(tmp));
0 P; W/ d+ T5 y7 t; Z7 }( o sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . l( u" G8 A2 s+ p) ?9 Z
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) V. X4 x( g+ J6 Y, ]8 K7 S- \ server_msg_send(server, APP_CMD_LOG, tmp);
: w. d/ B3 B' L/ J$ k$ B( W0 `. |; f4 s( C& u8 u; b0 z! h
upp_error_count = 0;# q4 D3 F4 i% B+ t# n
upp_dmaq_int_cut = 0;- o2 P* v% u- i* P
// fill in data
1 A. @! U5 L3 e3 g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; s, K% [- w, P! w& l, n server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
1 D( v1 O* w' X! O( {: \+ c" K; l' P' O, k
// wait send success+ U& S0 v. A6 S3 w7 g4 k
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); # X. R4 Y$ E% h
, K5 H0 C% L$ z2 |9 ]& g5 Q // make data node in free list 5 o) b! E5 u2 q, v# E+ X
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( a% d! l) x0 M; h& Z+ O8 i2 j" i- R$ V
server_msg_send(server, APP_CMD_LOG, "upp send: success");% f; X& n# ?3 |5 ^3 M+ |8 d. Q
}
. t7 [8 t' |9 [9 i$ _6 t. g return true;
" g( V6 p' y! U( n }}
6 Q4 |" a0 S# c* k$ h6 A/ g* m) }. q0 q" u4 x+ T
, h4 o/ K" r [& E' r% J n: ~) N8 J) `- t" C
' P# s& U3 I3 r z" z
( l7 V" f" [/ `6 W& L* R; T' F
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|