|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - L0 e$ k: H4 P
4 R) H6 F7 J5 t' Z- Z9 E6 D% D
问题描述:: |0 {; G: n! h% ]( b
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:: I) a/ M u& R6 }9 q( {
4 ?) `( x" ^% x
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 e6 C8 ?& G% t# C+ l+ A5 [; L
" {% @4 B$ c1 c& H测试结果如下:
9 p2 I7 f- }0 j, g3 P' K/ W/ ^138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# M5 N9 B- W6 k2 ^$ I7 i. Z0 d( v6 [: H% ~6 X
( s: C8 k" R4 T备注:
0 ^) K1 O& S. c1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 R1 I0 z: u" V
2、相关代码如下:2 f, K8 U& H; b9 u
//UPP DMA缓冲大小512字节
0 A. N% {0 q# x, G% [$ I' E#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍3 f7 q1 Q( g7 r& y1 ~" Y% ?
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
8 b: K3 h# a% {6 P1 c#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 [5 d2 e9 s! I! H; k7 j9 U: {6 \
- X9 L, j) C# }5 L. R
; z" ?- U0 O+ E//upp接收、发送buffer+ G9 Q. L& c/ r+ N: S+ N9 q1 f( }
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 D- w5 r4 Z ~$ E$ {. ^/ o#pragma DATA_ALIGN(upp_buffer_b, 8)
/ ?6 @ r- K' e! @! W+ t* P: s4 K2 C, z7 t
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 R5 P2 ~# ~1 ^8 t! d+ R' `' |# r6 r7 z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
- f4 N2 b5 `- y1 b9 z! B' Q1 } T( U1 J/ A
- l1 |/ ~8 I" Q/ w, j {5 Ostatic bool server_upp_data_recv(Server *server)
5 A$ |+ ?. y8 Z{+ W' [3 b' @6 i, J
if(server->upp_channel_a_recv == false) {
! M, f5 C& v, W' D6 C3 R server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: @0 _: ^/ f- n$ v) ?# u if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% e) v0 }' {6 L/ s6 n; Q% D$ h server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
% v% W4 L3 ^5 K% l1 q; n8 p8 Y9 V9 t0 S* o# K9 R
3 L8 X6 s4 w* D8 g7 y( K
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); ^! a! E6 M( Y/ P K
; g' M9 F) h2 O' X: A/ [" m server->upp_channel_a_recv = true;//0 h! a7 {+ N2 Y' Q% i; G# r
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
?9 m+ j% f# E9 T5 e8 v server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
6 F0 b8 W- U' R server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT; x; }1 I' g1 j' j) |( G
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 p, @5 c+ R5 k4 s1 A0 d/ ]7 z
, \. ]) ]6 ~5 d/ D& U upp_error_count = 0;
k, R& a) k1 W7 `8 c2 z2 K upp_dmai_int_cut = 0;
! j5 o6 Z1 l, t) X
3 H) q' x& J: A // fill in data " I: C8 y5 f( d+ R7 ?4 f0 L
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
- J+ w7 p& e9 s' C$ g7 J3 L server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
" [/ a* v) O) J; d& G* W. j }
* Y! n% q4 h: O. W" A! s# h1 J }
5 L3 Y+ c8 }' }* V# h) S' \' X6 H else{0 G4 ^* k0 X5 G" G. H
if (upp_dmai_int_cut > 0){
. f9 f" h0 e: P/ j% V DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);1 J* b: D( Q4 k
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer); u! p; B- s0 [& Z B9 j4 ?
# ]9 c4 K7 P" g! X1 g+ n) U5 f) k
. K" H7 G0 n( z' N# @) N
//copy data to upp_recv_list_busy. j8 U% G5 h4 A6 M& Q+ a
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
9 j+ @1 T2 i7 p% V% t- m; m6 r; S% x4 t' a( W; C0 D) f
//; b0 M' y0 b d
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 M4 w9 V# G- H/ V# Q4 B
8 I$ K9 f2 Q. w //
) F! n) _7 F) q2 Y* M3 C2 T server->upp_channel_a_recv = false;//3 g9 A) p8 J+ @( _
6 [2 i3 @( W- H0 _3 k& s/ _8 K
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
! a' t: a, U" \" y }
7 n8 L! V* k! ~; ?0 i/ b0 ] }* l9 {: v* i; ?5 f0 j
; ?8 D$ p6 F- O9 V
; N# y; \$ I8 o' Q3 A return true;
5 }% _3 b4 c3 Q4 }0 T4 s6 R$ T}, d0 R# { I& [$ T* L) B
. h$ q# X) T* t4 l/ w K1 d4 istatic bool server_upp_data_send(Server *server)
( R& \+ K9 B# W! b( [{: }% H2 d: n4 t& s& T+ R2 a. U
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 w4 @0 p" A! g. W8 f& \( J) g H DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 w. r) F# r$ ~5 B6 m2 ~
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 i J' s0 {. h5 b char tmp[128] ={0};
|2 U/ A& S- a+ j0 g( D+ l/ l$ l3 I# u4 Y
server_msg_send(server, APP_CMD_LOG, "upp send: start");; B' u# Z, {, c. z5 d0 z
print_log(server, data, 64);5 O; F% j H5 f; m
2 o4 ]1 D0 X8 M8 }. ]+ k
//* \: b3 l7 Z( E
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 _/ l4 h1 b! f2 g; I. ^# R% }
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ }5 Q( i$ ]. x
print_log(server, upp_buffer_b, 64);
# [2 d7 J6 [6 j% d H
* H- w, o% ~& I& w1 M% d. z) @ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);, i- b5 v) u4 I% m+ g0 g" o( Z
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! V9 ~6 r% V( C
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
+ Q9 `2 E3 r: U; n, \# Y" E1 l; F; j& _ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* G% Y# l) V% f q) u
1 f; {1 D. F% k- l" N memset(tmp, 0, sizeof(tmp));: ~ W$ m/ r0 L9 j& L q
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
4 d* p3 x9 `7 g' J ? sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! b- p4 k% |+ Q
server_msg_send(server, APP_CMD_LOG, tmp);2 y! z. e% p5 J! y U5 Z5 `$ i' u
4 @- l" O( I7 d2 @5 V3 k
upp_error_count = 0;6 |4 z# L/ V, }+ p1 I4 [( `
upp_dmaq_int_cut = 0; D q3 R0 \3 O1 T3 P
// fill in data
8 c- g: k, A: N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# @- d1 f0 L2 A: D$ v7 w) S' D server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( K W6 ~% d$ F7 I9 z; g+ ~ S2 V$ \ o) S* M1 B: G8 E8 b
// wait send success
. S7 c. ~1 H/ @# P/ s. u) t while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& x) a" q2 F7 B; d0 W. `+ @* S2 j
- L9 ^+ R4 t3 ^5 S. _ // make data node in free list
& ?5 r# j- {' ?. \ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( C5 `3 n) O# `- A0 p server_msg_send(server, APP_CMD_LOG, "upp send: success");
& G4 n v# K' B* }9 i5 T( s4 s }! H6 B# W' f! _$ ?" K) W; n
return true; U5 s+ h5 j* x4 f" J
}( _% M% i6 `% n1 V G
0 v3 x p# `, m! f' |) j6 F
. h: T; L7 _+ ?
; j: W0 D1 T: z! r7 ^7 `
$ Z4 T$ G$ K# w1 z
$ }! K8 ^* y3 i7 g7 n. ], { |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|