|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 {3 L7 P# [) V& w( T
' O" i- x- N! S3 ^3 \$ V问题描述:; f8 `" E) A! B% |' _
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:, \" A: P3 c) f5 }7 L% @. B" b8 N
5 \1 B1 z: W9 d) n. c8 Z; [9 Q# E3 a: p
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。0 {( C3 o% ^, V1 M O4 H. W
2 H3 w8 k, l. J" r! v8 k% R测试结果如下:
2 n6 T$ P2 f/ R2 D; O138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的? l1 R, o; H, V: l& U- t+ d, b
3 \; Z3 F) q; ^
! W$ Y( S* B) ~6 ]( _备注:
: T& V. Q, _+ @. O; g1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! S' x+ `' l- t5 I3 ~5 ~9 }2、相关代码如下:* |* ?/ E9 E4 v( o. P5 ?+ F5 c- Q
//UPP DMA缓冲大小512字节$ E7 X' N: l* }" d6 X
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
3 K* A& R' D. X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, O' B5 K8 Q1 t% Z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); g- p6 w* v* D5 u- Q- z
+ \' \, n0 K& C2 R! f
5 k6 Z5 S2 L6 I4 o' n' d+ n, V//upp接收、发送buffer
- c2 U6 b' z( K/ h F. Y#pragma DATA_ALIGN(upp_buffer_a, 8)+ x6 {. F( n, R& P% |
#pragma DATA_ALIGN(upp_buffer_b, 8)* m- F2 e+ G; ?
8 a4 s- I+ c' e' X9 ]9 @$ T
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];8 e- R/ `, H' R4 ], P
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; E! Y, G1 a5 [' s7 T" j/ a
& Z& R# \' M8 ?( v) `3 V' F& F, l6 H% Y5 S5 m7 g
static bool server_upp_data_recv(Server *server) 8 d7 P; K3 E! k2 t& V! C3 z3 B
{
1 H+ f Y) Z- c# g* Y' g+ C if(server->upp_channel_a_recv == false) {
7 j5 X& ]+ T3 w# b server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, J1 ~; |) L+ U: R$ V if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 a, g3 l# H; ?2 ?* f
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 ~* t1 Y+ ?: N. A; V5 [( a
/ o2 c3 E9 x# f4 O, ?9 L5 s% w6 W
L( a# z5 Q) o memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 c0 {( M H% K6 `+ ]) v
$ L) E# d( R; i
server->upp_channel_a_recv = true;//1 D1 }% i5 h% _3 w$ t B$ h6 D5 p, ^3 ?
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
X; E4 T7 T m, a; ~ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;% k- W1 z; `: x4 L2 O
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
$ ~5 X; }$ @6 K+ b: ~' ~6 u) @ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 C7 I; R3 N* }. s- ]5 t6 T. S
q7 q! F. B Z
upp_error_count = 0;
. K/ b* I' g% m8 f4 _/ d0 Z upp_dmai_int_cut = 0;, ?8 B' o5 B) S
' B# Z+ F9 ]% g o5 b) x // fill in data
) S% z5 H4 @+ V# T- C uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);8 |# S4 E" b& r: I3 R
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: t5 y" I# p& C5 L! B5 B }1 q8 K0 I4 F% J& R( O1 U( f8 z
}. m# a3 j7 d4 t+ p) Y* C f
else{( Z# _( Q& v8 Y; y$ w8 j
if (upp_dmai_int_cut > 0){
, x; x& v4 D* X1 U DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ ?5 S7 @( S, s, R1 H Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);2 b; E4 ~! I9 D# S& C: V @
5 D1 T. G7 w9 o; ^& l2 T/ Q( v4 u
: Y9 Z1 }. m3 v6 j9 t6 \6 G9 B0 g- H //copy data to upp_recv_list_busy
9 H2 Z- c. d: C6 @8 H9 S$ n' _! o memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* d b+ l4 w. K$ }" a/ R7 T l; f( R
6 O4 P, A/ W1 l% Z
//' B: s1 ?" Z( z9 y9 p2 h: U
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& W1 p. l+ K; {& Z- \ I% N6 Z
( E( s! q m4 y; d! M //+ k2 T" r: W2 q) v
server->upp_channel_a_recv = false;//( d- ?1 U% [$ O
3 h" [. w2 Y1 w i
server_msg_send(server, APP_CMD_LOG, "upp recv: success");# m; A# v# c; g, E& o
}
1 R' I, V5 A& Q9 t* C; |( d }) P0 X- c( l# A" Z
; e& P! W0 y5 l U1 `3 Z
P" k; V7 |* k$ O
return true;
% Q. m' w+ @+ A- Z( d( D}
# _# s6 c1 h+ Y: i) J7 u) \8 U, v9 B" [! a
static bool server_upp_data_send(Server *server)7 g% E @) Q; f
{
2 q8 S* y o3 J) u5 X- b( ~+ z if(ListMP_empty(server->upp_send_list_busy) == FALSE){' h3 ]4 D6 M g, {/ R
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* b& u, @9 X/ L" t$ O- N* a unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) t+ d4 D1 n! P: [
char tmp[128] ={0};4 c$ u( {7 H9 p' u" O
9 M* W& p. F: h. I U. h
server_msg_send(server, APP_CMD_LOG, "upp send: start");& }- W/ K8 L1 N' J k9 P$ Y6 X
print_log(server, data, 64);
, J* w% |5 b7 g3 x$ r- h1 E) C
' U: h, S( n+ s _* G //& e3 _* u% B, m4 E6 y
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ q V- X/ t8 J9 V8 H
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
; n0 T9 O9 L/ g2 x print_log(server, upp_buffer_b, 64);
3 \: a! t+ K: f+ H3 S/ W& q+ |2 `( \% x5 Y; \/ S. S+ |
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);8 ]/ @) R& z; ]
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 7 b; b9 }% v. o# u
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
+ R7 W" n; n7 s7 C( p: k/ Y server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 L, z% R9 p2 W+ y) ]1 D. v5 X( R) H% N/ ]9 G
memset(tmp, 0, sizeof(tmp));- H2 I5 f( c& t0 X' c/ `
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' D2 R( S" D ~2 S& Y5 `) r1 e sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ n9 `/ G4 u2 N server_msg_send(server, APP_CMD_LOG, tmp);
+ L1 A, j, T# G' K7 l" k6 L
7 Q8 n6 @* Q# I: J0 @) ^$ C7 M upp_error_count = 0;
% I$ \- c6 K& i, _/ u upp_dmaq_int_cut = 0;
7 A7 s6 F- P z4 q/ k& E: Z // fill in data
- V8 ^; t0 v1 c. ?& [+ P4 m uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); - e# d7 A- m9 q0 }% Q
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' S+ \1 p% j' P7 ~: {! f+ `
1 ~6 X- t6 M% B$ S% { // wait send success: B4 c! Z T& n8 K' \ e( I6 a6 t$ F
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 M: I' M+ ~- A6 W* ~ d5 L
+ @; |. `/ X9 g2 H6 e7 G
// make data node in free list / ?$ v0 J P0 J7 g" g
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);8 H4 }; t& G% d0 u" G
server_msg_send(server, APP_CMD_LOG, "upp send: success");4 y; i6 f/ N g8 }& K1 g8 I: ?3 |/ u
}3 W; T1 d2 w* ]
return true;' C! a& l- p& _( C) H
}
' M; |& R7 R. a' k0 X1 W
! X; `% s3 Q6 B' ?" u9 e/ J+ r- K/ T5 O8 v4 u
; f" O$ p5 q1 F5 q' @- k% k7 e
' D* w f4 @$ X6 G4 Y
$ E) y% {; d: E) m- \
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|