|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' v0 Q7 u7 B2 {7 A& d" U3 c6 N7 C S
$ N* G0 D; e# S0 W) {4 K U k8 R+ u
问题描述:
* m+ ~. ^, x; s. o: ^在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, r, v# o' j, e" w* y( }, L8 U# [- b2 \8 q+ \3 j* L; H6 q
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。4 m+ J* d8 y% \- i* p% N
8 r& ~) ~( X$ a. x. T
测试结果如下:0 C& L; H5 Q/ r6 T$ _: U5 P
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 w! k c$ U7 o2 Q, z' t. }
9 D( e4 [% a! {: U
1 p4 k6 D9 W( @7 J- _ a
备注:
- _# K- N+ F6 c9 w+ C! S! L# i1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; c7 j5 _" h3 Z- f, a2、相关代码如下:+ x0 z1 }" A2 x6 t5 P- w8 D- @
//UPP DMA缓冲大小512字节
; h6 E- H4 f+ Z6 X3 r8 p1 w#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 s, A. _/ V: |2 P0 w2 `* E2 s
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ S8 _: R; J# R' N9 Y4 Z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 B2 g9 ~% p7 ^$ q
* R8 Y' g5 j/ q- V
+ p6 q6 P% L9 K# Y: P6 D s7 O( U//upp接收、发送buffer
+ r9 @, f$ H' g+ I) A#pragma DATA_ALIGN(upp_buffer_a, 8)
+ M3 V( G" E/ S9 @. a#pragma DATA_ALIGN(upp_buffer_b, 8)
3 X% j+ c2 L; n0 E- \ z5 [7 N& k; z) z) y' j6 F ~
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" g0 m6 F5 I7 y+ Tunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: N4 ?: Z$ R G) \* J0 J) C( n$ v
8 |" z3 `, l; U
9 i% i5 U; H' ~; O+ s1 I' S1 T
static bool server_upp_data_recv(Server *server) 3 e/ c3 x* L; Q, b( F
{
, l0 I+ n' R- I) r if(server->upp_channel_a_recv == false) {
8 f s; ^0 [( `8 `0 h7 X server_msg_send(server, APP_CMD_LOG, "upp recv: start"); Q4 _0 r8 a. o6 f$ h# x6 b3 k- B
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 `. N! f4 a& j, g+ z+ ` }
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ [+ z3 ^0 @, ~. |$ j
; r6 x# }* I* L* o
+ v; m# _; ?4 G7 N8 I) \ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 y3 R7 H' U0 {. ]6 O, K' w1 X5 N3 b3 c# p
server->upp_channel_a_recv = true;//
, {$ i& P( J6 K$ @ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
9 \, ?) ?% H/ @ E& U server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;1 `+ z Z3 V( e4 E% P, g
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
7 n0 ]% [ D) C2 o; U server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: L1 K) g9 `/ c1 ?& e# R4 G/ E4 f
- P5 f3 l5 ]+ B- @
upp_error_count = 0;
( U' y, `$ J: S9 e+ i$ i; g4 o: n0 \ upp_dmai_int_cut = 0;
6 e; {' q& {$ t2 M. f
: G+ K1 g( p! s6 M3 s // fill in data
& \# Z0 d1 y& f L1 I) H uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. d2 _, d: [, P- C
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 S" {6 n' o& t( _5 s1 }9 `" b6 e9 o }7 _1 v1 v8 o5 }8 _1 N$ U Q$ N* m
}
# ^& R- O- g! u# y8 S) f else{4 U* s" [! w6 E+ k
if (upp_dmai_int_cut > 0){5 C z7 c4 [ K9 y# f: V5 T
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 b9 @: T- h; D' ^' x* U, g Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
, ~$ x l2 v2 F! s; l/ F' e( C7 U4 |9 x# W% B' b; } |0 U# ^8 w
: l7 w, t8 D: o9 ? Q9 P: r! g //copy data to upp_recv_list_busy9 H0 t4 R, ~* P* d# _4 P( f K! I
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ O+ Z& ~1 l# z' i4 `6 Q8 R' Y% v' u9 P1 k! u
//% y4 M Q; ~& p+ x
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 x% P: @+ Y. J3 |+ h
% ^) v8 Q0 {0 M [0 R7 o //' H* S" W! S+ _: L5 L
server->upp_channel_a_recv = false;//
$ E! p( ^4 f. R8 ^( O. h1 N z6 B+ e+ ^2 f; x$ }0 { T
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* T4 U4 r" d/ e% w; r& ^. |) a3 ~ y }$ ~$ A8 \8 Q3 V9 |& F
}3 v7 T, ~+ A e$ {) c1 o6 r0 V4 G
5 c' U# p2 H$ N0 a/ k7 z7 n+ C/ j! i$ }) M4 p8 Y$ b* m
return true;
5 ?: ] @+ e) _. b0 p p+ b}/ Y4 G. }5 q4 l( G
% g2 b/ Y2 P' c: i6 y3 h. K1 U& Lstatic bool server_upp_data_send(Server *server)
6 g# j* l. F( U# `& v; E+ E{. N4 I" z) O4 b! M
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
E; S' j$ M1 A x0 C DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);" }+ ~4 _" N) k7 p( q w
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);, x$ x9 G# j$ ` _! v* c2 s' q
char tmp[128] ={0};
. q5 o9 _$ l* c# C3 }. U& _7 m# }6 c- y" `9 d! Q1 c# N* r# P
server_msg_send(server, APP_CMD_LOG, "upp send: start");/ @* a2 D ?" H$ g. i+ s
print_log(server, data, 64);
t1 z3 k* r/ X/ H5 z% ]7 T5 u; K4 \$ _: v( T
//
) {& ~7 d) N3 I$ a' \8 L! S memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, Y* B9 P* m! o% J" g9 h3 x
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 o- N Y( I+ _ print_log(server, upp_buffer_b, 64);7 g' q, x+ ^. u% j
: n9 U5 v8 i. D- i( L( U D
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);7 W, }- j$ G/ Z% K# ^
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ' Z/ U* ^1 F2 \% C4 T) r3 Y
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;- `, W) P. X& g, N. Q
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; A, _. N* D6 T# V
1 a; r G o; _4 w
memset(tmp, 0, sizeof(tmp));+ v" P9 |9 m8 T+ r7 b
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 y+ c# ^ W$ ~5 `: a9 O1 ?1 w# z sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
4 Y& I' B: z0 U" [0 q server_msg_send(server, APP_CMD_LOG, tmp);* z1 W( H% e* h2 U4 h
4 T% T" R& B, T2 }8 U
upp_error_count = 0; g( ^) F& j2 b, a2 V- H, j5 T
upp_dmaq_int_cut = 0;3 Q' a5 ^0 R. e7 n9 V3 n
// fill in data
4 w! V' \' k Y" o uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); p4 d1 K7 ^ ^5 Z3 Y$ B
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
, \: `3 m5 S, P% V% _' u& M1 ` Z' k" y" ~! j8 ]3 z k7 d
// wait send success
( u6 j: S1 b4 l l7 e* S" ?# h1 N while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
2 _+ d' h2 q! M. u
$ z5 G. v9 o5 n* E/ p" a G // make data node in free list ( J/ l1 X$ z- Z& L+ ?! e
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. U4 ?% }; G( E5 E" ?7 w server_msg_send(server, APP_CMD_LOG, "upp send: success");2 R6 x t& R3 v: Q8 E F
}/ Z# w+ K1 T; A3 w/ T2 }: Z8 t% t
return true;
+ ^, m6 Y+ f3 }}1 k1 l: C1 W) S0 _
8 Z) _& V& G1 J
0 M: q+ E* Z7 l) ]- ^% ^! j0 z# E, Q
; p t6 G+ J" `, w# J1 @' v7 C- d8 F
. b% Z9 j5 A) S! g- q* n2 ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|