|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 % T0 }2 }; @5 k7 {7 r/ w5 G' S
0 v2 D% u; k- K% A4 Q2 D8 I' x
问题描述:9 K C6 g6 ]- _" o6 Z( q
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 O% N8 J$ C3 k4 z9 a
/ {2 k5 K+ K3 E) z) ]
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! g( R: q+ H( ?- O: p( ~% `
" c& u. i+ ^4 x! r1 [: ]- d3 l% ?9 X1 x测试结果如下:
7 S$ R- j) D# V7 z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' e- X; b0 q' Z: l s+ I* a: B, O' E/ b
# Y& E. o5 C1 i: F3 H
9 }- E* z# c1 i% R- C8 t1 D8 o7 J u
备注:
) Y2 V' v3 Q, x6 _1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. }4 g% Y" l4 v- X6 b# |! I$ ?0 K
2、相关代码如下:
. o. R0 Z7 I( t7 H, E6 k4 f; E( _) j//UPP DMA缓冲大小512字节
6 a N- m- t( B6 C; m#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
9 P# b+ ]7 }( _$ d#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, k2 F+ q# z) L6 W( b2 k#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' d2 q4 U! T0 M! K. \+ E6 U" `' q
) b9 `" k: e' x
; ] W/ q% e" \2 a& I: y9 l; V9 c& c//upp接收、发送buffer4 ~1 Z, g7 K% O- S1 C
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 N% Y ^" ^$ e3 P% N#pragma DATA_ALIGN(upp_buffer_b, 8)
( y% ^- ]# F- N# a( r4 z
. Y$ i2 f$ L) P- U, |5 ^unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
7 @% v5 T0 O! {# V' `- l9 Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
! ^ [1 p" X4 e# C/ L+ g6 s& `0 B! ~
* \8 q: K! j' B/ l7 \8 {; R Z! q1 a: |1 k" c
static bool server_upp_data_recv(Server *server) : I0 v6 J$ J e" _4 N$ v0 j4 \
{/ r0 j* O# c$ M
if(server->upp_channel_a_recv == false) {
% H* X: ?# X0 d$ ` server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 Q' h1 K; p/ n+ E3 R6 S) n- W7 P if(ListMP_empty(server->upp_recv_list_free) == FALSE) {8 k! D3 @0 U+ w( H; x' t6 G
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
: M# X! O. {$ I5 e8 c' n
$ u1 s: d7 u u$ _' i K+ D' L( Z
* u0 ?/ ^1 J( N+ q% _5 j" T memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); p% ^6 s& `7 N. `
* S, W4 _5 y0 u m" H server->upp_channel_a_recv = true;//
# Q5 b5 O" [6 b server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
& ?$ N8 b; K P t4 ?% W7 d' A' R server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
1 p+ O4 N! Y( d server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
! f6 V v6 E2 b! Y% |* a0 L2 R& E server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//* Z$ Y( u$ {5 p& k; Y, u2 Z
1 A w7 N5 B+ b; ^! |9 D
upp_error_count = 0;; a* C# y5 I) S9 s
upp_dmai_int_cut = 0;) R- a$ Q M( E) l" @1 h( Y
( `- u& K4 V( C7 }( x* _ // fill in data
6 U% Y/ ] d' b uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, l6 f8 ?2 Y* G! E server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# u- W P; F4 k( H; t8 N7 o6 m }
" D9 y: ]6 f' [: k. I }
* k8 \& ]/ z9 x U( z* o' L else{
% o- M. R! ~" N if (upp_dmai_int_cut > 0){- G1 X% [5 Q& ~7 w
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);; g% W: H# \5 v& ?$ G
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
; F9 \! d* v5 m [; c# \% s2 \- }/ a3 H+ i. f; U
4 m; h( f# z# T+ p4 T6 o: y
//copy data to upp_recv_list_busy
( ~, t$ F) l% _) I; M memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( n- f9 S0 V. F/ t0 D e4 y
+ \( x9 a' P: m! Z //
R) e( a. E B- f- n8 y ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
8 s+ M$ ^8 d3 F7 p |4 D8 a9 [5 h
5 k! J. [% R* r //
* F& y6 a! s$ \2 s4 A: m: H/ ^ server->upp_channel_a_recv = false;//; a1 K' g$ k& _ v
, S: u4 [$ a) W7 D' K9 S4 o9 {
server_msg_send(server, APP_CMD_LOG, "upp recv: success");, V+ o& b& i+ ` v h9 L# N( K
}
9 |; l: `8 V/ q" C7 z. z6 Q0 Z }# j$ `$ [% z3 z3 z9 V. R" m$ u4 k
- q9 d" P5 M, L0 }! g3 _+ g, }0 C. ]+ ?% C3 M
return true;
" Y2 Z" H! n8 F+ c/ h% r}& G, R2 G4 Q& h' ?
1 Y: M: M- k; l# u9 [0 _
static bool server_upp_data_send(Server *server)
% w; e0 e3 h. _{$ y; R% Y6 v9 S% r1 W
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% V9 Q4 w* l& e# V DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);- h$ ~* c4 R6 j8 M
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) y' Y+ @- |+ W$ M8 d/ g/ y: ~
char tmp[128] ={0};
- c, g, W* |% J: k) _% L
3 i. Z7 v/ @0 n" y3 ?2 |7 p! R server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 T1 v: g# q: B& r7 C a0 {8 S print_log(server, data, 64);
* L9 V( Z1 d9 w3 N4 @7 ~7 |$ T7 m- c% m5 P, Q7 u
//$ M7 @" c' ^: X, Z+ I5 ?
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; ?7 d2 a: v7 |6 s memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
: E; y1 m5 {! t8 c4 K print_log(server, upp_buffer_b, 64);$ o: i: R' _! ~$ O& p' ~) z
9 v5 E' I0 R' v, q$ ^ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);* @+ _# L# L. y4 l6 o, _2 }) |
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; % v' ^, F- x; g9 Q6 K7 j1 V
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;) J! B* F P. b$ I( a3 A8 V* b
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 y& x, o8 [$ O$ V& X/ l. }5 |$ ^- ?; p6 U l
memset(tmp, 0, sizeof(tmp));/ W, O- d/ {0 g5 T; P* |6 z9 ?# @
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", / F: } u i; _$ y. j" a
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);% M8 Y7 D/ b# Z/ p0 g' K
server_msg_send(server, APP_CMD_LOG, tmp);! B- e+ j( ]+ t' H
1 |4 w( z$ ?' I9 k! f: V upp_error_count = 0;+ D$ x% ~1 [9 K4 R
upp_dmaq_int_cut = 0;
) } Q0 G- v0 ^# ~' Z6 A // fill in data
# {( E- T8 Z9 ~5 D uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ X" b7 B$ G$ p- g4 @ server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 B. c, l: f: U3 [
) o$ o# e) P( g9 F; j
// wait send success
, N. j$ I9 B6 u. M7 S while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * c) k: V3 x! U/ Z
9 [9 _# o% a' u
// make data node in free list
, u2 \6 t* f6 C, S/ L ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 z+ |3 o' t: H; V% b. f
server_msg_send(server, APP_CMD_LOG, "upp send: success");
+ c7 a# K. I9 { T2 R }
0 N/ ?9 c. n$ Z1 r9 H G return true;9 @5 K) ~& G. J0 [2 F
}
8 r+ C9 Y! _; r0 k* T \) K1 [! m
' t' G2 N' w) G% H4 x A& j+ [8 B$ c9 o
' X' A( @. {$ M( G1 f& u2 @8 U9 D5 K
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|