|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 i) Q+ F* s+ p: K$ ^$ ?+ G0 v! v+ _# i' c+ G
问题描述:+ z/ ]1 j; x9 l# z0 \+ e
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) O/ O' _" a6 P- @( E9 S& A* o* C7 {7 X- D" c) s9 G) |6 W
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。% t( m4 Y4 \' t7 i4 f& ? h
+ }' L: _' d* [" A# Q
测试结果如下:8 O# v& h; s+ O p. [
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
8 Z0 e/ g$ A* r# _9 c0 |) P
# _6 L- n y, i' @1 ?: ]2 h3 q' V1 M( ?2 |: O7 \
备注:
9 [+ x7 w6 D+ w* l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?$ z) ]0 n7 P5 L
2、相关代码如下:! u: T7 x0 M: S) K q7 c2 N) {
//UPP DMA缓冲大小512字节
9 z( h/ E; r1 X#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 o: g8 H& y- w A# |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT9 Q5 n, i3 i6 ^1 B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% j* P! K" @5 u. C/ L' O& ?) c8 B) m$ _( F
- Y+ V% p) B, X' z k//upp接收、发送buffer' F2 A7 L1 W3 k H0 x
#pragma DATA_ALIGN(upp_buffer_a, 8)" X1 u# [/ c d) s; O+ B* x
#pragma DATA_ALIGN(upp_buffer_b, 8)5 y+ J. ]) ^# ]. F
& G; b; t# x) u4 s6 _unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];' J$ z: U" j( P" S& v6 ?$ D, l& a0 @ }
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# m2 o4 g3 }" P* m5 H
7 h( x5 k$ l0 E4 T* d3 B& a" Z! k- l/ @' V" l8 ^3 U) \
static bool server_upp_data_recv(Server *server) ( w6 u8 J& r3 x5 Y
{
2 R% M2 s, B, k if(server->upp_channel_a_recv == false) {
; [& q; {; K8 f server_msg_send(server, APP_CMD_LOG, "upp recv: start"); G& h9 q" n+ h: K! z4 g' v' P
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {3 Q! L; Q2 f' i7 R# P
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ Z4 O# O) S# Y5 M: p+ j, d- D: Y) C( g p0 x
+ t+ M3 I2 Q% f( d: ] memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);# F2 E5 g3 a. d
% G i+ K, V1 B- o! [* z, k server->upp_channel_a_recv = true;//: a2 F) t1 h$ v9 X9 f# \
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
6 i* i0 y8 j6 O server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 X7 f' J$ T; T( v; |/ p& o F$ u4 m
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;+ w8 f4 a. o; y7 [
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. K9 B' j) {7 K& Z. v* _0 P4 j! ^! p( s. D
upp_error_count = 0;; X- J; J, T6 S6 {7 D; Z
upp_dmai_int_cut = 0;# O' R( |5 c+ ]1 u
# l: d" ^$ e7 P% U* x
// fill in data
% M& n6 M8 }2 T3 b( G uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
`1 Z N0 F. H6 i# H server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- R/ T/ c8 @5 K) W4 O8 Y
}- ?0 L* d9 @0 W/ _) d) d, ?
}2 e {" ~2 ]- E8 y2 ~" e
else{
" J- K: R# X! O% f if (upp_dmai_int_cut > 0){
+ S' M2 g( d$ t( F3 Q( E" } DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' A+ e+ D$ G7 k# S( D+ J, M
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);2 x& `8 T" b2 D6 A% [1 c& C" r
9 ]* U! H: m- ^2 q( g9 Y
; ~, ^7 M0 W& i( L* v& u //copy data to upp_recv_list_busy' u+ O9 g3 S5 P5 W! g1 h, p
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% V6 m- b9 [( `: ?6 V' C; ~3 `) O0 s5 w& D
//5 g1 C' c6 w: `( I' _9 Y
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' F4 x; I3 j$ i* _/ B/ p. ~0 G
6 h! F {/ b* {
//
% T& \2 b4 p N0 t* {/ h i7 Y server->upp_channel_a_recv = false;//
# L2 H: B4 z0 S7 z/ B0 Z
0 u: Z6 F* n& D2 z! a+ o) Q, e f server_msg_send(server, APP_CMD_LOG, "upp recv: success");$ i; Y' X3 U0 N: ] B
}7 R( D: p5 J+ ?0 U% X# G3 D
}
: M, Z' h# y! K* G: m2 V
) t* e4 i; b) B( w" n( D
1 T/ _/ O) ~ S return true;
. r. G: Q4 g; d! B0 K3 M& c# O3 @}0 h) V' _2 s- g2 ~
! m6 [/ ^9 N# Mstatic bool server_upp_data_send(Server *server)
8 Q- e6 i. V4 t5 Z& E7 Y" e{7 }9 |- U: l5 d' r) q
if(ListMP_empty(server->upp_send_list_busy) == FALSE){) W2 Y6 [4 T+ O( N% U# i+ X# P- P
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" |1 n/ U; k( X unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
: J2 V* |" o& @1 w char tmp[128] ={0};
* p' z7 p$ D3 J! C" j' L
" W/ L6 R( \* V+ i( \, _& m w" l server_msg_send(server, APP_CMD_LOG, "upp send: start");" @: @# k4 G7 A; K% l' W
print_log(server, data, 64);
# ?7 k$ S, \( w d" b& D: q% G$ Q2 _( U! d2 h
//
* Y+ O! E' a0 s/ l* J9 f X6 g memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 P' e8 F( o; S, V* F# y' F4 q* C
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% c* a J2 \1 \7 M
print_log(server, upp_buffer_b, 64);
( S/ w/ `% D, S9 m! h
! F& U& j; h- [) x+ Q r ~ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);$ c, s3 Q* M f% S* m3 R9 O
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 6 j6 q* F8 }: m+ F- V; L
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;0 b: P' T8 n/ f& n- r$ w% L
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) k- m" r$ i) `2 s- ~+ b
M/ D; Q1 u4 Y) c
memset(tmp, 0, sizeof(tmp));6 Q7 y% D% `# y
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 i5 l8 A2 \ x sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
- k7 X0 I4 b% g+ v% I2 W server_msg_send(server, APP_CMD_LOG, tmp);/ [: h; \# J! @7 O- I
( V0 _& [! ]' h. g( i2 {/ l6 x$ w upp_error_count = 0;
- U- r G5 R4 M; c- r6 U upp_dmaq_int_cut = 0;0 T% _) E2 l* A |6 P
// fill in data
) o0 N/ Q( j" [- p- h uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 1 M: G$ S! e* W1 c0 T
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");9 f0 H8 p5 R' ?/ q
/ w( S0 j, X8 @& Y( } // wait send success
" b( i+ T. H! m- m b while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . k& I) z. z* Z9 ]9 ^
8 g+ [: t$ \7 E. k6 D2 \ // make data node in free list 0 K, l- A: ]7 F1 c' c
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' {5 q4 p. }+ M. m W server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 v9 b0 ^5 s& k. N8 f; d) o- @& S2 T }
7 A4 w j- j$ s return true;4 Y/ W: f+ F1 t$ I
}
0 M( c; S( {# m. n4 W
; W8 U, u( d2 w; y. b' L/ F' E- M) p
) h! U0 v8 Y- H) u
0 l, i( |4 N& \5 M+ v1 V9 _' I5 C" v( @9 y6 |8 ?
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|