| 
 | 
 
 本帖最后由 liangws 于 2017-4-11 17:00 编辑 " v" r8 }% _/ m5 B( `9 B 
 
4 F0 Y* F" |/ m8 R& {" ?, p! Z问题描述: 
  V1 |; l0 H1 [; ?. Z在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" @( f3 Q3 f9 e+ [9 b$ k+ E 
 
4 o1 [/ {" ^4 M6 e9 h0 W8 Y& W图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。 
& }4 C& q5 M$ t+ R' |! S$ U* o" ~ 
测试结果如下: 
& I  C/ w# \+ p' T( E138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的? 
8 K4 m/ i& ^+ h# L 
& J+ ?  h% {2 l+ h$ ^2 p" x4 G3 p0 i* d* N6 p 
备注: 
& f( y* M% b& @$ N1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起? 
8 T! n0 l/ l7 I5 y2、相关代码如下: 
$ F8 K  D$ ]! r3 o7 m5 v0 ?$ L//UPP DMA缓冲大小512字节/ X/ C, y! j/ t 
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 
- n: k" I  E# a: Q3 \" i3 z#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 @. K  v0 I% e6 M$ w 
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT) 
( u+ O; S1 K% _: U1 y, p 
, @# X8 d. M  ~' R# b) j6 T: c. _1 Z* [9 l1 f7 b, m/ W* l* Y. k 
//upp接收、发送buffer  L7 }# ?* F6 T& o1 a 
#pragma DATA_ALIGN(upp_buffer_a, 8) 
) J  P  D9 S' G5 I/ O5 d5 O#pragma DATA_ALIGN(upp_buffer_b, 8) 
, i& W/ d* y& m/ i* z7 Q  k3 z. c 
5 P- a/ c  ]* q9 }! q5 `unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE]; 
' Z" k$ s7 y$ Y8 C, Dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];8 m0 |( X" \* t, V( b 
 
% z$ L! g# `; o7 t% Z 
. F0 {9 m, z# jstatic bool server_upp_data_recv(Server *server) ' j) C3 |6 D6 }6 B. a 
{9 ?* W5 ?0 Y, Z/ t# s 
    if(server->upp_channel_a_recv == false) { 
) l7 ?) r( P- \4 o        server_msg_send(server, APP_CMD_LOG, "upp recv: start"); 
1 P  p7 x7 j4 M- k" Y! @# m; m        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {/ x# `- a: h: \ 
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 W. C$ z) X; h, J9 f4 S 
 
4 g$ |' e1 D- U: s- c" _# ?4 {$ }3 { 
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); 
+ S" \& F8 ?, X. A, G* r5 r  m' }% i  Q3 H. h 
            server->upp_channel_a_recv = true;//: c) j# M- P* C- K. n) d 
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);! q9 |5 {1 m0 q+ N# @6 Z* i0 V 
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT; 
* S  a# X( q. F' s            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;# r' d; @) S: J 
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' Q5 k2 `9 j8 y/ E. k* {/ j 
 
( W. x; x' r0 p/ j            upp_error_count = 0;  j$ e& w$ d$ R1 t* X2 m9 [ 
            upp_dmai_int_cut = 0;1 q+ ^# Y$ m) [+ ~" v 
 
/ X3 I6 u6 V  t) X0 ^8 q3 X            // fill in data 8 I1 C: {1 u- d8 }8 Q, `( H2 ]- D/ h 
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) t* i# c/ s9 H! z& k  P7 C5 { 
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");) a6 z+ E  K* W" B( z- h) ? 
        }5 f0 R% N& Y4 a& K* u% w 
    } 
