|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
6 k4 p1 l0 _2 n1 ^, D$ T3 ^3 [. r) Z. s
问题描述:% y' S) b, M" c/ m/ V; l m8 k8 M
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
8 _) Y2 I6 G6 z. ~+ O$ |# m
, U) E+ o7 f& `' `1 Z D# O9 P图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" H( F4 b6 X4 x4 f3 J
1 }; g" O4 N' |& ^3 c/ n0 O @
测试结果如下:- T& c y2 `& F7 M% b
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 \# J- n9 S# s' { u3 D6 S6 K3 \) n9 ~. H
+ l- F2 T/ ?1 U0 X( t" v
备注:' e8 G4 C h3 R+ j" L" T: F
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?; x* N1 V* ]$ a: b! o5 v" V7 f
2、相关代码如下:
0 _( [: d$ v3 j) a- R//UPP DMA缓冲大小512字节0 A$ l. r" E! K+ i0 v& N
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
' L' r/ Y# n$ d- ]2 B- l$ F; V#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
9 I* F) y* k# m. A#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 G% Q$ C" @5 c# f4 x+ Q5 m9 u' C/ ^, R
# r7 K/ b1 O4 B, O//upp接收、发送buffer! G9 h7 d. L7 l% s4 R* S4 A
#pragma DATA_ALIGN(upp_buffer_a, 8)) t2 Z- A3 ^; F8 d( l
#pragma DATA_ALIGN(upp_buffer_b, 8), F- J* Z- Q% X7 |4 j
( {" w% b/ w. {) G, e
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 M+ R5 N; C* T/ ?3 m6 O+ ]# L
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 Z% k. N8 m. i/ L! O
, _4 E. f3 `. d& l7 U p9 r. t
5 ?1 @1 z' P/ g; N' n$ C
static bool server_upp_data_recv(Server *server) . H) }6 y3 O/ x7 N
{1 Q# _4 y- M7 ?- O
if(server->upp_channel_a_recv == false) {
* H* S9 M9 l- K5 X0 O- @' ~+ w server_msg_send(server, APP_CMD_LOG, "upp recv: start");3 m" [. g& Y& B9 ]
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 o" D8 B# m1 w0 r! j$ d. I7 l server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 M$ n- ^: x1 Q, c
9 i- h& Z8 J' X' p' t+ r7 v
5 ^- i2 ^& C; a* W6 P5 i
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
. S; V* k! i4 x4 C, K2 v* M& x- o- @
server->upp_channel_a_recv = true;//3 R. s% g/ M& l3 R
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);5 h5 b8 p! L3 S6 m! O0 ]
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;; d9 ~3 u" _' B) |" E" x. ~
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ p( {" u1 M" A, i' V) i server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
- J1 @' V e/ d& e, C) C# d7 S3 q: q0 \2 w0 l3 v5 q
upp_error_count = 0;4 A6 q5 o4 ^: x' c* _
upp_dmai_int_cut = 0;# q. @# x1 c% Z1 r- ^
* J5 c8 g" y' c7 m1 w; h: c1 n // fill in data
. L/ [% q3 V9 |' f3 _ d, m uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);8 f3 E& x* b p, C6 F6 e
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& e" L6 W( L! _& z: }# z" r }+ D. c! i( g" i. Q# [' z+ q9 U
}) n+ D! ^) N: ^* N9 ]* G
else{& h" z+ ]1 z4 z/ H5 @
if (upp_dmai_int_cut > 0){: g. K% `$ H& }5 \) M0 o" g
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);! C+ S: m* b! D$ s1 X2 F
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 y/ W! n0 t# m. c" C2 W
# c! I5 H+ p; n+ h
: U" _4 s& W" O- l' T //copy data to upp_recv_list_busy$ ^+ s j7 x+ {) w- ]. g/ T
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
7 }. H: e; k( k- A2 J: f; s
3 T+ b7 D6 g9 @; ]/ m3 o //! G; }1 a. p) P8 Q5 S/ o# p
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 |/ w D( q; P u2 r! ~
+ _6 n/ x& Y. W" j" E5 Z1 `
//$ ^5 m) N( U/ h# u% [: W' @/ {
server->upp_channel_a_recv = false;//) s4 ~( P/ B, g0 t$ W) C2 K
, J2 I$ n* F0 _2 S) ^ server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 y8 |) u8 `( j$ [1 d$ o1 h
}
4 q9 N, i K3 a0 i- C$ m2 m( N }( r8 O. p/ x9 {6 g7 e( B
2 X% e x$ j/ h5 `
/ d7 W/ C3 @. i2 y- E# h- j+ l+ O return true; L/ ~1 G0 V& V8 {
}
/ _$ P8 C! ~% ^* d) k( L2 u
. L# |/ U. W( L0 S$ Xstatic bool server_upp_data_send(Server *server)
. I* ~+ G/ c. _{% L9 e, z6 i# `7 X6 @9 r
if(ListMP_empty(server->upp_send_list_busy) == FALSE){* s% W1 b8 m( {+ M% C: ^
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; q- v4 Q/ C* z! H0 J unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ v8 }" l. E4 r' v# V char tmp[128] ={0};
; O1 j7 S, K7 ?% ^/ K) f% T9 A$ }6 e3 a% ^+ }4 K7 [
server_msg_send(server, APP_CMD_LOG, "upp send: start");4 E3 E ^$ ^* o
print_log(server, data, 64);2 B- W" S/ @0 t# A) v# Z& X5 E
6 ? r( R) J: t: u //5 A& w/ u5 U- ^" T1 J0 I$ Z7 C
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);5 P/ l8 I7 e F; M. [$ x2 X
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 v- f+ k, i: A/ V* S4 O+ V) i print_log(server, upp_buffer_b, 64);
8 S( j& r8 h* _4 l. _/ Z; W5 a# u# p; o
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);0 o4 Z h; _% B3 Y0 x) X
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 6 w. b$ o; @4 ? E. B5 U3 _. Y) B
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
' S i7 p9 u8 d/ U. [ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 t/ q3 o9 O. d5 {, u+ o# F" A1 `' q1 A. Z0 b( I0 M
memset(tmp, 0, sizeof(tmp));0 I. r& @$ b; `- D: @; n
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 2 W3 n0 t7 y) T3 y6 S
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 F" j6 I, l4 c# i3 r
server_msg_send(server, APP_CMD_LOG, tmp);
) M# q! Q/ Z9 r4 |8 E
; s3 z2 D( F- L4 |) O; j4 y8 v upp_error_count = 0;! Q9 M( o3 {* Q9 ~% @0 l
upp_dmaq_int_cut = 0;
! k- u2 M. m8 i2 x2 t // fill in data
- {6 ?& {6 z$ T0 j. T7 m; ?" I uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 | b+ K( \% [/ R6 V0 h. Z2 x
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) [" Q% v. ^9 ^- w7 B- F4 O: Q, B7 j1 s& ]6 L% }
// wait send success4 P3 Q9 R* B K9 p$ I
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
! s- {; ^$ l* P7 c% W; w V) F G6 Z
// make data node in free list
& {7 G2 `2 O) B* q" g% ` ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);0 l! N3 I i& p6 I/ V
server_msg_send(server, APP_CMD_LOG, "upp send: success");$ N0 s, u- O1 F2 d/ n C" g; E
}
2 F5 S1 n* @/ U return true;
% j0 A; o' e9 e3 Y1 Y7 d( g# a}: d; C( [9 Y* n) Z4 k- Q1 I
* X8 u" H; P& V0 A8 @/ S2 |
5 d2 u! P6 t7 o
* M$ V& A5 o' w0 j
8 b- J" f3 ^! B9 F( W' P* K! G; N9 \" q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|