|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # `( H) f( |! C, i/ @4 B; g7 j. W
7 L' m/ |) W) s9 S' j4 u3 A. G% w
问题描述:
7 M2 \& Q! x1 e在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' F& ^5 B. {: @8 u2 F7 E% V/ ^; q. U6 A7 D" _
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。0 g+ y, ^2 k+ H; K; N! @8 s
9 X" p: V! Y t5 \+ b
测试结果如下:1 k! I( A' l9 _9 u! \$ A
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
! h8 w; H# d6 j, X
+ a- t8 p4 u" e
+ W, b2 e9 I: ]+ V备注:$ u1 Y. N% q, g! F2 k& U' U4 r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
: i, n {: j6 l/ P2、相关代码如下:0 ^+ X# O" R; u. f: n; E, Y
//UPP DMA缓冲大小512字节
# i% \% w; ~. ^2 e) y v2 o: H#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! h+ X; r% [. O# U
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT# D) @2 e1 x. Y0 P
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)2 n" Q* O+ B- B. g7 o) d, L
' o W; } P: L+ \- T
: R6 k H2 H9 e+ ^2 Y5 c: q8 N1 E//upp接收、发送buffer, C2 L1 }- f. M
#pragma DATA_ALIGN(upp_buffer_a, 8)
" `4 @2 U0 x6 v p#pragma DATA_ALIGN(upp_buffer_b, 8)* n. x- H& q" P/ m. l( B& m0 t9 X
0 ]8 O5 L! K# {* ?% c7 r
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) x( t1 ~; g. y* A
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. @, v* _2 k4 o% O$ d- \6 x. l5 q
. H% @. s7 B1 ]+ V0 ]* t8 j0 D
$ B i4 G* j- w$ s, Sstatic bool server_upp_data_recv(Server *server)
& c# y, N Q+ e6 L! k/ u{- q( v$ b0 q7 P- |0 F2 z$ o0 R! Q
if(server->upp_channel_a_recv == false) {- s/ ^; P" [" x
server_msg_send(server, APP_CMD_LOG, "upp recv: start");6 [, Z3 W4 l# r
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
3 P5 A' E% k& n8 {* G server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 C* D2 Y/ q" B) D9 K( ~" o0 m0 k
3 X D7 E, s4 ]+ f
8 a, `) Q" ]1 |: G8 Z5 w memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 Y+ a) t2 x0 b0 T8 a2 {
: w: z) ^9 N/ m1 g% i* h! T server->upp_channel_a_recv = true;//
6 y: g- K6 R$ e% C, r. I server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);8 f% t: m% e) F) }* ]; {
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
8 R. a$ g! J- y9 m/ B7 [; A server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
1 I: Y* n5 K- z$ ^ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; E9 a$ O5 a3 I) m5 E0 K. d, g8 Y( v5 N4 R5 g( a0 J/ ~6 p% D
upp_error_count = 0;
/ h" Z; j) u- `# W upp_dmai_int_cut = 0;
9 I1 ~* t6 T5 V: H3 t7 @- E' W6 x6 t& Z& c s
// fill in data
5 S$ q5 ~; ]1 b! H/ y uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 g4 O9 D1 ^7 `& S- @0 N8 |: C) D server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
" Y+ m& |2 M, G- V$ Y }6 H/ e* F7 b1 }/ T2 X
}# X+ c* ]# K. n4 Y. B5 g
else{' u& d2 C) P# M) Q7 V) c" U
if (upp_dmai_int_cut > 0){
. C* u' o5 V$ h/ C6 p \! N, J: Q) ~2 s DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. A0 l' ~4 m/ _* y4 W5 B2 }
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);) K4 U( }6 ?7 q6 J3 u) _
: S4 T5 h* L- k- Q1 Z
) T/ t: E- S5 e2 r) V& z, E //copy data to upp_recv_list_busy
, D6 ?' g" G# i5 }$ P. J9 n9 @ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% ^9 R, c2 B+ |2 K
1 O1 I5 ^ K& L' _8 R! f //
. S. w, l; r' O' X- l. T/ { ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% c5 ?+ @, m8 N4 F2 R6 s2 y2 [& C" L% A! V1 r
//
$ `9 U8 H" J5 c' J. K0 T1 v) X3 n! } server->upp_channel_a_recv = false;//
0 g1 Q, j- B9 U, B$ j1 x9 ?0 z- X
/ \9 w' P7 u1 n; A4 ]$ |# P server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- o, \6 R- U- S( P5 ~# `+ V) } }
+ u; ?6 ]- s; w' {. K$ k, M+ H }3 {# T$ O3 _2 R1 c+ \
% z% C* J$ I$ L: F i- j8 e% G+ ]+ a/ A7 X' ?+ ?+ k
return true;
5 s: _3 a6 i# Q* N0 S6 _1 B2 g}* m7 J& t0 H6 q
. l, O0 L) f6 F" L* ^" @
static bool server_upp_data_send(Server *server)
5 J& t* d0 W8 n: W) z+ T3 e, A{
B' [' r, _% `. Z( F: Y H if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 O- G3 k, z3 |. Y4 M8 {8 p. O: X DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
r6 A# h" X. C$ M- J unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
8 t) g1 v8 ?$ V! Y4 Q9 m( m9 [ char tmp[128] ={0};# k5 B, Z" W( p0 G) ?
* P4 E7 k8 j+ {, J; T6 i ?
server_msg_send(server, APP_CMD_LOG, "upp send: start");
" s* G# v* y3 ] H1 v/ | print_log(server, data, 64);
$ O- f: ]# `0 H# Y$ e" n
" Z0 r, ]: L( U //$ c7 l' n& U/ K4 W: Q: `
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 c9 }1 ?+ ~; X/ y memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* _" k7 Z$ V+ O2 s1 g2 [3 q
print_log(server, upp_buffer_b, 64);
/ i6 s+ b- h0 q
( L' ?7 j; g6 i( F6 m+ q/ @ `& u server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
0 K. y0 ?" B7 r: u3 s" A9 i server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 8 ]% l& d2 n p, Q' F5 }
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;6 ^2 y! Z* B$ ]9 A3 X7 H3 c1 q3 I: v
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* s4 b# g, D7 \! {. B4 r
% H K2 K. F* y9 R8 r memset(tmp, 0, sizeof(tmp));
# T2 N1 r9 X- j L1 M sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", , ?, s# u( {3 y2 n' @* [6 y
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 U& O% ~2 \) S+ u, L9 k
server_msg_send(server, APP_CMD_LOG, tmp);
8 J& U$ ^7 Q, @& ]/ z! ?2 z) X) Y: l; b- ?
upp_error_count = 0;
R7 ^0 \% c1 ^7 n0 X! C k; b) M3 s upp_dmaq_int_cut = 0;
% O% G! N% n% a: @' a) y // fill in data
; l) n4 [5 b( P, k0 { uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ' L6 _5 c' @8 @- Y C" y
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
0 z# x3 B$ E2 O& A8 {# h0 y
7 q3 x* T4 c( f // wait send success
/ o' {( q+ H( u& x4 q! V1 ? while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& m- j$ h6 g/ ]8 z l
# s$ w/ o" z9 Y! a0 k3 i // make data node in free list
4 c4 R8 r: n5 S; F3 w" p ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 \9 [9 K* @# g! _8 F1 t& f# F
server_msg_send(server, APP_CMD_LOG, "upp send: success");/ C1 b& N' o" c' f, i; E' \* ]
}! V" r% n! i g m2 h! g: x8 r
return true;( ~; }2 i* L' W3 x1 n, X/ h
}
# A& g) I9 Z) i! h3 F; _3 n9 C+ i( j! [0 ~' }1 r4 e+ c
5 n* [- ~7 T! z( |
m$ C2 L: \- u% a- k X$ X" U! Z$ \4 \
1 P; P' x' Q6 m& A8 t |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|