|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " L% ]& l8 M/ [- w1 R I# n) h
, a: X& z; O7 @7 [问题描述:2 x* X- L' K4 J& H
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
! n: o" L. V" Z' a- f/ }, c" o
# V5 a* m- O! @0 ^. T. B7 P; _图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
' w+ p3 L8 y1 A/ d; a- `+ q3 _! T' S$ |
测试结果如下:9 w7 Y( Q) x0 D1 }
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# V8 |* u& Z: f2 H1 x$ J2 e6 I* |+ M
$ R; D9 e5 i0 h
: O8 c, l: ~8 b& x' c备注:$ Q$ Y& {% A7 O3 Y8 @
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) z( e2 u3 {8 G `* I @! T2、相关代码如下:# _" f5 |) I+ c! H4 }/ K$ o8 K
//UPP DMA缓冲大小512字节3 k2 H% r, e# _$ t _3 p+ a5 ^
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
# J7 i- A# w/ |- h0 l#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 ]/ D* S3 N1 A, Z/ Z
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" H& H6 W5 M, [- G, {6 O
$ }2 h1 S; |! G1 ^8 ^5 @6 d# T% O$ i7 {4 u
//upp接收、发送buffer
# t6 w A3 S, E3 {6 Q9 G#pragma DATA_ALIGN(upp_buffer_a, 8)# {% Z! f& c4 F7 t
#pragma DATA_ALIGN(upp_buffer_b, 8)
6 m$ f7 M4 B: G- C. ]2 ~+ K' _: K8 y+ V
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 p! g$ w, O6 H; J- junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ i9 ?% ?! v& m' z9 b2 s4 ~( @! i$ V& h |
! r, L1 j6 x" ]0 F8 X0 Bstatic bool server_upp_data_recv(Server *server) r! K) s) z. ^3 R6 `( k5 v0 ?
{" X% w$ p8 C1 R8 V, z& ]% Z
if(server->upp_channel_a_recv == false) {0 u v x, {+ B {
server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 A2 t: I) [1 h/ A& F# @3 |
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 l2 q: D) s$ Z- I+ J! r D
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 D% B( x$ f) ?" ~% d8 T* Z0 c, V$ v9 o- t! e
b' t6 h3 b( r t1 z memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 x8 W2 K/ p0 @3 ^" y& l* _! y! p- R- u& Z. I6 k
server->upp_channel_a_recv = true;//$ _3 r2 N8 H# H, x, B
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
/ ` N. Z' o( Q' J0 v" l: ^' U server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;- ?$ L( l: a' P
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
% v; F) {7 x! W7 Z. M0 \- ` server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ ]$ Y' G5 m; F% Y3 A1 I& G. D- `
; Z5 p e/ A: ]; q$ t) I upp_error_count = 0;- b, Q6 S3 Y# y* g3 z
upp_dmai_int_cut = 0;
0 H& _5 m; F. F6 g5 C) _7 h3 `, _) E0 Q# U& _7 }( z4 L; ]
// fill in data
' X: N7 X8 _& |% I# p uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' Y0 l: ]3 t2 ]& m% i server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; o; [& `) u! j8 A1 E* Y }2 t2 g. i% g; u ?: n N
}/ ~+ a7 L3 a. k7 X( y
else{. g c' P5 y' }$ \, D
if (upp_dmai_int_cut > 0){! z: r7 [2 M! I6 r3 N7 }
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
' C. K0 c; W$ w2 c7 n7 [3 S8 _ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
' ~# c4 t* X$ [6 ^/ y0 f) `7 I8 Y0 U6 w; a$ c
6 F' a/ O y+ C0 H$ \$ M/ h! [
//copy data to upp_recv_list_busy/ u9 }+ v: s0 ^& v3 r# g0 W
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" `& q9 I1 P0 O' t5 O
1 [. c1 m* N) M$ _5 [4 g
//- u8 q2 H' [2 A9 u1 k, r1 i
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ C- g o$ y; E' b$ ?) Q1 P- |
( z' h& z' ?8 v5 n/ `3 A/ g8 W //
0 A, s4 |7 U, @* J9 K3 {1 H server->upp_channel_a_recv = false;//
* P5 r9 Q" k8 M* H4 U' ^: _7 }8 g/ I* u& y1 f) o( d7 v
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, U, ~ ~1 Z7 x+ k) L f }+ {1 F B6 [8 \: V5 V" q
}( H4 k U2 h' e- m
. M5 T8 w) N- {; V$ ^7 `
# {; d6 J1 c5 u$ o6 Z# M
return true;
$ @: K$ c4 d4 ]7 @2 @, C: S* r}
6 O/ z# e- C% ]8 |0 g2 A0 Z7 H' a* n
static bool server_upp_data_send(Server *server)" O' H$ _+ w4 B3 T
{
4 A3 I6 K, t4 ^9 ~' O1 Q! b- G) G if(ListMP_empty(server->upp_send_list_busy) == FALSE){) K6 d( x8 H, B9 d
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 F h2 N b1 l! a
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ b8 X0 z: L2 z) n char tmp[128] ={0};
: J5 x6 P$ s+ h6 S+ c
( M g! @( B3 g& M6 X k- B server_msg_send(server, APP_CMD_LOG, "upp send: start");: A' v5 v' y. `+ Z4 G2 O8 R
print_log(server, data, 64);, k7 n @4 F" y6 }5 T7 C* `1 Z
9 ^# a2 M- N* Y //
( B4 d: ]4 m3 h1 J% { memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);4 i1 ?& R1 M/ ? F9 O7 i
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
]/ H6 K8 G* a; M3 P; u; p! w print_log(server, upp_buffer_b, 64);0 P# j( L7 \! n% e6 e
% m. h7 l' q7 R% z) ?1 ~
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);7 N; q6 C9 e, {( ]* v
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 4 c! ~' E. O! W& \+ h: J0 @ _
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;+ z! O0 Z3 e7 S& O
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* R, {% t9 ]5 f# t
k. G( w: U, G3 u5 v- }
memset(tmp, 0, sizeof(tmp));$ I/ q6 K3 D5 L3 s5 S
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 3 q) z n5 c; C8 U6 Q {' s( {- |
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 N& a% M o8 O# i
server_msg_send(server, APP_CMD_LOG, tmp);5 C' U! s' Y5 _ d7 l5 p
- S" J% Q+ H" Z x4 n# B
upp_error_count = 0;
+ \) r$ g; f9 P# }8 h; {5 n. Z upp_dmaq_int_cut = 0;
z6 c- D5 G' f$ z" k // fill in data ]! r1 o0 G: [8 c
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . x7 p0 ?. ` Y: I8 e% p* L
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 y" M/ P0 f. O( J1 r& D
- m0 ^2 a& d$ d$ f: W // wait send success+ C8 n4 A1 Y3 w, `4 Q& v
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. G8 w+ {7 R! c/ H3 u1 @2 Z9 Z4 i; w, U0 `4 Z4 v2 V7 w, Q
// make data node in free list
6 L+ x' N' _! G! J) l0 q4 s6 P. w ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
2 S3 T- u6 |7 k8 o server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 n4 T4 k) q, b+ V7 Z, l' i }. e- p+ J; Z4 h, X: O/ _
return true;4 X, d; m. H2 R- P+ P2 ?
}6 g% [6 I# _, L
/ I+ {- t$ [4 ]; S! d; ^+ r. I
8 P9 r3 ~: A' B8 y
4 P( G$ }" S3 }/ F: E" ]2 B1 q
1 ^( w3 p7 r- G4 ~6 }% R/ J n! M3 B8 E7 u/ o3 F- A
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|