|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , S/ N4 R) |1 n) |
& K' f, z0 m7 _. g. a3 u3 R) e问题描述:! M6 N1 \; G" _' Y8 u+ A+ B
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
+ n" m1 j5 R- U0 U4 B* c, R/ `2 o* S- d$ F1 m u- ~# U% c
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 }# y" W& j6 B- g+ q I/ u1 h* |% H; U" z, d
测试结果如下:
& u) ?7 D- {# \138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?; J; N' K! C7 i1 s5 u
- u/ Y$ t; H' F( E/ @+ p. X% e9 n1 E$ p( @1 ^8 D0 [/ j* M
备注:3 \* D2 ]7 n# T8 t
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
+ e0 l- p! O. M& o2、相关代码如下:7 N& n* J4 d3 a* ~
//UPP DMA缓冲大小512字节9 L6 U, s/ z$ _6 ^/ V7 Z; @" \
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 _+ b( v. h1 D; n$ s% r: J7 |#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# Z3 k Y- [# b/ }. b# n! w#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 d8 r9 w0 o6 t% u M( _7 K: E, ] |+ A& H. w. q ^* r$ j
6 h# a" |) q* H4 f- ]2 P5 [
//upp接收、发送buffer' }5 ^7 `- r7 N! t. E9 O m
#pragma DATA_ALIGN(upp_buffer_a, 8)5 H" c2 H. @2 H/ m
#pragma DATA_ALIGN(upp_buffer_b, 8)
9 I" R2 u8 b5 O- e% p; T% T# [9 t# W G
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];& G1 ~" W: } ]
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- T' s! |1 s0 T8 z8 T4 Y3 k
9 u) E. _* } R$ n( o# u2 d& @+ A0 @
5 Q: h9 Z* j- q6 m; r. m8 ^, x
static bool server_upp_data_recv(Server *server)
% K7 {; ?0 ?( f3 U7 G{+ \; l0 `' v9 A
if(server->upp_channel_a_recv == false) {
; \4 v; {, h M/ o7 t1 b server_msg_send(server, APP_CMD_LOG, "upp recv: start");; f/ P0 G: d+ |) g3 X' f/ E0 D
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {, z, O7 o& z) R( ]/ P
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");1 r" a* |0 ]& j8 G. ~- R+ n% B
! i( c8 ?6 }; a/ U* u
9 \5 u0 j7 u. n. V% g6 x& v6 a memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
3 u2 |& {, ~7 F5 b) _. z3 v$ Y4 d( W* m- o1 f
server->upp_channel_a_recv = true;//" c3 }& l" _+ A8 T& h2 T
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
9 t2 _$ b4 b; Q S9 Y l0 \ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
4 h! n. \3 U5 e6 h8 x( o server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
* S$ S; N X! o0 Y. d' v- s) p server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
1 f# j, w0 I f& G. z
8 T2 ~/ D6 F; L. p. T$ g( P, U upp_error_count = 0;
# b6 e9 Y* |# v" t, O" k upp_dmai_int_cut = 0;
' v* J) I) S* d' h0 J! G
v/ a+ _3 E$ }/ K Z1 I // fill in data & q/ T! y; d, y8 `' D
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
6 x# W( C$ |: U+ A" { [) w5 s server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");5 s% w, L' h( A; Y8 |
}* Q+ j: V) A% ?( b% E0 n2 T
}4 A, k7 c @9 |$ B( c$ f
else{
0 ^, r9 D! _( k$ {1 {3 k if (upp_dmai_int_cut > 0){' M# t; T% R8 y- W3 Y
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ {3 s4 l B, f5 q; u) `' v
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
* X- Z7 a: W; _; }/ [
0 _9 [4 G4 Y3 i; `$ y
/ y6 j9 k6 }! h" |- a //copy data to upp_recv_list_busy. ?% D0 _3 ~1 G1 C7 c
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 u2 H3 p) ~9 ] v% o; m, U# p2 x3 d F- w; U
//
- L; d: r- ^% v% h. N ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; B* S2 a. @% b* P
2 t# _" S$ U J0 y8 I/ X0 K
//
( X9 t. T) ~7 I2 |' ^ server->upp_channel_a_recv = false;//1 |# X0 C! b" u( f5 R
) @! P/ @$ [; E. O3 f server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 e4 M+ K2 H+ ~; e
}
0 p$ f) i/ Q$ R `0 W0 j }! R4 L+ ~, }& Y3 A- S3 S' C/ p6 G3 V7 H
9 Q: |8 K( _7 c. M8 M) W; @# T
& o6 R- ^' F" j' |& q2 m X return true;
; E( M8 \. Y* P4 n7 H" a}
) W6 c( ^5 G/ y) [3 |
, @7 [# C p) o2 vstatic bool server_upp_data_send(Server *server)$ G6 r" |# i: G6 M G2 q
{
9 h) }$ v! Q) V6 J if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* e/ _' a3 F% u! | DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- }' G4 o; D# b# B4 m/ z b, i unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 S( A) k$ V0 N9 B3 T4 s+ O7 |( L char tmp[128] ={0};" g- x/ M, H& {$ {- N* u
( m( h( i) _ L2 h" J
server_msg_send(server, APP_CMD_LOG, "upp send: start");8 N6 a2 z* Q2 h I
print_log(server, data, 64);! p3 p7 z& B& @3 z" C
0 |/ P- |+ Z/ i( f //! |% K+ d3 Z) D) ?
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
5 _# b- c5 x: d( U& B memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 ?! \$ T( i1 c6 @! E1 e4 I
print_log(server, upp_buffer_b, 64);
0 j1 _: {% c. e& P0 A3 Y( a: v, V- U
4 i; U8 z7 h. u( B+ \8 m+ X server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);7 E; ^% a9 E7 i$ D+ q
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
; L7 k+ W1 e+ o1 } server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;0 r) B; \1 ^: ]8 T2 K8 U' ^5 ?; W
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' S k) g' O2 X, a# S' K
! s3 R% e, [6 f" m( u
memset(tmp, 0, sizeof(tmp));: d$ W0 o7 \! |' I9 F. G
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 R. W; @: D# V( A6 s sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 }3 S7 v& [; D& m9 o, ^; t server_msg_send(server, APP_CMD_LOG, tmp);( e7 M0 V" h: k' s
. j2 T9 f; i, e* q0 i! K
upp_error_count = 0;
" x- g* e# [7 t" m; J9 b upp_dmaq_int_cut = 0;0 X, O/ V0 w# u4 @9 U
// fill in data
9 q) i1 _ i0 f& `; [. [! N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
2 {* ^7 E. b" ~ server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- E7 O( a2 ^+ v' V5 e
% C7 s' O# \& S9 l // wait send success% _ b# @- \/ _6 L5 p5 E! Z* h( i
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 T+ o( o5 u! ?) n( X! u9 H
- U) s; t" W, i a5 h1 S' q // make data node in free list 6 G4 }0 Y+ @8 [& t5 C
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 v, n' x# p% C* _ server_msg_send(server, APP_CMD_LOG, "upp send: success");
, I! \; y0 G: d+ W$ `" T }
; G* U @( a! v+ B; @1 _1 m# d return true;1 C. ^* L; ^& J! M2 `3 D. ~% [
}! A. o* N# R- y$ Q3 T
' u% [9 N; H8 C. Z6 a% y5 I! f0 |. Q5 S+ P
6 L2 c. i/ K4 q3 u4 ?3 V8 p& @8 X) V1 T: K& q: o: g
5 @/ r( I5 B0 P3 _/ I4 U5 ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|