|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 P9 _8 M& [3 z' Z+ r& R
! }' A p8 X0 ] r7 @- L& w
问题描述:* S+ f4 O" Z6 {( V
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& Z1 d( a- {1 L6 ]' H5 y3 n& h% F& Y
. N1 ^7 q) K' R! u% b图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! U5 n; `, {6 G: s* r) p1 ?' H) ^& N( J ~1 F& M" v; M
测试结果如下:* Y$ E- u; ]8 \; O7 x$ ?& l. o2 _
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. g8 x, p4 r7 j" H
* m# Y7 E) m$ @: X" Q1 B/ D$ V6 U, M5 Z. \6 b6 U2 x7 Z5 W+ ]3 S
备注:8 t8 Y- n$ |! U' @, S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
1 c1 ^- J; p3 c2、相关代码如下:
; i" r& a2 J+ h7 G) H; f& N8 S; @//UPP DMA缓冲大小512字节
9 k" W2 t+ N7 I#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍8 E7 {, Q& q1 |) K4 x
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 |( d6 n3 L1 p# x6 ^; |#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% B, s0 e0 ^! }; P- u2 e
$ n4 o( c0 i" _* a$ Z! i. X# D
4 a5 a' O+ _" f" T# `//upp接收、发送buffer, m4 |; z/ M" g5 Q( _! d
#pragma DATA_ALIGN(upp_buffer_a, 8)5 V4 ]$ Z5 N; u- S8 B+ L
#pragma DATA_ALIGN(upp_buffer_b, 8)
) v/ g& ?3 l: n6 C
; \( U) A: R' r+ R5 k# P0 \unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 s/ b9 P$ P7 F: x
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
' B' B2 Y( z( W
% f P7 _% c- q" X" `: ?2 b1 x) \! k' t7 D' v
static bool server_upp_data_recv(Server *server) , x! Z% w; o+ ]. H
{
6 s- J% f, y7 v0 M9 d" A) ? if(server->upp_channel_a_recv == false) {4 w P6 K [4 ^" _5 o
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' J1 |0 @8 s3 y" x if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 o X( r6 p; t server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ j0 r3 g& X! o) m
* m& `* o- I' A) j, X+ c6 L' u
! O; _ q5 \9 U: `1 d& { memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);5 ~- ?* ?- o4 W. r3 r) s& }
; s( r( j& r+ A1 |; G server->upp_channel_a_recv = true;//
: P# M9 E! x& x6 Y* }. F2 ?- f! x server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);. C7 n9 n) p+ Z9 I5 r3 Y: i
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;8 Q0 u+ k$ w( O
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
- b9 S/ @4 M4 n2 i5 t0 x server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 f1 e/ h2 z: L
4 m# M/ X/ C9 e$ y upp_error_count = 0;) Z2 X: B' y7 e2 B- g& f7 Q
upp_dmai_int_cut = 0;
: H, n! t9 H5 L& C F- b1 a! i2 H# }. ?& r& y
// fill in data " f0 d/ e/ e( ?. R& E1 d" y7 N7 |1 ~( w
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
+ q! L# k/ h% M0 l7 F5 M) l server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, F6 @9 k0 H, L' ]+ Z
}8 q! b1 i9 ?! e
}
8 i8 F" t* \9 `0 M6 s7 o* @ else{
5 E8 o+ E0 f$ T. V& k+ u7 V if (upp_dmai_int_cut > 0){
2 g) c+ [! e, C0 X4 f, Q) c DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
( v# [ W& ?3 Y Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);0 c* S6 H( R! ? q: l9 {. Y/ L0 X
1 R( t" O# }2 R( f2 k- c3 ^1 Z/ J( p
//copy data to upp_recv_list_busy
, H, _) n7 D* P8 r+ x memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);3 f; U9 ~! x# ? P. M5 @/ L! M
0 a3 J$ |$ W6 E' f
//
* H$ F$ |0 c% |/ i+ q5 a ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node); k4 A! K2 e8 a0 P$ ~* y9 G0 L8 z
5 A! u' @2 L% j7 T: h! N //: ]: |/ D1 [& Q! r, X
server->upp_channel_a_recv = false;//% D" L1 r ~$ U- r8 [( N: G$ I
( S: b3 c1 n7 Z- W server_msg_send(server, APP_CMD_LOG, "upp recv: success");
" o. k" V! \; i W' Q! ?+ x }* O- j" z% e0 {4 H; P
}- |5 Y. B9 w' n: s; w' X1 d
. `; C6 n2 _# c6 P% z) f1 k% p
! }4 E! C% ]: ]5 l& n7 J) j return true;
) H7 \: V4 ]6 Y2 ]4 K. _3 s}
6 z8 O, l$ M" m" I6 S# J4 v2 u- n
static bool server_upp_data_send(Server *server)" L- `8 G; M7 ]8 H% [! k
{
8 k- G9 n& _) Y6 x/ F' L3 q; X if(ListMP_empty(server->upp_send_list_busy) == FALSE){
1 [, p2 ^1 |) ~! D- T DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
+ G% n0 K# \7 Q unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);; f$ r T- S+ n& @; P ]8 e) j
char tmp[128] ={0};
. }( y5 p; ?5 D" o) l: E8 U2 J9 b2 I
* F" z. H7 a; } server_msg_send(server, APP_CMD_LOG, "upp send: start");$ ]/ |! s+ M/ S+ z
print_log(server, data, 64);
( o2 r( ~+ R+ @% @. @) W2 [/ }
7 o3 J/ g( t3 t' m9 |/ |6 z //4 W3 R5 n( A7 t) r' d8 q6 H
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- _4 r8 n5 x! W! M memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. a8 R* s( ^3 Y* e
print_log(server, upp_buffer_b, 64);
+ B* ]7 k# ?6 n5 J5 S+ Y9 E- [9 F1 F: \, F- W# X6 w) q p
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);( _9 E' I) r" ?9 g3 |. B2 s- b; B
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
# I8 V# y- \3 c# F3 C# Q x u+ ~ server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;6 p% a0 r! T/ f! B7 g$ i$ h+ C* Z
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
. c& S! W r# J0 R5 U z" w2 X# D6 z/ p* H1 c5 {
memset(tmp, 0, sizeof(tmp));$ @5 }& u6 |5 n+ q3 T9 m' S
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
K% u+ [* }! O5 J5 T( W sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);1 O5 s( D+ J T$ C$ i
server_msg_send(server, APP_CMD_LOG, tmp);
1 s* ]- w5 V4 v1 _) Z y- |
. v, c1 K. m2 G' Y upp_error_count = 0;4 g+ d B8 c6 ~8 y/ Q" W7 O
upp_dmaq_int_cut = 0;! [. V5 _' Q, f( v+ @
// fill in data ! g7 r; ~: u) N" x L3 l
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 1 ]9 T. k4 \$ d3 W: I
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");( b U- X$ l+ C2 E5 m4 X
! n) P9 c, t; {2 _' {7 `, O
// wait send success
9 \8 S5 c1 N; O while (upp_dmaq_int_cut < 1 && upp_error_count == 0); + F p+ P7 I2 v8 }; V
: x# o' f# Q/ g8 J: M) `; {
// make data node in free list : q) y2 {. c* L9 |
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
3 P( r9 P" K0 E; h E% ~% I server_msg_send(server, APP_CMD_LOG, "upp send: success");
" U4 Q- G# }& ^ w4 l( I }
k! p5 T: ?* W3 L/ k5 m return true;# j2 N* Z& H% B0 W
}
* e* `6 L/ ]# g& z u: K
& q' }- O6 ~% o7 Q4 {0 Z; Q
! x! \% o! |: x
4 t: C. T `5 V+ N( e, f: ] c2 x5 w
; c1 _- o1 b& `. z
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|