|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' l3 `0 f6 W, R$ G4 {
, ^: z. c3 D3 ~# H: A$ b问题描述:, x! k% M& T* r/ Z4 M. s$ ~
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:# R2 v. s! K q! I |: E( N+ B
' P0 m" O7 m" ]
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, [2 H; D1 P. p9 n- e3 O
+ ]/ y) K2 c( a0 E+ n# l: \2 R9 L1 T测试结果如下:5 O; x; V3 H3 n9 Q& `, h2 J
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
8 Z7 A, ? e R
' f$ h. t. l2 M7 R V% D, C
+ L, K" S6 b9 I备注:" M; F H4 w7 ]- Q3 C
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# I# n* e/ `2 y: }2 k' A$ P& e2、相关代码如下:! q R3 D* l, R/ C, Q7 t4 h
//UPP DMA缓冲大小512字节
' I. J) d4 `! F8 X#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 K/ q1 [6 u+ R; I#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ ~. C; O* z8 I& \- M2 Y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
$ j+ y- j" d! [3 A0 q) v% ?" c! m3 A6 Y2 w
/ |2 Z+ q' I% L; H
//upp接收、发送buffer j* U3 d/ \" ~. G3 D* O6 o/ d
#pragma DATA_ALIGN(upp_buffer_a, 8)/ ]3 C* \; m9 G7 T' f3 [
#pragma DATA_ALIGN(upp_buffer_b, 8)
2 I/ k* `) y1 [2 o* B4 W' a( ~0 a) W, r7 N# i. X
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];9 T* ]$ c) L# @+ V: f4 L$ Z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
9 U8 o/ ]( t* l' E6 N! {* F/ Q' s+ S4 y; O: @; c- U
, n( N% w; Z( [4 V
static bool server_upp_data_recv(Server *server)
. j& \6 {1 i; e) f' _7 b{
3 x9 b' b: j G; p9 R* F if(server->upp_channel_a_recv == false) {
5 a+ b8 Q+ O1 z `$ w5 ? server_msg_send(server, APP_CMD_LOG, "upp recv: start");' \9 M& l1 |$ n* {- A! r3 @2 y
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
y# g7 w6 w/ F! z4 n server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 U, M* @+ `2 I; v
& z; g, q7 M a9 p- V* `# Z) A
$ L$ R1 y7 v2 ?) O) o memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 c l5 Y" {7 {8 }$ b2 [
" P4 w$ |- k4 f4 d* |/ F* F# h server->upp_channel_a_recv = true;//! O8 v& D& ^) q: i
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);+ _+ b% O2 @! b. B
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;; G" n2 h' N2 t# C' F& O1 n7 U X
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
1 y3 `# I7 ?: C. Q server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
& G6 \; a; f% u0 e% @& \: C; s3 z, l6 V1 `0 t. |& G% ]! `
upp_error_count = 0;$ t* u+ l4 R+ A; f: g8 ]
upp_dmai_int_cut = 0;# ~: ?+ {' ^9 C1 Y
, y4 _# X/ u0 c& z3 {# S# `4 A9 L
// fill in data
' x! y9 z# C7 e- } uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
& G/ U( F7 X# J4 w" S# b server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");$ y) w; @* s* N$ Z3 F
}
5 C3 p% j1 o% u( t }
# i' M$ M* z( @/ i; H else{
- J5 m9 q1 r5 J0 |7 L) ~ if (upp_dmai_int_cut > 0){
( f; x x1 e0 k8 j4 `0 R DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);# [& x' J# [: L5 V; ]1 g
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- d4 }2 X& \# v
. q2 R* g' E6 E( K1 c+ C# \. D2 H; z1 T; l1 {2 T
//copy data to upp_recv_list_busy( O9 h6 v3 r) k _8 e* ?4 E) F
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);0 e- C' @" @' w: i3 e* F# i9 M0 b3 z7 V+ d
' B+ l" M" D; {: `: M+ K- K+ G% A //
4 S7 E8 I1 W) V ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' Z* U6 v3 Q5 m* q
5 y7 _% t$ ?1 I5 W0 t _5 n //
' @2 Z( N: L _ server->upp_channel_a_recv = false;//
7 k" l) r4 i3 n/ G" |2 ]
7 S: T' H0 U" v server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 U; Q4 o7 Z5 g7 x. d' P. G- B2 a, M }
0 u, A7 X! L! x6 c8 u. N4 J }+ J4 R- _3 D9 x4 d
% j$ z7 M' [, y' ^8 a* f
- R, Y& i7 O- Y$ D return true;
7 J0 v; @% r* V% [}
+ R" }" w; N# e5 V* f, p* u/ O; M# R9 G4 L$ e
static bool server_upp_data_send(Server *server)
( i( x" D% s( U5 T! t. n0 S{; w2 A$ D w+ }. T
if(ListMP_empty(server->upp_send_list_busy) == FALSE){# b, ~8 ]% ^, {3 u6 t% ]
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 M8 x; O# L3 V& l+ R unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);! n" M$ {: h* {9 `' A/ o
char tmp[128] ={0};$ F( K+ ?9 R! A8 @, Z) H. F7 X
( h' k( ]6 w1 I) e! L
server_msg_send(server, APP_CMD_LOG, "upp send: start");! V k% M& }. m& d
print_log(server, data, 64);
5 ^, |- q3 Z: A
9 B. j$ X3 |7 l5 G/ z! q4 w! g; G //) @. E! O2 p& l" P b. I3 D
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE); m7 y/ @; w& ?# p2 z6 k B8 A N" h
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); i- | ^1 [( z) d0 y" }
print_log(server, upp_buffer_b, 64);
) D1 w3 l; ~3 p4 f! ~& @+ G/ m- m( ~! Q
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
9 C9 \6 X! }! Q; Q4 N$ z: C1 f# E/ l server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
; o& c6 ]1 W. D3 h9 z' P* w server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;( L, e& q: N; x$ {( I9 n
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 Q- T1 m$ A1 Y- `; n, q* n
. O, _# J3 a9 `1 E5 j. f8 e memset(tmp, 0, sizeof(tmp));3 j6 i8 z* ?/ n* I
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; b, B* F9 y6 x; a+ V
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" V. }# G) L8 h, S# q server_msg_send(server, APP_CMD_LOG, tmp);
8 W6 \1 {9 I* q/ Q3 `# m/ k; q3 V. C
upp_error_count = 0;
2 r. V `2 U) K- t" A upp_dmaq_int_cut = 0;! ~$ ?# D x4 C9 f
// fill in data . s) L" g/ W: m/ z3 s
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # m2 @6 V3 M' T
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
" G* i- {: ^: b. a2 y* G! s$ u, m; L1 V3 d
// wait send success" s' P6 z- }/ g0 a" S7 S! m9 [+ h
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ; y3 h; h1 {7 `* T9 R6 b
' U2 _" Q& F$ B // make data node in free list
5 X! s7 E4 Y; G* v ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);, _4 g2 p5 u) E8 y3 [
server_msg_send(server, APP_CMD_LOG, "upp send: success");9 W: S0 P$ i9 c% L
}
: c: ]9 d }" S* j" U return true;
9 K# s6 E0 \0 w}5 ]3 e3 L/ p8 `- [6 ~, e; |3 f
2 X" }+ W- p* E N9 B$ k- r6 V* m7 w
, ~1 k4 P9 m: H$ R0 M& f
% B) `' n% i7 e# r( M0 z
" ~& D. L. I- y. l) C- U: _
- z- {6 _; f* z! R' p2 ` t! X, V |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|