|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' n- }* ]4 y: T: Z. W/ S M/ P3 A/ v2 A% {
问题描述: V2 q! L; q) A$ T3 R
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( N+ K# X' y) B% @! @
6 u9 ]& G1 _ b9 j$ R2 ~* P
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
8 H! z! ^2 e6 L) ], s* M) U2 L4 c. o: X. O- Q
测试结果如下:5 ]& u5 {- b9 w( s# O3 v
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- e [3 W t5 F- l/ L; l8 }1 S! s8 ^9 w6 u8 m" D, V. m4 p
: u% B- ?. p4 Y' T$ u
备注:. p8 b2 S0 k. ~& I
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
* X8 Y/ ^8 W2 o0 ^6 U' Z& E1 t2、相关代码如下:
$ z! o% T* @5 X; G- w5 U: ]//UPP DMA缓冲大小512字节: w, W) b0 W# y% I3 _/ |$ h
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 r$ c5 C! F$ ^1 F* J
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
. @. @. t3 v- ~, y0 R" Z& l#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- [. Y1 t! o4 g- n
" A3 Y/ M8 V1 J: Z! G0 a/ Q& B- H6 j3 h. e- q2 B7 D
//upp接收、发送buffer
( h. }- { t7 C3 C2 m7 K& f/ X#pragma DATA_ALIGN(upp_buffer_a, 8)
4 f$ @' t# V! J1 |; f$ L#pragma DATA_ALIGN(upp_buffer_b, 8)
' P9 T! o* _: J& Y
. t7 P4 }2 [ x, i/ l7 `unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 E. D: Z5 X& i2 g. Q0 [. w8 Ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];; o/ S7 U* r1 j$ B4 F6 D+ Y
- j i9 d3 t" S
@/ F9 [/ E! j# v2 bstatic bool server_upp_data_recv(Server *server) 4 q/ B A' ~6 p+ |
{
* z+ n4 }, u4 u* r' k) } if(server->upp_channel_a_recv == false) {* _+ d0 n S6 c5 u" {
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
3 S8 n1 H7 P0 v5 b2 D: D if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# h0 F. |/ M8 s( j server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 w/ F8 x) V0 u% u& x$ o6 {7 g& E$ K. d3 u+ F
( \2 Q' e* h( _2 v2 |- o* B memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* D4 S* C& O0 d* o$ U2 ]
X# ~. V4 } J& h9 ~" e server->upp_channel_a_recv = true;//0 e6 S: k* g& M
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
( k& u1 _* w1 H$ _ g# {3 J server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
- d# y4 `, W# c3 z5 A% b server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
# H; n0 W, ^! v! | server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//5 E$ [% G! M& M5 c2 K, f, \
2 U) Y. Q* Z- W upp_error_count = 0;
2 i/ d+ u8 w0 ^- k upp_dmai_int_cut = 0;( W4 |+ M& ?$ o& D) M
5 z' R+ \1 S5 q/ h
// fill in data
# _* o5 I* f1 L8 f% B% `6 @ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. B" o: ?( I9 }
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( H j: ~6 F& A" _5 c }
$ l4 z/ P& I8 [* S }
( i3 d# X- h8 K5 F2 m: W, o% v6 V0 A4 u else{
) E4 i7 E8 C- ~/ O6 d! E+ [ if (upp_dmai_int_cut > 0){
! Q1 [, [" h' ?" ^ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);9 y A* b0 {- Z" |, @9 h- }/ P
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: B" V+ ?# M' S4 ~3 @; O k) A+ [( Z4 t- J- S
, n+ {/ I& T5 ?" v+ u" H( L8 K //copy data to upp_recv_list_busy4 q: f3 i3 j. W3 ^* j( B5 v
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);3 w, P6 H% Y* I+ R$ C
5 ?% [! a# \5 l, q$ I
//
5 s x3 E% S" m) c, W( ^ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* x5 q0 u! \' k6 {. c8 R% @" n
8 B' N8 i# Y0 q" Q8 `7 c" _8 U //2 Q0 w4 c6 j' M, I' o+ N* @
server->upp_channel_a_recv = false;//2 x7 W1 c% S3 \& d6 a5 R a# x$ g
' ?( \3 b9 f3 C/ |7 `1 @
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& q0 Z" b' U) x }
7 L0 R2 Q( O e: j }: E- B& y8 l3 B- C. S1 B# m2 {
; g, ?7 Q. q+ P5 l7 ]' U
. C0 K+ s; \2 N3 _3 X9 V0 h
return true;
6 g: \# L+ N( ?' ^3 J/ g3 U}
. y8 e, D# G* k- b2 t
: W- D0 @) b& E( g2 K/ H& {static bool server_upp_data_send(Server *server); [2 j+ J: E) Z8 x, s, `& D
{! j- ?( m7 v7 l ~% p4 I9 K
if(ListMP_empty(server->upp_send_list_busy) == FALSE){' u+ y; q3 M3 L, V$ U
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);! [" H$ |5 g( K2 c0 q5 l& f
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 v# h* u1 i, O C# Q3 Q
char tmp[128] ={0};+ G& U; I- H6 n4 q, i
0 t3 r7 n# _; r8 g+ ?! J
server_msg_send(server, APP_CMD_LOG, "upp send: start");) |( w7 m3 I" [ u- L
print_log(server, data, 64);" s ]# f) @+ n) }' K- p' }
5 G" `2 B. j! j9 E% U
//2 i( X0 j3 ^ S( N+ B7 h
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& E0 [: V/ j% P7 a8 Z
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! Q# _6 F+ |3 @0 E" \3 }: ~ print_log(server, upp_buffer_b, 64);( c' ~# t B8 c! x/ `$ l7 b
# ]) w/ }5 o# g- X2 Y# L! E9 Q
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);# y. }' w) o7 C+ m
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
8 I p5 J8 D& C. H! s server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;1 |$ Y% d7 f9 J& x; r% ^: _! \
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, l: a$ f) R' S( w% a- H ~3 a+ P
6 G. J. k& e% Q. t memset(tmp, 0, sizeof(tmp));2 U, d; ^: \) r1 S8 W& p
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 T1 n6 r- x# ?( o sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! P+ Y- P! E- w' Y' f6 {8 K+ Y# v server_msg_send(server, APP_CMD_LOG, tmp);
* ~# j1 v6 i6 S0 P) F# ~ z; h6 Y c% E# c
upp_error_count = 0;
- o" J& X! A1 D& e3 Q upp_dmaq_int_cut = 0;6 W8 q1 g- }8 I" @
// fill in data
2 e* U; d# R2 o! T6 K/ f/ M" _+ a- A uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ! Z" Z/ v h1 Q! d- f. D
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 j; W& \& j0 r+ H8 l& @& D
9 g# g t6 s" \0 F
// wait send success, `0 ~/ |, U! B- q4 {3 j1 D
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
! U; f2 |% e" I' @( K2 j' V
3 F. s. k4 D( b! s: I3 G' u // make data node in free list : ~' l3 Q8 u4 }( g: E( R
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);3 p9 f5 G. W c1 G9 z# A; ^- F6 j
server_msg_send(server, APP_CMD_LOG, "upp send: success");: A1 I1 I" k1 B6 {' x2 m% r4 E; Z
}+ l7 H. N j) X0 o" X7 v
return true;2 z) a3 N$ b/ c; L8 H
}
+ t9 I3 b' T3 c5 @( c8 `/ R J- Q
- i/ T& y! U3 X, Q9 z4 _" A7 ~* ~, ^/ r* q
* r- w" a% E) u9 ]! B8 I; ~" G# H$ T
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|