|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / Z$ g; B3 P0 @) Y. A6 K7 v
& X. Z9 B) h# k
问题描述:& x: L! @/ @0 h6 X
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" I e: b6 {. D, a8 t7 z) @0 V; [! g/ G
! c V1 {1 W6 J1 p8 k, R
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。& M f6 b6 E/ h
: Y( |7 G$ } V/ ~8 K3 m" Y Y& |测试结果如下:" o5 x. m# P' V- u" L8 C" f2 v
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
9 D+ N: C4 w6 ~1 Z; T3 S4 U* E8 d, }8 q; P* K8 Y, k4 w( p
y/ K9 [2 K- D; I! S/ w
备注:6 F* l* |- U( Q' H6 [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?$ |# k! o) s4 v) A
2、相关代码如下:( P. O. f# q6 i7 t" n6 v
//UPP DMA缓冲大小512字节, a1 r* E" g- @; T0 @4 ?" }
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍1 C4 h/ U, O- N6 N% S
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
9 n/ N/ Q7 T. e#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 \' M+ z$ I; R! H* ?# r- N" V% f5 T/ R0 c" r2 R
4 C' s6 X" }, o1 c1 `//upp接收、发送buffer
4 {2 r4 K$ X' V2 T/ y9 ]#pragma DATA_ALIGN(upp_buffer_a, 8)
3 c+ g! K# H, ? j- d0 I% d#pragma DATA_ALIGN(upp_buffer_b, 8)
) r5 {9 ~& U" k# R" }6 `" M3 N% G+ \$ j% c
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) w7 k/ Q# ?3 q2 W% E, W; Q
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
/ r4 g {6 `( `; {0 C2 Y8 |8 n! Y. f, p, o+ J1 H4 x
1 O0 z1 K" U4 G& C% G
static bool server_upp_data_recv(Server *server)
l- O9 u' p$ o5 ^5 ?% ?+ x- Y; v{ S) M# P* l2 {" D( B( i
if(server->upp_channel_a_recv == false) {" R# T' t+ E( w; q# }
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
^6 z# R+ l% t' j% |0 i) v: j: v if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) H. `, Z4 u3 m$ ^3 w( r
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
$ [: \) \8 Y e9 Y* g" L
3 P8 c" k- z7 [- V% H4 G, Q0 l; R1 F. ^5 _0 m" S
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ U0 [& J) o, `- y9 S; R& E
9 P5 C% \* q3 _ server->upp_channel_a_recv = true;//
* a% H5 e: g- f server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);% ~' k- y! Z5 N) ^% C
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;' `4 U- v5 m9 v+ s6 C9 ?
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;# ]0 e* t% ^* {# g( I
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" K$ r! M* S$ C
z% O. f( F. S- O' v; v2 h upp_error_count = 0;# q2 ]- [2 G2 _$ Y' ^' z
upp_dmai_int_cut = 0;5 I* c5 H4 I: I" w5 h7 C
! @( |( a* u3 X! W* C6 A0 `7 I // fill in data
- h, e/ g; Z) T! b) ?* X/ N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' N2 I" O2 {0 T5 ^: R+ l# a0 [ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; L0 s/ J5 F. A0 o! z6 u" n } R2 @+ m3 q ~
}" L+ P+ R3 U+ p- q
else{
; d: s2 q7 ^) z if (upp_dmai_int_cut > 0){0 H! s9 _+ g; q( }- }
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);- v$ e# f; s2 Z4 {0 [8 r9 f6 G
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);$ t. E+ _. n; y( B; d2 |
9 p! w0 z, m! ^5 [3 u8 L9 d; @. ~. J+ r3 e
//copy data to upp_recv_list_busy
3 A$ ?; B$ J' }- V memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 q) X1 j- f( s0 N4 {
, O; ^' o% g/ T. q+ x) W( b, s: ?
//( q) w' r5 N4 L$ s
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
& \/ C5 M; V: l; C2 g: r* v+ k% v6 [/ x/ M+ S. f+ E
//
8 ]" c C# i+ R- v: ~0 t0 ]0 ~. R server->upp_channel_a_recv = false;//
{; y- D9 P) h2 w6 ]3 K, w( X0 u$ }! W
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
( a, C1 O5 n1 i) T }
4 Q" Y1 l0 ~3 _5 h" V. @ }
/ u* C( ~# {0 o6 t$ {7 s
* g" B, }0 u+ j7 b* Y9 l* A8 ^+ t$ y
. s7 q+ ~0 a2 x7 t: C6 ^8 O5 b return true;1 ]0 V) g% j& O: u+ |2 _+ z" o( }
}
; M8 h. ]/ j- o2 `- A/ U/ `' I3 t2 \' t/ O/ q0 w: M5 w4 j/ A- g
static bool server_upp_data_send(Server *server)! f: `' i& h/ e/ A
{
% [( ? ~+ v! D$ [2 o6 O if(ListMP_empty(server->upp_send_list_busy) == FALSE){
- N o h! q5 R S! @& j' l4 L: u DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) n. O' C8 d% t$ j; U unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" I% [' P' X- f) c4 [, _4 i, y: _
char tmp[128] ={0};1 i+ r1 B# @ L$ f9 o! s$ m, r2 o
# Q, k W! x2 y
server_msg_send(server, APP_CMD_LOG, "upp send: start");5 d) T* G/ C. g3 p$ A6 Z1 p
print_log(server, data, 64);
9 i Z5 K8 K; D" |7 w4 e7 A: O7 `( U5 t) V& F
//( B) I2 _- E# n! e# k. a0 i4 z
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
* }1 i1 B+ C) W2 ^ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);: j; o2 j+ e7 ~/ e D, z% _
print_log(server, upp_buffer_b, 64);! d% b, G9 k" M1 k9 o W9 o3 j9 c
1 Z1 |' k- G& I# H+ t# | server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);$ n, {! t, e" ?8 C5 q
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; $ w2 G% ~! N% T2 u
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
$ |3 i$ r' Y8 R. P; a server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;9 b1 J* H7 U( `/ G
" Z1 g$ r& e% x! s: k
memset(tmp, 0, sizeof(tmp));
' U8 a# X9 |+ |: X, d% \! P4 X sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
0 d& ^9 l& H' F: v sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ T+ }6 [. C8 [- l server_msg_send(server, APP_CMD_LOG, tmp);
/ M* m% D! S' ^9 s5 }7 L' C
0 F k' q- O3 y3 W upp_error_count = 0;
% S/ Z6 g; r; r9 k upp_dmaq_int_cut = 0;3 I5 X, _& e4 N& W
// fill in data " s% c) M( ^$ R4 U, L& P: N& P
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
3 G9 n3 d( Z) E, F, a server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
8 h# T' X; C+ l; o, ]& H: H% r' B! z/ l9 x8 s
// wait send success9 ?/ f ]5 }1 @/ M; b' C& ]0 y, c! q
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 m3 M$ |3 Q0 \% o. P# ~5 i: W; |$ @
; G: Y3 a1 m; X3 H! A3 d) \
// make data node in free list / C' O- q6 Y6 C* J0 K" v2 s' O
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) | x6 F; q# T! l5 o0 `7 J
server_msg_send(server, APP_CMD_LOG, "upp send: success");
* Q6 H+ R3 t! T- w7 v1 R }
) B# h$ G2 S& C8 U# W: c5 h; k return true;8 U9 `& n# G$ n0 k0 T+ ?
}
3 D# p, R$ V: ^/ n: M' K! m0 Q! x d' P' ]
' q5 P6 I, h' O7 r# ^/ `0 Y
. f$ ?+ A# R! a& @+ T! r
' z0 n1 z8 d2 p; R
2 B `9 k% _! M _& z/ J |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|