|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 z2 o6 R5 {( [( P5 ~5 D
+ n7 B; z/ d y# Q# T
问题描述:2 F! r) ]) s) ]' D3 I4 N
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. Y; z( S& U \" Z" }
/ Y5 a' A, A& k图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
+ c3 d0 n9 |4 `1 U/ }0 h* }+ _/ l( W5 I0 Q3 h% Y" v7 |
测试结果如下:
2 z7 J; k& w" n* e138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
" [* c' T) W3 _( Y( Y2 M+ Q, x; w5 y- C' \ T- M2 @" u
3 i8 B7 a% o6 N1 c0 z
备注:! F7 X( @/ @' g# r: e% |& C0 P# ~
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" `! d4 u7 U9 G5 \4 {2、相关代码如下:/ N) D% A$ d7 h* j* y' Q
//UPP DMA缓冲大小512字节
$ r9 q' H3 X+ d* o9 G m( D. [#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: `4 {1 b Q" q, G#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT8 K$ u9 w: q. |+ {$ v' P
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( u+ T$ I) S' M# \8 t/ U4 r0 L( ~ j& j l
$ |2 e3 {# p/ G9 w$ D3 M# g4 X$ s//upp接收、发送buffer+ i& x! p8 T5 K* x& k
#pragma DATA_ALIGN(upp_buffer_a, 8) }0 T) d' F8 p3 y# e% o {
#pragma DATA_ALIGN(upp_buffer_b, 8), n4 ~9 K8 U5 r4 U
|# R* l; n( g# [0 w9 h) m! ^unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# s- e; r# q3 B% Q. s& \: k
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];( P: I/ w) V) T1 L. I
# i" l4 \* i- D! U% Q+ {, {( \! N) N
; Y0 |' u% g0 S# Tstatic bool server_upp_data_recv(Server *server) , s- R* l+ f7 }
{
# S) g, k2 s- H( n7 n/ a6 a if(server->upp_channel_a_recv == false) {
3 k/ @' y8 m5 [+ z5 ~1 b/ N1 _ server_msg_send(server, APP_CMD_LOG, "upp recv: start");6 |) \5 V" T3 o( i/ n X
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% I- t2 p5 w1 N3 D server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 t$ P0 K% i" t! a9 N
9 N I% E& ]8 H: T. I, F o+ \0 {: W
# o* b, K6 k5 P; _* [( k- U4 R7 w
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ v/ y9 A& K4 o9 I7 U' E1 U6 h8 v3 R; Y# F. c1 ?0 e
server->upp_channel_a_recv = true;//
% |( |( N% e- Z7 O4 `8 O server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
9 z3 J2 P! a& K6 H, X- p- z server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;6 C- _% P5 e0 u( W2 O6 U
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
& T4 [4 N/ G; ^' W$ n0 W6 n6 J server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ O; ?3 h7 J4 |4 @; d% t4 J
' W% O3 \* H+ c1 G: U, b upp_error_count = 0; k# h* k) i2 q: `/ I, x8 ^( t4 z
upp_dmai_int_cut = 0;
" E9 z1 Y+ D$ Q6 S% e! u
" H+ \5 m w$ O, R // fill in data
5 G, |* s9 O& _% E$ ?/ L$ x uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
: e1 u" U% S" S7 P! o, N server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
5 q' M# ]5 @5 l) P& |. N }
* I4 G: c8 F# D$ d4 G1 l! ?3 M }( U/ w7 i0 `# @" n
else{& B2 j( l, O3 D2 F" b5 b
if (upp_dmai_int_cut > 0){2 @$ `6 R% d& x6 E5 K
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. X3 ?$ U; f9 v6 e; }& e2 c
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);; x6 I. a" v: c, {0 a' f' n
9 P3 D5 ]" h, r& w/ \) {: r
( ^4 L. |$ s5 o; g! _ //copy data to upp_recv_list_busy
& G& D% @( z- m4 K memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);; R! k' Z, G/ Y+ T; S
! b/ N/ C2 s3 H% l, l
//
2 ~9 D3 O$ I( K# C% A! j' l ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
5 k# N, k! w$ Q7 b5 q. H' ? o* K) l1 X" m! k! d! P3 C
//
# U8 U. K4 B, S, d$ }: H server->upp_channel_a_recv = false;//
! G& W, T! ^ w5 \
/ Y: u3 ?8 M3 _# L server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 f. X5 J% { T. g$ k) R3 Y$ A' [/ x' f }
# t* q/ y. ~5 l6 N, D. G+ l }2 @8 {5 U( i' s Q
' C U- y C/ R5 }
5 D: j6 l0 M- D. P( j! @* Z return true;
5 p3 A, \. W1 c7 K2 R' a6 L( Y}& @/ I0 n k: v$ v: _
5 b3 q# L( Z( X& B1 Z! X4 u/ b# j2 fstatic bool server_upp_data_send(Server *server)( [5 i7 ?# M9 ?- z, u2 k( a0 p2 J
{) J7 `: g* \% _9 k# g6 d% l
if(ListMP_empty(server->upp_send_list_busy) == FALSE){* j; h% f9 @, c+ p( D
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ @. D' d' s ~0 z
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 {" G9 W6 V6 ]% Q" t0 ^: O r8 w char tmp[128] ={0};! E3 |0 W4 M# f2 g8 \
2 H& j$ T, w; ~# Z
server_msg_send(server, APP_CMD_LOG, "upp send: start");
1 s* e2 l; g1 x2 q/ D* D3 a print_log(server, data, 64);
% P7 [' M: q" |# n) q5 H& a' J, I. _8 a8 |7 j& x2 b! [ O
//% f9 B: y$ N O3 m% x$ Y
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
2 Z, {3 @- f) a) q8 ^, M7 x memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
3 v3 L, y8 o; ~6 d+ l print_log(server, upp_buffer_b, 64);* C: @) t* X4 N ~' W
+ A- y' @ w& {, r v server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);1 K5 \3 M0 ], j/ C s) k$ W
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
. o3 k, Q' I# M' f/ ~# V! a4 g server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
) O0 v. [5 ?1 O8 I4 ? server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 ~: _+ c8 K$ \$ O X# p
9 m, k( N9 J" H+ k1 I/ m memset(tmp, 0, sizeof(tmp));! k8 O! j/ f, I, x3 b" A
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 A/ t* N# j1 e7 C! Z
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ H5 x8 X& ^9 }! L) y" K7 T, i
server_msg_send(server, APP_CMD_LOG, tmp);4 A& O2 V T5 h) }: h
, ]7 _1 ~: a! }6 {: p( A, v# E9 t upp_error_count = 0;9 x, a2 ^. ]& c. d$ D5 k
upp_dmaq_int_cut = 0;- f4 a, U* e* M6 s+ |) Y( f6 n& d
// fill in data
$ |7 Q- w) l+ X1 C& ?( ~ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % r; w* R. l6 L& ]/ e
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ r: m; F5 ~* T
# A' K% s; V8 _4 [4 O // wait send success
7 W8 y( O$ u5 D while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " \6 ~$ z7 m+ a! x3 C+ C
) u" I$ q5 _: P // make data node in free list
7 `% X* D8 T5 e. j) h( w ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# Q2 L* A* G2 d6 i. o$ u" [ server_msg_send(server, APP_CMD_LOG, "upp send: success");
& O- G* u1 L6 }$ |/ d }
. Z, [. d I. W4 E' H' i [( r/ B return true;# l' }' p2 K" H/ }- R
}
3 n: f: c( ^% K N
$ n8 S6 ~ U) b* @
7 W% |4 E3 t' l& o: |6 c, @
4 D2 l/ z: p, s
2 T2 `/ W+ b4 a' ~% Q/ t, e% ?) U, h: [$ K; u
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|