|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
+ O" H1 i' ]* w2 X5 N P& `& Q2 q- ~% u
问题描述:! ?' r8 V; m+ E3 Y
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ M/ K1 C0 o3 ^8 j# C8 s/ A
7 ~' {- v. H! E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: L- ^. H$ i( o' P+ n R! s
3 ]7 y& Y5 u) W5 R) m% G; D测试结果如下:
' a% `$ K. M/ a: M" O9 b2 T138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% l7 v7 w$ E1 ^5 B4 Y
% p& N! h# q8 q; G e
0 P7 @+ }* P: K' w1 Z3 f- Z
备注:' g' ?7 g+ r7 R' ^, | u
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 V( N- K: p V, Z2 e
2、相关代码如下:
6 o8 K/ V0 t" l//UPP DMA缓冲大小512字节) C0 m1 h. h) W8 _ U
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; |: Y; J. b, t2 n* k V5 z! q' R#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" E0 o9 T1 E' k3 Q2 i3 D1 [& x& D& N
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! N" y. t% Z& o4 n+ P
, s2 s$ P! m3 l" W# Y$ U* t8 L4 ]$ `& M( n: v( y, k. E* n: H( \. i2 J
//upp接收、发送buffer) i1 w/ @5 N W! O# D1 \ b
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 J. v; ~& C: f! n# ]# S- ^2 d9 b#pragma DATA_ALIGN(upp_buffer_b, 8)
& K# s; o7 F, D0 b, M) X
, z" X* C8 e* J$ i: @unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 j- ` @6 a$ U+ S6 N) d! I3 V
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 o/ J& O' v! l `3 S7 [' g
, F, D" O+ h( x4 B0 [
6 u d1 l A' B0 Q1 sstatic bool server_upp_data_recv(Server *server) , z( ]+ ?$ a* q- z) U
{- `! G& e2 _* R/ a3 A d
if(server->upp_channel_a_recv == false) {: x1 J( v n/ K( i' C
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( B1 }( x& G1 h' P if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& V# L% X( ?/ A# | server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# [5 K) P) n; i0 b3 I" ]8 Y: v$ P. d2 v
]* Z2 D% l2 ? h
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);; W) ^& s6 R8 j
- W. X: ~' B0 E3 Q server->upp_channel_a_recv = true;//& y- L; b/ |0 j4 @, c8 R- ]/ Q
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
6 K9 @/ |3 P3 B1 @9 N4 H; g9 o: @ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
4 \9 G" ^8 ]0 s& @ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;: W( K4 W8 t# q0 y2 z. R& Y
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- s- L. P$ A) }7 C' ?( B J
4 @, U w& X0 S9 ? upp_error_count = 0;
$ H" p7 k2 A8 x; }8 e3 m' [ upp_dmai_int_cut = 0;1 _* Y0 ^5 E$ d4 G# ~9 e+ U/ y
$ N: \$ m; ^5 P2 c9 F9 Y
// fill in data 6 n' j" [" r8 d, e3 ~1 `
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
$ T( V h! d- [9 Q4 l! _4 \* x server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; r. e" ~; H. s' K$ F }
^; R R' g' e4 f( { }! ?) P2 B6 A" x2 I1 x5 M3 T" x
else{
9 a1 q; P5 o% m% O, T if (upp_dmai_int_cut > 0){1 {9 H8 |6 C! ?7 V- h9 s
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
& @6 V2 B; y( x2 U H Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% E1 U6 y% m' |7 Q' S
4 W) x% i: V7 K3 l! ?" T6 ^! X5 w' F A# v# g& n
//copy data to upp_recv_list_busy( `( b% O9 |# l' `0 k. s* Y$ T
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, ^1 `& E. y. \2 z1 Y8 c. t) P+ \8 u3 v
//1 J$ X& j. L6 o* ~7 I
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);" w' O, @8 q) B8 G7 T: Z6 n
/ Z3 K+ x7 g5 f8 e5 c2 H //
$ t: l0 A8 }- b( L: |' y" U server->upp_channel_a_recv = false;//2 b) r9 O! m9 t( c; b* |9 K
8 f2 J7 S$ {( a- W& ?$ n server_msg_send(server, APP_CMD_LOG, "upp recv: success");5 s w. |7 M- ]8 {
}
0 \ W) l5 J0 k7 h }
6 U& e7 r. A5 b7 Q+ D; x5 _
$ ?$ V! L0 H$ L4 F7 r+ L8 b6 ?/ W2 ~: q, k5 s' q
return true;
( i7 }' `- ^5 B. g$ Y% a}
3 ^; o' a$ z3 t) O
2 k( C, e+ B; j# u Dstatic bool server_upp_data_send(Server *server)
: W( T0 A& @( L1 K7 z# p{
- m2 Z( }; k% ^1 l if(ListMP_empty(server->upp_send_list_busy) == FALSE){% k9 u0 V4 I/ X' e
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& i. e- `' b% l i1 r) ~! v" _" M unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
H$ ^) w9 t* Q1 ^ char tmp[128] ={0};, @: H# F9 G: j5 m
7 ]! d/ v$ C0 Y V* b. E
server_msg_send(server, APP_CMD_LOG, "upp send: start");2 A! f2 S) G" t' c8 }
print_log(server, data, 64);
% U: n, q1 i @+ n) c) I- Z& B8 ^: W4 y G" j8 a2 {+ A5 M7 t
//" O( I: v7 u! y- N$ f2 X. V( M0 l
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* L0 e+ ~0 S R: N5 F+ J! e1 T
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% x3 u6 N t! J) _% o7 ^ print_log(server, upp_buffer_b, 64);! I- g7 E/ W) k8 J; o
8 g* H( ~0 e7 [, N! D server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);8 \2 X" a! p* O, z; l, [
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; " T; |. A& ^4 R0 u1 j
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;+ z7 ]7 ^6 u8 H0 z$ L# n! L* I
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 `* _& I% t0 j: u) b( g v" Y2 r# J& G2 w2 d+ V8 ~
memset(tmp, 0, sizeof(tmp));
" [: t2 ]" T- [% ^4 _ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
# D+ {1 b3 n; n# [; T' D+ E. h sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);9 k7 t2 h4 o; A
server_msg_send(server, APP_CMD_LOG, tmp);
1 v2 x. w' T' O2 Z9 W, ?
8 g. Z) ^5 O6 Z, L1 r. P( A$ K0 i upp_error_count = 0;; L, q; D, Z: W
upp_dmaq_int_cut = 0;$ s, ?( M6 I% t$ |5 Z1 B
// fill in data + f0 t' Y. a. @/ h6 a) L5 u
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); - m% G+ j1 U0 I& Q" G% V
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 s5 ]8 e7 E5 _% ]; }7 Q2 Y
3 S# Q3 v3 r) C( _# o$ U // wait send success
! ]( n6 N- N; f* h: r while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 V( A8 s3 @6 `, r$ G* J+ v1 R w
1 u8 ^( }' }( ^* a' j
// make data node in free list . W+ s; F6 P. E) {6 B% ]1 u
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: W; @9 T) C- i( a# S* l( O/ V server_msg_send(server, APP_CMD_LOG, "upp send: success");0 E( [. f! l2 l* v2 R- y
}
* J; ]: j, _! R return true;0 u: ]0 j: p$ P) J, K
}
0 L6 I9 w; s3 `: C6 X
5 ^+ b# c& `1 r7 M% _
" ` x W& }) h6 o4 W" `. S i. `) S& v
5 E. e. I- ~; i3 P6 Q1 j
: K: ~$ U0 v, ?$ V |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|