|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, s }4 _: c! O9 V. B) I" Y
; Y9 V# _9 |7 H; o4 w; p问题描述:( u1 T. X0 @! B4 p7 S% L3 Y5 r
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 h. v1 I" p& s, {1 z
! G$ Z7 l$ Y$ J* ?9 z+ U图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。1 N) E' r( M* G% n( S
# C" x9 P- E! x8 m( R
测试结果如下:
' v* A$ u8 ~8 C* x: e; Z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?$ D4 g* D1 g6 K
: i4 E; U# ?$ j- W
9 W6 ?, j7 z6 W' }% t0 a+ f0 B' O' [, c+ `备注:
- S% Q6 K* ? D' d1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# h$ M" i/ h' A/ r( W2、相关代码如下:/ _ I. k1 h4 ?- F; {- h+ D1 O/ p
//UPP DMA缓冲大小512字节
2 n( o8 n5 Y) v#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
" S# d7 B v2 ~" W8 [; L& C) f#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ t& K- a8 s4 c) {8 J
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' y& I% ~+ N7 ^& Z$ {7 B; j5 h2 i5 F' b, c& Z. p
$ l1 [, U5 W. @3 j//upp接收、发送buffer
4 q$ W( p/ o! s#pragma DATA_ALIGN(upp_buffer_a, 8)
; r6 v+ q6 z2 R, F' ]7 ]#pragma DATA_ALIGN(upp_buffer_b, 8)1 ?' m! s. P& M. G0 Y
1 j8 E, E/ y5 p/ S" @1 s Z2 |' E7 ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];7 [+ x: t: R& K
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 F' T, [, X& {" ?, b V4 I+ }' T! S' K3 R4 m/ H: q: a7 a
* _7 q' g/ J) y1 O( p
static bool server_upp_data_recv(Server *server) ' `3 T2 R( S8 y& `
{
. X) K1 g; ~/ k& l" w! W: h if(server->upp_channel_a_recv == false) {
1 Y# P/ |- c& c4 l0 B/ O6 ~ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
- q6 B: o$ N! `2 G4 Y i- R9 ~ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& w' N" R( ~. g
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ ]5 d# p3 R, H; g y3 h3 u
) o/ t/ d, M9 y. {, j; P7 M9 q9 ?: ~6 H1 O% c0 N
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);; q4 k, y4 c/ l" _+ z) l i
" V% Q7 C/ x* N9 P# L( u
server->upp_channel_a_recv = true;//3 C1 p: L- Z4 ]5 E* t U% V0 H; D
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);! m# d# u7 M4 K2 m5 p
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( G. E9 j, K* Y5 V4 q server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
" i2 m! n6 A6 Q1 e g! j server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: |8 n: A8 f/ y7 c+ ~9 Z- ], ~8 Y; g$ s( S' U' k
upp_error_count = 0;
1 T) b# u ?5 l- V$ s F' U upp_dmai_int_cut = 0;, p3 N4 i! V) b% Y; R0 x5 H
. y( s2 |1 A1 v& ]* {- p
// fill in data 1 T4 W8 I. a1 o# s# D
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) f8 V% q6 d* T2 w
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 {' r+ Z( J$ { }3 G" a: F; R+ X+ S6 l, Y
}/ ]& E c8 P# l2 r7 Z
else{
: H8 a4 e. q1 k% i- v3 \' v if (upp_dmai_int_cut > 0){1 w$ K" j; V9 ^1 D6 j
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);( y3 j+ X! X1 v7 k- c1 h E" m
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
( ?5 Y* R" |9 G2 c3 `/ V. X( w$ S4 R: J! L( u4 a9 n0 k7 i/ ?
: H9 v5 g4 ?, l4 m0 ? //copy data to upp_recv_list_busy4 Z$ h& j* i" [. F
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
7 k- g) p5 {% g4 [; n) a" t
: |7 h! g1 c8 V/ E: ?' @ //& w/ D6 F+ T1 w9 ^( A- f- ~& y$ P7 y7 z
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
3 {9 f0 i5 w% E" I, N/ U& a' D# t. { z: @9 R9 s& v& K4 k
//
% y+ \2 t3 Y: K. d server->upp_channel_a_recv = false;//2 V( L# ~7 J2 k1 t+ Y0 A
( O- B# H' v; F% e( K9 M server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 [ i: a5 W& U/ x: H7 C }" M0 `1 z$ K8 |" A! N# v9 C
}% h1 N7 }" |8 r
( O p7 |9 A, o3 I2 _& c
% J: H9 t; u6 A* p: G return true;5 F9 j; X5 @. f4 D
}2 D8 r8 Q7 y3 x6 I
: I2 R2 K" b' Bstatic bool server_upp_data_send(Server *server)# V- A" x8 Z4 }+ L
{
5 f8 d& [ R) S6 e2 v; q3 n if(ListMP_empty(server->upp_send_list_busy) == FALSE){
N$ F5 b+ `; V* r- G# B DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
5 \5 C" F9 f+ I' N& v# z7 M unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* }8 w2 w0 V7 q5 }7 N* Y char tmp[128] ={0};
% E5 z, c$ x2 P' }( p. x- s. L D: g+ o
{- g: E6 l+ \! u9 V, r server_msg_send(server, APP_CMD_LOG, "upp send: start");
" Y/ a' M! `+ e8 b6 N7 v/ B7 A print_log(server, data, 64);
7 l& |7 l) s8 m. _ }2 s, y
% E7 Y! u& z7 o //3 \2 b. w3 E8 [' g. F- G
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
2 ?* a' }( F8 ] g: m8 _ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' q( k+ ]! C: u. S* ]2 {7 N( s print_log(server, upp_buffer_b, 64);' J# R3 J+ J- A. t
, n/ k O2 O: z9 y, Q# L# [! [ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);7 L% F P- Q) E/ w+ w U: b" Z
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 2 q% w' f. G/ k7 U+ V, L Y: f( B
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 o' v9 N8 y0 y
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: ?/ z4 x- f, i2 Z2 |2 c* Z
7 d6 n- K) F2 f' r
memset(tmp, 0, sizeof(tmp)); e' H/ @0 W8 V* D* C) F7 ~
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 t* e/ P! u+ D- z6 T( o6 U% C sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: m: E# j" j' L% Q( R' e/ u |& O server_msg_send(server, APP_CMD_LOG, tmp);) c: Q% p+ Y5 R* g, C) [3 T: _
( v. w& X& b7 H8 \/ A7 ? upp_error_count = 0;! ^( k4 _6 S1 }
upp_dmaq_int_cut = 0;" r U: e& Q. l' O4 b/ f# `7 H% }( R
// fill in data
2 P7 R8 Y0 f' g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ w: l J* r; s0 | U$ e6 p! L1 Q server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
9 R( K% e: a6 s$ @$ f7 x) C- F5 B) w0 I+ M
// wait send success8 d: @" M+ j* D! \" H* Y' x, j
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
- \. V% V4 Q! G( l
4 }" ~9 p/ F# }, c/ a& } // make data node in free list
! n& U, m2 F; f+ V" Q7 Z4 B ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 K N w) X6 j& c server_msg_send(server, APP_CMD_LOG, "upp send: success");
6 L% ]9 T. S0 R }
& w. O2 c8 j) S) S: H$ C3 S return true; l% h2 [; m# N
}: z6 C# n E+ l, x/ u
' X) K% v% [- [4 b$ t
" L. l! ?3 q# I+ o$ o1 l5 e1 J, |8 o9 L3 h
6 x# @2 J' I. q5 Z1 N# @, w$ f
5 T" \6 [3 A8 ]$ p* d) ~, u |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|