|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 I# I; n! w% Z* R
3 A+ Z# n# k* D
问题描述: ~' z, H" o5 O" E8 e- K3 v
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:2 u- l+ K, D6 D) Z6 E7 Y
5 D ^0 Y! b2 q# f# @) m2 e% L
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 b1 d: E) V) e5 P4 t: x: r* H: x
+ ]; r1 |; T% q- v! Z. D
测试结果如下:
) a1 J7 V' `2 l, Q R- W }138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 \1 l7 h- y; {! B# P/ [4 Z$ F# I
$ X8 w8 _& W7 |3 v* Z8 S
* ?/ `1 u; r8 J备注:2 z2 Z1 D: S, F5 H- \# y
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& C) V3 L& N2 A2、相关代码如下:6 {8 ~+ |9 J0 S. a8 o( A& p. \+ f
//UPP DMA缓冲大小512字节
5 i+ x" _3 n9 j( d( g#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
# Y- T) k7 R+ @- H& ^1 u#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" _4 i. m$ A" q#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% e C1 W" Q# I! P# J- Q. t
$ @! P- A: Z; F( V% J
; l$ ~; O# }. ]5 N3 K c
//upp接收、发送buffer" H" [2 o( j2 [: r* |
#pragma DATA_ALIGN(upp_buffer_a, 8)+ @( g2 O# m" ]: h
#pragma DATA_ALIGN(upp_buffer_b, 8); N) K& C( k2 O- D5 s
8 B* M7 s+ ^* ~
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
9 O0 d4 z5 g; a+ w! f% ^unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
( M* s9 D1 k: @. t& f \9 G" M
6 q9 s# q# E5 E7 j4 j/ p; y5 Y7 `" t# m( W
static bool server_upp_data_recv(Server *server)
# c/ x) _6 v5 D1 ?4 o{
1 Z2 D( j4 q4 S6 p. }, S5 e n if(server->upp_channel_a_recv == false) {: c# F$ h& L, r( ^
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 @9 k% A# j% P( Y) n2 C8 H if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! z3 H* M v w0 ~9 o1 }5 ~0 C server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
N" R" h, A" R2 j/ [1 x
6 N: ^/ U- P8 |/ S$ Q" ?% n0 O; ]1 S+ _3 W7 \
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ v. ?" U9 V* h
8 `, O9 ^1 |& Q' r' g+ V
server->upp_channel_a_recv = true;//
* `, A/ M6 g; { server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
- k* U' v0 P8 Y server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
& \, \+ s- i& X server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT; _ ?3 L$ ~' K5 D6 ?
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
( i$ `, B! v7 x3 a7 X/ l$ m& i9 O! L, k% z; [( J
upp_error_count = 0;: B2 _+ q5 @. m! U
upp_dmai_int_cut = 0;/ [2 P5 w; {& M8 B/ i0 G
: o2 D# Q" k5 d& R% ], [' p. Y# B U // fill in data / |: e. f) W5 U; \+ l; A
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- b& A; Z! u8 g) P
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
6 H( m% k# m% y }
. i0 D: D5 R8 V% j) j }
! e; {7 `3 X; ?: F0 l7 ^ else{+ k0 P* M: S0 i& F9 M
if (upp_dmai_int_cut > 0){$ b# R" e4 v+ I. `$ h; ~( j' L6 }
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 r! G& G: ?2 { Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 e: d S: G6 n# G0 m& O0 _/ v8 Y/ ^3 ]; X; w# D1 F+ L. b) s$ }
: d% P+ M. q; l- O5 M O) n
//copy data to upp_recv_list_busy; X& Q% P$ e0 g. F3 H0 F
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 T& W4 X- ], p/ L. \3 F! L* b) `( t6 N' C$ F$ s
//. T7 o$ O9 {4 r' e
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 L( r- y6 E$ p$ r8 r+ {$ h
, l, B4 {! V( s$ Q5 l
//
/ m' s6 }7 v1 T server->upp_channel_a_recv = false;//
7 p( l. L; T2 l& E( @7 z* u7 b G& l1 v+ J
server_msg_send(server, APP_CMD_LOG, "upp recv: success");( z5 L) ^% K o8 k
}& s8 X \! N6 W2 |' }/ T, C
}" Z9 k' q P3 a% g! q. I
+ q; |' v1 n# I, Y; t; b: D5 P1 }7 A4 e/ q
return true;3 ^/ ^" n$ X- H
}
& [7 r! ]: U, k
' r* k5 \5 p, I, l& g! Nstatic bool server_upp_data_send(Server *server)
5 `7 g" ?$ L/ E) @# J3 R/ f; D{$ K5 `' f7 ?1 o2 h. O, }
if(ListMP_empty(server->upp_send_list_busy) == FALSE){- L; ]7 k6 s7 E+ d E
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ J' Z l/ m7 ?, v" s: W3 c
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
B E' h% Y# ~: {& r# U( _8 k char tmp[128] ={0};% ]8 a! B- G6 ~5 Z' ~6 z" Z$ ]
% q+ y6 X' X4 }' Z' C' x. R
server_msg_send(server, APP_CMD_LOG, "upp send: start");
( z1 E* I' d, n print_log(server, data, 64); b6 U+ z3 X( D
( X( i( o3 r! m3 z: N
//
4 K! n; i7 o) v- y) u, J P) M3 ? memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
8 E: B0 n' @# R" w N. i \7 O& Y1 v memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
& X5 h |) L+ ]) p print_log(server, upp_buffer_b, 64);
" I$ L- Z( F, n) f3 X9 a4 \* ?$ I" R' Q; T
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
) l6 E6 Z I8 g% P% @ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; : i" m& d0 p4 h) b4 d
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
1 ^1 L5 R9 v( P7 Z6 b server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 t. `: @: }% u7 j9 w' ~
" W: K/ ?5 r3 f2 N memset(tmp, 0, sizeof(tmp));
2 b' |; B" e q; F, x/ Z4 J4 J sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", , P. @9 m. Y. n; z# J
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 n, k. t# C9 q& U& V% n8 s3 m, M server_msg_send(server, APP_CMD_LOG, tmp);
* r# u7 G2 ^3 ~5 D0 N( L4 O
2 P0 h! k' |$ k) B' Q- U$ Z4 @" n" E upp_error_count = 0;
( P: V: h) o0 g0 P upp_dmaq_int_cut = 0;
. K0 ]+ ^6 L. s // fill in data 2 R: U& c6 @' f$ P# e6 A8 {% v1 K/ {! d
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * o( }3 F# ?9 F) ?& s' l) `
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
$ |) }' l( b' g) F* H8 g9 z( t
1 ~3 R8 p R5 b8 z$ c1 y: i! ] // wait send success# Q, g- N$ g! D q
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' P; n9 H2 G+ H/ G$ G) O% m5 j. e# `- T" B! N
// make data node in free list
* b2 f% A' Z- c5 F& @: [8 X ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( J% U6 ^" E* C/ G0 k2 \7 [ server_msg_send(server, APP_CMD_LOG, "upp send: success");2 V" }% N0 e! P; `, d6 j
}
: G6 n: Q9 r/ h5 J1 m/ j return true;" t8 I& ^5 [; J; G( f( j
}
' F8 C% r4 Q9 z g9 V. ` V- D, ]' ~/ A' c
' x' `. ~4 N# }$ X6 Q& a% m" \( S. G; [* m) R6 f/ n3 |
2 f* ]8 H' H) C7 U+ b+ U. ^# p+ y L$ x
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|