|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 g: Y- l# r' I/ F3 ~7 a0 y2 L' G" a- t% X
问题描述:
: [) u" Q/ g7 m2 l在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:% m: k) N9 p: P. E2 \$ n. z
: ~, }) }3 b% W# h9 ~
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: Y5 [& }. l7 ], p7 S' G
7 D% ~ X8 L! Y4 h' N测试结果如下:
2 v/ @# K8 l& U) n2 k138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
/ f5 ]. L7 I0 i+ G; D; s6 O$ e5 u& `. X5 C) h( K
0 k& _ c' S# t9 k6 |备注:0 S5 B% I0 U$ u3 Z5 o; m
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- j; G' }! f1 }0 a2、相关代码如下:/ x( W3 \5 h$ h$ H
//UPP DMA缓冲大小512字节) [' v2 R' c4 n5 F
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 n4 p1 Q# q/ y( f+ H#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
& Q" d2 i) d: d8 N3 y+ f#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 V c [& B! a+ k; F* e: x. ]* J8 D) v) z
$ s2 \4 z1 F* y) @; o" }7 X) u, s
//upp接收、发送buffer1 h. k9 Q/ k3 w, d
#pragma DATA_ALIGN(upp_buffer_a, 8)& p+ z- y0 ^2 [+ j) n4 m, Q
#pragma DATA_ALIGN(upp_buffer_b, 8)3 _2 v/ N- v# d1 m3 F
7 b: t0 V( P2 V4 k3 U2 Qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) d" a# ]0 t4 ?& ^$ X& ?
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];( [' `, b# ?! {' ~
3 O+ J2 V2 O9 r9 @( ?* ^8 r
, _& q1 }4 i( I3 q0 ]8 K8 ^6 wstatic bool server_upp_data_recv(Server *server)
" r" C, f8 u3 @. s! w' I& W{
- P+ p: C0 `- h! l- v if(server->upp_channel_a_recv == false) {
4 P5 P$ t8 C* L5 c) f# R server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' j8 M. q6 Y! R! u) \ n3 Y( v) U' P if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' m, E: z0 @; @' G% b. X9 L( q
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- F6 i; |' ?- j6 U5 S3 W& Q3 M& ^2 [0 }2 O B6 c+ T
' B5 s2 ` G9 b- c/ i
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
Y* @/ X. k f* g
' A3 U1 Q+ R) v+ j9 h Y server->upp_channel_a_recv = true;//
6 C6 s7 F8 a- t( N/ @$ g server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
! t0 X3 J2 D# k* P: s' e( d0 j server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
! h/ Z! s1 X: z- k3 h% w; Z server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
# ] Q$ r/ D2 ]% s4 Y& ` x server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 A& Q( `) [; I% O! V: ]# T# ]* c
7 F0 \9 H! J! e; a; b
upp_error_count = 0;4 b8 R8 F/ _$ n; }# t
upp_dmai_int_cut = 0;
# a( K! B) V- Q" k3 H* Q
( X; S$ f4 w& N# e3 a6 k& M" | // fill in data 5 O8 t! L+ M' ^7 l0 E+ r
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( V7 l3 Q* f! T1 z' D) U5 W. m
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
' @: I. G" V" v8 C+ r* { }4 V; B# O7 q' Y' N/ h3 c
}
6 d r* [: K2 g. P! `& E else{$ ~ {) ~ V: d
if (upp_dmai_int_cut > 0){8 q7 t0 x/ ?# }
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 N S4 s6 W! z2 G" ]# @ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 q/ o7 v. U; r6 T5 J
. L$ D' |4 o/ p5 G; w( w& Y$ G) W7 d# {* Z
//copy data to upp_recv_list_busy
. q4 I4 D4 V3 h/ `0 ?8 O memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);1 j" W( z' Y# _% G' i& P" y- ]
* Q- G7 Q, T0 ]2 w* F( Z" T9 Q1 @
//; L, {8 H, R! i# i9 N- ?
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
& g( g3 R! Z9 Z! M1 x
( J% {( @$ _$ D& f1 c //7 t/ g& ` S& m3 R; M
server->upp_channel_a_recv = false;//% |$ a& ?# _$ K6 |: `# U
2 M" | W8 Q" o+ O* U2 @5 q
server_msg_send(server, APP_CMD_LOG, "upp recv: success");( e8 ^) K& ?8 c; L2 w' x
}
. P% v. n! o# W/ } w }6 }, U9 `3 A7 q
3 | e9 U" j; ^; ?: {+ s: \. a0 a, A$ h3 m9 c' @5 k% r3 E
return true;5 M R' o b# I
}3 x+ M }% [6 @5 {3 {
6 t3 y' j: F0 ostatic bool server_upp_data_send(Server *server)
+ ~4 z" r: @& _! q{
0 d, @) m! \( K2 F% ~1 e if(ListMP_empty(server->upp_send_list_busy) == FALSE){
4 Q1 E/ s0 `: H. r DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 h5 O1 I0 p% b x" C+ i8 o
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) v2 O9 b6 d/ v/ Z
char tmp[128] ={0};
0 `# D# k! L" `6 ^; j/ K; T
5 n2 `& `3 J0 p# U server_msg_send(server, APP_CMD_LOG, "upp send: start");$ \8 ?4 C6 K% I( a8 ]0 g0 t' |& D
print_log(server, data, 64);6 K3 _0 v2 M4 J. V3 N2 u
c: F! g$ l9 ` //
% u% T# d9 m; R' Q memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);9 j; ^+ ~5 G9 G
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);4 y5 E9 @# N! T
print_log(server, upp_buffer_b, 64);! b4 _1 t+ y) p6 s- ~' L( @
; U% a+ K$ k, E% m1 V: r# N, u; \ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
4 K: E9 {% q9 [' X$ D server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; / P- k4 s+ \4 Z4 T
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 K, E2 n0 T+ m+ z( {7 H4 c# \
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% Y2 U \5 x" d6 P. d' k, L
6 I* ~8 `, J4 k% s6 _3 \3 { memset(tmp, 0, sizeof(tmp));. ~ Y+ Q: z% z# F5 c
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
+ C/ w- ^" A% t2 u sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);9 U0 M0 n' Q% B0 M5 b* ^) P/ h# B
server_msg_send(server, APP_CMD_LOG, tmp); z% B3 S6 v! [! F
- S6 V3 Y1 Q% P% X
upp_error_count = 0;
7 w3 m; F0 k1 s% e3 U- P- r1 C0 G upp_dmaq_int_cut = 0;5 P+ A' ~2 d/ }. v: W# {
// fill in data b7 ]) x2 R' _5 |) s( y8 Z
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
6 x, }/ t, ?5 {/ j: _ server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
" e% N0 ]$ F( y+ ~
C; o2 a9 H9 [7 ?) ], M5 y // wait send success* }/ h5 P, I+ \
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , W. V E+ Q5 ^) b
& D: v0 O. F3 R" c
// make data node in free list # Z' N7 R* Z" k' {: r
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
! _$ m' d V7 m$ e+ Z server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 C4 x7 C; R5 ` j( I3 @ }
. ~, l( A; V. m return true;8 A" @% ~- Y, \+ |
}
# k: A, M: g5 d5 Q3 q) ?1 N2 r4 u$ j$ q4 I; }
' \. \9 }6 P: w9 R& r; s } m
1 ^6 a3 B# n$ T1 {3 K
: }7 C: P' Q2 h4 V
) p: }; v, e# Q; s% H w
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|