|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
) I# }* ]7 A2 C' y+ I e( k/ o, [1 X) g
问题描述:+ I& c/ P6 K9 |; F. x X2 U0 [
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' f# h8 y9 Z! F( y6 j
9 d- p/ ~8 Q7 b" ?$ {0 N5 k$ @图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 o6 |( R1 \; t0 a
8 V& H$ v1 M4 f
测试结果如下:% a: D9 o7 v0 R% v
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( |- |, f7 d) k9 K7 l7 m6 R1 l
z+ b" K$ ?9 T- u
( _ k; |6 E7 h/ _4 P7 b) P
备注:
' n, n2 J0 c' {- H6 D1 t1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
9 M7 `8 g o9 J( J0 Q2、相关代码如下:
2 Z& {% q0 O* r/ D& v; \* @/ F; J* ]//UPP DMA缓冲大小512字节
8 E& M$ B9 Y- ?- Y#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍5 ?0 Y8 h5 O" ?/ I {: E
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( [- u8 a6 `+ N+ b- V2 v#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 [) V% d0 [/ h2 C9 ?) l
: R$ C% p9 i% L$ X7 J) A/ o) B* x' \
//upp接收、发送buffer
l- `3 O% P) @, \. Y1 a#pragma DATA_ALIGN(upp_buffer_a, 8)
- D* j$ j3 ^! t& I: s: W2 k/ w#pragma DATA_ALIGN(upp_buffer_b, 8)( i _& ?! H6 Z! _
; {5 R$ Y1 v4 L/ i8 Q8 o
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# n- n, a: `! T8 d& n
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ H/ J# [" l/ p$ y3 W& f# E) q& }- H4 c* N; L1 M
; p$ D, V5 R7 m* Cstatic bool server_upp_data_recv(Server *server)
; G. W M H$ ]. Y* ?1 n" E- f{1 m6 i" u$ O4 U$ t* @* ]1 {+ A) Y8 {0 N' b
if(server->upp_channel_a_recv == false) {
3 K6 U/ L2 O! \. h. Z server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 X3 r3 x6 T" H2 Q R4 v8 K
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {. I6 u6 m/ F) U* O' g& l; P
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 J7 M& c+ j1 h! q; k" n1 _- p
/ Z% j7 O& w# y# N0 n$ z5 a" Z8 K, ~# o- j
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);- X$ f) ]9 D3 A- n+ [. q' f/ R
! r4 s' S7 A }
server->upp_channel_a_recv = true;//2 g. V& u4 C3 c0 ^6 e% d/ ?
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);% E+ c% ~1 `% `! s1 J0 O* U
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;# @* a9 t3 y' Q" p2 m; R+ B; }
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
# z* P/ y1 w3 E, J server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//( ~* `+ f2 W. }) j+ A* v
* \% _6 h: e" C8 b! A
upp_error_count = 0;
7 o" N. Z/ Z" l- A5 J& d7 D upp_dmai_int_cut = 0;+ v8 f- t k. b
+ s4 N) v: ]8 V: W" ]* V
// fill in data
" X' C' t R+ V# B# H6 T* [6 [ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
8 U; c8 k7 a0 C; ` server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ x L. n" ]: ^, z" u5 m; L }. m- j/ y: H, T9 m
}
/ P) Y7 o- R' H$ p else{1 z, {7 q4 ^9 Z# |7 a. g3 z" p5 T% ~
if (upp_dmai_int_cut > 0){6 C1 Z6 |9 Z- f! k- B8 [
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 _, }( a f2 A( y8 R Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);+ Y V% Y+ ?+ y' L( O
' ?# S K) b E s3 B$ g* g/ o) A. _
, n2 _' b3 e0 W" |, f //copy data to upp_recv_list_busy8 {- [+ W9 W6 g: n+ l: W! w
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 p( @5 B* p/ V4 {) }0 O; K) A+ a7 a* c% x/ l8 E
//
! ~2 C+ q; a) W$ D ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" Z4 w: z2 C/ M2 V; L
& L/ [2 N! p$ u1 v/ i; o) p //" W8 R y! g; C6 k8 q0 F% h; L
server->upp_channel_a_recv = false;/// ^# U1 k- r* q4 M# p, C% U* ]6 o
- I9 k+ e t5 t) Y& X' r% P server_msg_send(server, APP_CMD_LOG, "upp recv: success");. d9 [" o6 I; J* k/ ?& M$ D* O' k
}+ p, d" J" W+ t/ g2 R- N# V
}" d' ^, o2 ? w9 v: w
0 Q+ `. z* {! P: a& H( U# q
! k; {0 L w- `$ R+ K% P# v return true;5 k- h: d6 |1 S; J" {; o
}, H& B- D+ B/ }+ }/ X/ u
+ V* X1 H3 \8 j! y, Z7 a* g
static bool server_upp_data_send(Server *server), _% e5 A+ Q e! p
{' E8 x- \9 n8 z; n
if(ListMP_empty(server->upp_send_list_busy) == FALSE){! V1 `5 I& s0 y7 t3 s7 v+ B: r
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);' n3 l+ X" |+ N% n3 R3 s2 q$ Z
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
1 \9 A* a. a- f! M2 [6 P, ? char tmp[128] ={0};3 {' T! Z9 }4 d- w" m9 L2 K
& I( y& O/ b; P0 K. Q" A( P5 E3 z server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 {) i/ x! u! V1 y. c print_log(server, data, 64);
* D0 ~( u4 O, F9 f
& s( R8 \2 S6 J1 b# l0 f //" {3 G% |* D* s; a6 r
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. T) s! {* U9 [
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 r& J3 V, r5 y6 d; { print_log(server, upp_buffer_b, 64);7 j, _7 r; t0 k" X6 _
0 F! f9 r/ q# g! i e' N6 y2 a
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
8 q* l1 S, x |3 D8 T server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! ^* R. P" c% Q
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
# E" M6 W# v& s# N5 u1 u( P) V' S server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 \! g- H3 n& }( y" `
! \) [. ]* x! K/ e! `9 T# f* ] memset(tmp, 0, sizeof(tmp));
- H9 }9 f1 ~% I6 D1 m- p" v sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ A5 c. d8 G p& } sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' \4 q- y5 J" ]( v server_msg_send(server, APP_CMD_LOG, tmp);" B2 R3 j @; ?
5 |1 T8 l6 [9 z8 r0 m8 m" I, ]+ s upp_error_count = 0;! e, j) k) S- o E& {
upp_dmaq_int_cut = 0;: G: x4 J0 f5 y; w4 ?
// fill in data 6 [' W, l7 d i6 a7 b
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
: a( q: N- @: B9 v( x9 B, p server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 {# V! L8 V/ r) _- R( f
: x3 l8 V! m n
// wait send success/ v3 t, }5 T/ E( y1 f2 b* D3 [# k: W( J
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
1 J# _: X, V& b: W1 F" q( q6 i* }6 L" A) H. D% |
// make data node in free list : E8 t- M% r: G) c. x
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- d/ r7 S5 R6 q) {, s6 Q) H) H
server_msg_send(server, APP_CMD_LOG, "upp send: success");
6 I. A4 L- f, V7 t) ?( t }7 r2 `/ W/ {" G& T
return true;6 F# J& ^3 w$ r- {7 \
}- E5 X# |5 w% K- b! Q' x
5 h: @8 y% _6 l( j* A/ _' |- A4 D. O
$ Q& B( R3 W5 E( H8 M8 L6 I0 e- d1 B: t, r( T
+ p7 |5 l6 B8 E1 |. O$ g" Z' l# ^/ v* y$ ?
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|