|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
- F9 C; E$ s% }( I/ l2 m
7 Y/ c+ t n0 x. Q问题描述:! w$ f% n- ~+ c% F: o
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ b; V) m! f6 E e
( }- d. D" Q0 \; s% W- ? I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。4 ]- _3 z. U# T* M/ z' O( ]
2 M* A- S1 f9 U% w% q% b测试结果如下:
. R$ y! k s0 r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- f+ K3 V* ]8 q( H8 G$ D+ O- G0 R9 m& P2 J+ _2 D
$ j( V# O, h2 G7 f备注:+ Q5 B) Z/ y* `% n, n
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?/ B( h7 y3 f" E- f1 |# R
2、相关代码如下:
. [+ s! J: [* b' x# e//UPP DMA缓冲大小512字节- n- J+ u! H- X# V, Q& I( g+ g2 b
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. d+ V# t. H7 Y* w4 H#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
/ B9 [& k5 Y9 j' L+ T* ]4 F' H! C#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 q6 A' _' s9 e
8 \0 p6 i' t9 D3 ]( f3 i
8 I) x7 L9 j3 h- `//upp接收、发送buffer+ C' X6 r L3 X" q8 }; b; f
#pragma DATA_ALIGN(upp_buffer_a, 8)& F4 l5 u, I* _% ]+ }1 C
#pragma DATA_ALIGN(upp_buffer_b, 8) b* U% I/ `* q1 x1 z& V
% {+ G2 b0 A$ u- d5 w8 x
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];, ]% m+ I1 k: W3 W- y% g0 E X& ?7 v. ?
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 r! j0 U7 ?& u' \% I; m- G8 R
1 @ O0 [# I+ Q3 Z: g+ v# ^1 j( Z: X& _# _1 b
static bool server_upp_data_recv(Server *server)
- D6 A/ M, D! u( Q, r3 N{1 W4 k1 ~. H1 w: I: S* S" K5 d
if(server->upp_channel_a_recv == false) {
, \% W/ S3 ~5 K! V- r j5 W3 j server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% i0 B8 X4 v A6 f6 v if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ F) J# n- M& U6 K) m
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( `, a: V1 q1 |* \; Z* Q/ C
" u% N |3 l& y6 Q1 k% j1 o) n J
: t6 {9 D8 c# k" u k, V memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ ~2 |" O) S6 q v
2 A0 I9 T0 q) F7 u server->upp_channel_a_recv = true;//
2 o" j$ T4 U6 A: @2 i server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
$ G8 j4 Z/ J. [' F& _8 s server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
5 g- l6 ?3 a! j! ^: v2 k: R% a' b server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
; A' V4 \5 k# X5 ~- Q server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" u9 ?9 k1 }/ Q8 ]
( S' T2 o X; ? v" j% k
upp_error_count = 0;! j! A. I% B; I2 n9 C! Y
upp_dmai_int_cut = 0;8 R+ e6 I6 e! Z2 K% s0 c) Y
) l% ]; A7 y7 e+ I3 E( C
// fill in data
) F R+ e* B6 {3 [, @% q/ |4 ]: D uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 {& x4 R% H; V, m server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");; n. n0 y# Q. I; g
}5 @$ Q7 X; J4 i2 K7 L2 h. l# Q
}
4 Y+ P$ [' w; Z' | else{
0 d6 K8 M4 Z1 h& { if (upp_dmai_int_cut > 0){# [+ x1 ~- @8 ]2 o1 k. f# F3 z
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
# L4 K; K* f( E Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);; w5 a6 y1 P2 \1 K `- ~
2 s3 V% X6 \+ I9 d3 ^
0 Y2 \( M( E! d3 R% Q, L //copy data to upp_recv_list_busy
% t5 j6 p& j/ T% p memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) \- q. [: H/ P
2 H/ d3 [1 X/ t! a' ] //6 Y2 s. q# [& |( K7 F9 L' m; }
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ n. A0 z) y+ ~% h# A
+ Y* v1 J2 x2 c4 G+ _1 s U( L //: \ p1 W* R7 R
server->upp_channel_a_recv = false;//% ]2 P* b2 X8 R! N3 ^& u
/ x! q2 ?( o% z* o' p7 f1 i
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 ]. x1 |" O3 \7 L }1 S! K1 v, D, v
}
4 X* S" w1 s/ o1 R9 a: i9 q* Y0 M. E0 _# [$ O* ~% b9 l: |
$ U* R! b4 {3 x: Z
return true;& F6 k6 I& o. Y7 c
}& j* w3 }% V/ H R% m5 F, C
2 n& E& i7 ?0 s2 s1 t3 {8 E* K
static bool server_upp_data_send(Server *server)1 R: j& [- ~3 Y" _, i
{
# |, s( R3 B- f5 [* j if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 c5 ~' [; X% U; s DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);% }- O" w, j' e& {5 Y
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 N; j o" I4 b R- r; @# Q4 C* O
char tmp[128] ={0};
6 {' [5 H( w6 J) ]) O4 B% v
* j4 \% Y% ]0 y6 d5 L% W server_msg_send(server, APP_CMD_LOG, "upp send: start");! ^$ D6 _! z; d# Y$ B
print_log(server, data, 64);
* Q3 G5 \# _0 |8 M( |1 S# C g) u [, e8 k1 Y5 R
//
1 i; F* u/ J1 I. N/ \: Q( j memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
* @. [- u8 g3 y2 h) q memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 b1 K4 f9 [: r2 b, T, f. M$ H5 D
print_log(server, upp_buffer_b, 64);( g7 j+ L0 E- ` ^9 f, [
& w* d: q w5 W; E$ ]- d; m server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
" R1 J1 H1 e# @, H: l A server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; & H( q6 M1 K E6 ], |2 m) b* N# e
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 d9 ~3 \/ ^) ~( I' a8 Z) D
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% U7 l9 t9 `' q
3 u! e9 d; W+ S* K! }) Y1 Q3 k% a memset(tmp, 0, sizeof(tmp));
. t$ S1 T" J4 D* v sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 ?& s$ U5 {; |8 }' W8 X
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' R, |" [2 `3 T+ W$ J; }9 m# G server_msg_send(server, APP_CMD_LOG, tmp);
* ~' I& |3 o" E7 k/ |: G
0 k+ r7 g! N; |4 A9 R- F upp_error_count = 0;1 E' h; S- Z- O& ?) ^6 g
upp_dmaq_int_cut = 0;
9 Q! u1 ^+ y6 G" x5 c // fill in data . C% h3 i$ L4 h. X6 Z
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ Y% X3 c) x. G% w. {' ? server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
: A- S1 |/ t' [2 l
' F. N. g9 O* L: N& a. M8 H // wait send success. Q' e& g o# p* S
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 0 h. q& ]: D7 O, V
9 w/ w' }- Z7 L7 c- i$ d // make data node in free list
2 C7 b2 h5 _5 M! o3 p/ g ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% v& v/ y, p& A) g' b
server_msg_send(server, APP_CMD_LOG, "upp send: success");2 i* [5 i. _4 D/ v% U0 f2 v3 b
}
% @8 K' d" ]7 y& `/ e2 I' w return true;
# Z7 @4 a8 }3 Z- | l a8 S/ l}
U/ n6 L0 R! u6 _, s u( o
& M1 w3 B% Q: M- K3 d' y% F& Y- ^( {2 _2 U0 l1 r
- v8 \2 F) K0 @, \) I8 _! [& |' K) R9 e4 d
% g6 M W8 ?5 @6 P/ p |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|