|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 K+ Y2 M4 t0 Y! F+ R
X+ i3 k) i7 {% e
问题描述:
% O$ a& e6 F* D在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" U/ f& _# P4 s
4 ]; V( [9 B4 v. k& H" W9 _& C图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% ~" ?. r0 V5 p- D7 O2 {* p# g* I6 C3 i
测试结果如下:. }% B3 w& D2 k+ v, c% ~ \
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的? C) z4 t, i6 N7 x
4 E4 c. p6 h& Q- y3 X9 Y% u4 j7 W' y
& v& l! F# ?' ~5 r1 x
备注:# W/ v& G! e! s n. ^
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% T$ N$ B& E' m' [
2、相关代码如下:
3 N0 b2 [( z6 }' u5 c//UPP DMA缓冲大小512字节
+ Y3 b8 f* R% M6 B3 J. B1 u& y+ m& V( T#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 V) Q- s- k7 F7 J$ F#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" M0 `, W& R- Z: D4 d/ W% h0 ~: g#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% ^/ r( ] {- Y& I; o
. p. u* g/ Q9 ] Z7 B4 R$ k6 P$ y O! c
//upp接收、发送buffer
' u% G4 X) ~7 x. J5 O( F; v; Q#pragma DATA_ALIGN(upp_buffer_a, 8)$ j" O" ~+ J) \9 Z' h9 h5 O H
#pragma DATA_ALIGN(upp_buffer_b, 8)4 P; I& z2 d( U6 T7 o
7 g, @: V+ n, _# m9 z B
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% z( _2 P) ?; V* s6 v' `unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, a) c& A& ? `% j b7 C' s) @1 O! O E" V) _8 T0 \
1 Q* P( h; x( F! xstatic bool server_upp_data_recv(Server *server)
' w- O5 K" g. P3 |6 B3 ]6 K) i! v{6 P; m- I! Z0 M+ a9 b& Z
if(server->upp_channel_a_recv == false) {
9 N6 ?7 u2 d* c server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% C8 R/ N# k4 U% @; S4 I% E if(ListMP_empty(server->upp_recv_list_free) == FALSE) {/ ^ s6 M9 p! L& s' `' u0 W
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ Z2 X# o: @4 L5 f! i: g
, A7 u( b! E+ u0 ?; s
; U1 {% R) I/ _+ \ Z6 z! @: F
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);' Z( [! @9 H( B+ O6 @1 w$ @- d
# o0 n& u% `" h! b- p% [$ c
server->upp_channel_a_recv = true;//
# Z1 n2 d4 v2 O server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
/ T$ |9 E7 E' p/ F! Q" y server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;2 i0 ]# i5 L) _2 W9 B
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;4 V( o" a4 M2 h4 b! u) B
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" W3 f, P- H( U6 }6 i: {) H- h7 ?
7 L# X. m% w( n: H. Q1 W/ T
upp_error_count = 0;* R. W+ |( s& T4 o3 n% Q) y
upp_dmai_int_cut = 0;
( H2 A: L3 f1 M( b3 J6 ?
. y# d- I5 I# E' J5 K' B' m // fill in data 0 L9 p& M# r, }) K
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* ]1 Q/ z, N4 K1 ^ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! T5 w7 Z+ _1 D }( i( ]: C1 F5 u8 K* p: v
}
, x9 |" K2 u1 m3 G @1 F. u else{
9 \6 F7 @7 I2 ]! @# P if (upp_dmai_int_cut > 0){
5 M, n9 ?6 o/ p; z8 B7 P8 R DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) D \5 H* u5 Z5 v) i Q' c/ _8 i Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);2 I2 a. W8 v# {% ?3 d s0 g
7 `, i; u0 ^. ?
! f0 G4 q( \2 V7 h% X; q //copy data to upp_recv_list_busy5 n6 ~: O' b# J9 G" R9 H9 _
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
" x8 q- L* {" W. ?' ^ e8 l! p* e* Z- T
//( R9 I) ^1 z6 ~" n+ t* `3 q4 C
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ f0 O( ^- _) y* e$ Q) c9 C8 w! ?5 ]$ l- U
//
+ n; O ?2 q# ? server->upp_channel_a_recv = false;//
/ ~4 z4 R( o; Y' ^" C$ \) L
+ [, F1 M1 ]5 U- Q0 p+ z, q server_msg_send(server, APP_CMD_LOG, "upp recv: success");0 w0 ~# l8 D5 {7 ?3 t* Z* w1 x
}" Q8 @8 w; h0 E( S1 B
}
- ~7 \! g3 g9 |0 P0 l' W8 d( V# B. d% G0 n6 I d7 p( n
# s4 d4 j3 S4 S( f$ Z1 `$ I
return true;
6 Y& r4 R( \, l0 \5 P& W}
# f X# X0 B: K1 v" D, F' Z9 Z8 g- Z, z0 v! h/ Z
static bool server_upp_data_send(Server *server); l, D4 W/ M' B3 C! N
{
3 _; D6 c6 P0 q* N* q" _# G if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ Q/ X# X! i2 Z3 ?; c, Y- N DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- A6 Z& X- q e3 Z& T* Z unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);0 }4 Y6 E. O5 E+ k
char tmp[128] ={0};' f! k2 E" P' a
4 r- O) J5 c: j; q3 t' z2 o; Q! W
server_msg_send(server, APP_CMD_LOG, "upp send: start");
) d! m+ H1 V; h( j$ D print_log(server, data, 64);1 G8 C' U0 ~( ]# z8 R' |, O
5 I) U+ p: \2 G ?
//0 J3 R# A: j2 ^* l& g# L0 V2 G
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! G9 ^/ t. J* i' u
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 G# U$ R0 u% l4 p3 y- D/ r
print_log(server, upp_buffer_b, 64);
- S. A* o/ M* h! u6 H
% \3 Z# M! K/ p) R server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
% R9 G5 D8 ]4 Z9 ^9 ?. W# N+ ^ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
2 S5 w* G/ S9 q* L6 c; E+ v" Q server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! | h+ [9 }/ I8 V" X* k6 i
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( s& X6 S! T0 J( k
) j# M1 P+ g8 t2 `1 E memset(tmp, 0, sizeof(tmp));
9 |- z6 _: J4 W$ {4 x sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * f6 C! u% m) A
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" m8 E. o- U5 G server_msg_send(server, APP_CMD_LOG, tmp);% V& n$ |* N3 X7 ]( P, X/ R4 }
) M* }& @$ Z& y: j) a/ h1 [ upp_error_count = 0;& f U, l/ X' E! O
upp_dmaq_int_cut = 0;
1 y9 O$ y7 j3 A0 K1 Y+ t/ O // fill in data
5 J7 _ i9 I( s uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 O; B* k7 }- I( S) ?# K& n
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* i/ A/ ]+ m3 e8 g
1 W2 i1 U* W6 \
// wait send success
" A- Z( e |& i) G while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
! S" `% h# d) }2 ?- M7 w+ i" W' _4 D/ _; c( m; @" `
// make data node in free list
3 P. o- E. X% O- M% b ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
% B7 h0 @) u5 ^7 W/ d. a( j8 B server_msg_send(server, APP_CMD_LOG, "upp send: success");% {+ [9 w5 U5 `; ~4 R0 [! ?$ Y
}
P& n/ F: J% A) V return true;0 Z) P2 _0 `* v$ @8 P) F8 b
}
" U2 u# C# ^' S7 M6 v$ o. m" T+ s6 @7 ^
' c9 J& n# B/ C- T3 }- h" y
/ j$ |5 ]) Y. U/ Z- T& z7 ]: Q
7 h( S) D8 ^. E( A: w5 ?
+ E1 C5 V, `! }9 {" ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|