9 i8 w7 ^# |  c/ |' I7 V    else{ 
8 T+ u1 h; w* K. b9 b2 {9 v        if (upp_dmai_int_cut > 0){2 V' m6 X  f1 V- g8 s! |# s, s 
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free); 
6 ^& D3 z7 y' V3 g9 @$ b5 n            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);; j) b$ X0 A" f5 a6 q2 w- E 
 
+ G  F! ?5 A6 c: D5 R  h2 Y, S7 l/ ?6 w! M& x5 h( s& n7 J 
            //copy data to upp_recv_list_busy, z, K) p: {$ q% ~$ B) W3 ] 
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE); 
2 _, P. @' ?: f! d3 k3 [ 
: h2 M# l, `2 S8 E6 i+ f( |( K            //0 y" ^( I2 k: `. h! q* M- ~% T+ Q 
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node); 
) l+ p) B8 K: I& | 
4 _; X) `; q/ C# t* Y            //5 F. {# q0 T3 M. s" c# \* v) V 
            server->upp_channel_a_recv = false;// 
  J8 l, r4 G3 e1 }. a7 L3 q) ^ 
# B! w( T: i! _1 d9 T2 t            server_msg_send(server, APP_CMD_LOG, "upp recv: success"); 
- S9 G9 v9 k9 T* I        } 
! v" B9 ^, b; h% {    }8 r! [  }' W0 e2 }; [+ D# R 
! ]$ F2 ~" x! m/ T& F 
; V0 M6 b- R6 J% k( o. M1 p 
    return true; 
; x+ L# ^3 Q* W' d# L}* \! _" b1 k4 e8 ^8 s8 X 
% e5 _# g% Z3 e3 n& K, f 
static bool server_upp_data_send(Server *server) 
& I! {. M. \; z* J9 _2 c# o{: N  o0 u. E  z/ g, R 
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){" x$ a1 C$ a/ v) y: o! V 
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy); 
' L+ g6 Q, u9 ?5 I3 [+ ^- I' @& R        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 L$ X: |, z# a* _; o! P7 |: F 
        char tmp[128] ={0};! c) y& l8 X* `! V, Z/ ~7 k 
 
7 \( n9 _! T8 I+ t* H8 N        server_msg_send(server, APP_CMD_LOG, "upp send: start");: H1 u% |! M# e+ X: V- | 
        print_log(server, data, 64);& {3 d; f9 v% N: x5 F5 T 
' |) r* t, l! ~4 f4 Q% _7 G) `! F4 w 
        //9 B& N, W' S. _# n) H# h 
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE); 
; v# {: ^9 r+ b        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); 
& f1 j3 s; C; }# B$ f: R' b        print_log(server, upp_buffer_b, 64); 
2 v4 N# `& I: j3 w, f: X: j. }, s5 i 
; K& w9 S7 a, w; e3 E; B9 H* x        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);. U$ x4 l4 N. N6 l- q 
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; * \& c& _: |1 c% X" m 
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT; 
2 c+ y$ F+ f# x# k& S/ u0 E0 i        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT; 
0 X9 X" g! o8 V1 n 
3 ^* }4 l2 X9 o& Y: |        memset(tmp, 0, sizeof(tmp));& Z" w9 H8 A7 h4 ] 
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' W/ X1 c5 A- S/ q* _0 z+ \ 
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( r! S2 m% W4 ?7 N8 T% R( [ 
        server_msg_send(server, APP_CMD_LOG, tmp);! M3 S* v4 L& l2 m+ M( d 
$ d6 g: p; x3 T- A; a& l 
        upp_error_count = 0; 
; [$ Q3 c& h' M  ?5 \% k3 o        upp_dmaq_int_cut = 0; 
; k% ]# A1 D4 ?* }2 b        // fill in data & ]: `. R; P' u) i; v, j9 s 
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % q' \3 v& d+ N; v) N( C 
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");9 W, ?. ?. C9 U. z; {4 m2 i9 u 
 
5 x1 A% n8 N& A' J" g! t- Q1 O$ [        // wait send success& d  J; ]( q/ K! j0 c 
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);  
" Y9 r, G3 _, m5 x: S: T 
4 {1 s* |" h% ^4 [; P9 \) N, s        // make data node in free list 0 F* ?3 h- G+ Z4 M  P 
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node); 
8 {$ b! Y. T$ k7 p8 v/ \        server_msg_send(server, APP_CMD_LOG, "upp send: success");+ R' Q9 k/ H& j% G" R 
    } 
+ ]( B* F% ]3 D0 r$ T$ {% G    return true;1 V3 J6 g  z6 b/ u$ _* w: b 
}) Y! P7 H  }/ f. G 
 
4 ~. c5 |! y8 q2 o* v( m/ ^ 
- F; H) n& E/ B" t0 Q$ k7 Y 
# z5 \$ ]! f3 \ 
" P! @7 `% ?. X: B7 v& i+ f# L+ T) e6 r  R# n6 }( k# z; K, t* S 
 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册 
 
 
 
x
 
 
 
 
 |