|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : Z, g/ s7 U* d9 H8 _2 H
# P& A/ d; X7 l问题描述:
+ z) R6 S( J( m( o在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) K) u- W' q/ m7 }3 I; v* t
. ?! f& u; N# X9 e& ]4 u, c
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* Z. E% |& U1 g: u3 K7 I2 k
- u9 \$ `- @" S" v测试结果如下:7 S' g& f1 n5 |
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
r/ O* p& L: C' a9 J
$ }9 u i" L# f t- d5 m$ z
; o a9 ]1 Z9 H4 R0 Q备注:
; @0 ~% |0 Y ?3 b1 O3 B1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 g# l1 J# c6 ?
2、相关代码如下:
5 V& T" n5 H3 n# ^//UPP DMA缓冲大小512字节
# }$ X8 J6 {' E; Y#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 A- B4 v8 L" i4 J: y' U! d% G" l#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT- n+ g& @$ q- W8 A6 n9 `" h: S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 M; c6 I4 B- ^( {! F
1 v y* S0 b% e
. |* W( o. ]3 D2 D7 D" u9 f2 ^; W1 m, D//upp接收、发送buffer
8 G5 _2 o1 a: {" u" ^2 |#pragma DATA_ALIGN(upp_buffer_a, 8)
; `+ e# G2 T+ l- t2 Q7 O#pragma DATA_ALIGN(upp_buffer_b, 8)
0 j) \' D2 @+ Y2 p8 w3 L. p
' G* ^$ ^* Q$ h: z9 f' z i+ Xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 X" c4 I& k4 a' P
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" \/ M: v$ f- k: E+ x- S/ Z
4 M) ]( b+ Q0 ~, c2 U% [! j
' h) Q8 u. o# O' x! }! ?
static bool server_upp_data_recv(Server *server)
+ m; {- T L( i9 f! q* i{7 K/ I8 {/ Q5 S) Q" l6 U; K
if(server->upp_channel_a_recv == false) {
- G$ ^) U0 E5 G2 }9 r/ L4 n server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# E3 }4 j; h2 J# v if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
' Y, ?, Q0 e& m; O) k5 Q( g# k server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 U2 w& w0 W0 ~2 w. H1 V- d
% t5 @( _# h: n) O
5 S# B# V# w4 G8 N$ f memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* W0 k \4 \" S" e# r6 u
( k/ d0 t6 q% }- P- W
server->upp_channel_a_recv = true;//
7 j# \& ]( o# c: t9 R server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);% N1 s1 b% B3 D/ r% u5 J H
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;9 x m! ^; F( h% {7 q/ V( ]
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
6 G2 y; L' `2 |9 H! I1 o server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; S# F) ~% E; Q$ i% j: r; v' _) z: a6 |& C1 B
upp_error_count = 0;
! c- N) x- e* t" L1 \3 e- A upp_dmai_int_cut = 0;
2 }5 [6 t- b) c4 x k# x
! V7 R# \) N' Z: q+ p3 y // fill in data ) R/ y! ] ^- T
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 l! d( c V7 j+ C server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. B9 Q. H& |6 ]3 m. l( L }
& V4 N* p1 _: ]& _) E* v4 q \ }' z; P5 d0 P: l
else{
; |3 @+ _, O5 a" a7 i if (upp_dmai_int_cut > 0){
9 |# G# f- x& W' Z( q3 e6 w# P DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
7 {9 r1 L3 C* J3 C Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 S3 o3 _8 U6 r( Y) \
+ C0 t* C. b- V. f% B0 L0 O
2 ?- S$ k) l: b" C4 o) @2 D3 z
//copy data to upp_recv_list_busy# h+ {9 b5 c. U& s. V
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
' k- M! e* T8 ^9 @/ k) C% _; G) [) u G5 X
//
0 n: D; R' P; S0 V5 u ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; E' C7 X3 r; H. }5 E0 X1 B9 g" s ?
5 D8 E1 G& a. b1 v
// }7 F5 _' e2 V6 `" G
server->upp_channel_a_recv = false;//
4 V. M6 d2 M" w* f) N: u+ O! S1 G; l6 s3 _
server_msg_send(server, APP_CMD_LOG, "upp recv: success");2 Q+ j- y" }9 t8 ?
}. G" W7 i2 V8 m7 W8 r3 P" c
}
1 ?( r" Y3 L B( \0 B
# ^) K- D: e$ l/ g9 M7 y
+ \0 R/ ^& n) b1 z7 M- s4 z% W return true;- ]" u4 G! O' j8 t- j' u$ V7 c. r, Q! B
}
' I3 K( E* o* J7 r- }2 l! I. q3 X1 q# d( K0 m4 [
static bool server_upp_data_send(Server *server)6 X: T4 \: I$ @
{
( u8 b1 o" A+ m) e5 n if(ListMP_empty(server->upp_send_list_busy) == FALSE){. C8 A2 g! @% e
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
C$ P( Z3 }0 ]+ z unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ e$ \' j8 P2 U" @
char tmp[128] ={0};
+ t) [& f. H" D b W
4 O( t! U/ L+ Y2 w! c G server_msg_send(server, APP_CMD_LOG, "upp send: start");
# A `: `+ r9 j print_log(server, data, 64);
: O% L' k$ a* o! k- Y; M' {& q9 l; _' _4 p6 k+ g
//
) ^- n! f) s1 L: m memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! \3 e! N6 C: g, m# ^& L- w: C memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 d0 q7 _. J! ?7 L3 A+ E2 m# e
print_log(server, upp_buffer_b, 64);7 s& _9 a1 ], g0 I# g
( R: c6 B. z1 P' i4 D( z: _
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);/ A4 B6 y1 p: v6 z6 f8 h
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
: Q3 D& B1 ^ _9 Z! w& Q! c, P4 ? server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;9 U8 x# @( v6 u3 X$ H9 C
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& i1 m* I0 y: F' z! Z
7 }) e8 b' C3 r' g4 L; b, [ memset(tmp, 0, sizeof(tmp));- b" H2 O! G' X( t
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) Y. L) Z& O/ @$ b' ^% A# i) i sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);* \+ h: S9 d) d/ U0 o
server_msg_send(server, APP_CMD_LOG, tmp);
. b' x; H* v+ @3 ^# L2 H+ Y" f0 t* y2 q% i! J' s% B6 a. }5 l4 ]
upp_error_count = 0;
, ~0 j' i3 {! ~9 e! v! s- j upp_dmaq_int_cut = 0;% e0 I& f7 x! v. E6 v7 K0 C
// fill in data
# W4 Z* ?1 h/ i( _3 V& S) c uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); : f& y) P" H( |; |; R4 K
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ `# B4 j7 T" o
, b# m. A! [- e# k8 H // wait send success! V# {) t$ T4 ^
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); & s- e, B: V! c+ [1 I
& ]0 k7 x% u/ i+ p // make data node in free list ; u! n# L+ y, m
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 [; E) D7 b* X- d- K" q
server_msg_send(server, APP_CMD_LOG, "upp send: success");
! Z. \( E; T& e9 p+ W. y/ I }
4 X' @! [6 t/ L8 n0 ~; ?) k1 K return true;
' A- b0 U- D0 B* b9 t6 F8 `8 T}, z1 y" c0 G4 h- @% J) n+ _
b1 k5 n2 [9 o3 I
0 W/ {( H% T1 c! i: J
& \9 U" [" h- O; |* s" C0 Q5 d4 o7 ^ P) N/ Y" ~! v
! ?8 @, ?% A9 J! g2 ?# B6 E
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|