|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
) w/ v1 d1 ~% c. {, x) }' p) O8 Y# {0 A' B; ]
问题描述:
. A7 R4 i/ S: w' w8 T/ r在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:1 ~3 R0 @. m6 o. a, V" @1 V% e
7 ]" v* e: m: _' ?( T+ d" @( C+ u* g: o
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: I+ o3 u ^7 N9 x! z3 H( w# C4 ~9 |+ W/ Z6 V
测试结果如下:& B8 m# q( {* U' ?, L, k/ s/ G
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( x. r M9 b; K1 [
2 S. ]2 Z0 i) h, r* Z/ G' V
" k4 a$ ?9 H3 x4 t6 h( x0 A- _. N
备注:# y* i- Q% v4 J, @
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# H; `3 h2 S c: k# Z) {1 D2、相关代码如下:
* j9 U( _. C* p5 C' F; h. T! o7 K//UPP DMA缓冲大小512字节' G7 F# d2 ?9 `: m- @" e
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
[. t" z) C; M' U# }2 `#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
! G7 f" G3 [" p, B1 g#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% u' }9 ~: S& G3 }3 [8 x0 e) Y- }5 o7 _2 Y
9 D8 K6 L& H* A8 ]" A9 D
$ v/ H4 A3 W9 E6 W" N! K* A//upp接收、发送buffer
! {: a4 t- f* l; m. d7 X#pragma DATA_ALIGN(upp_buffer_a, 8)
) a; V9 ]7 h/ n! B. ]- U, L. B! e#pragma DATA_ALIGN(upp_buffer_b, 8)
6 z) i# d% e, ^6 \2 h6 x
/ J2 J7 \; Q1 q! N/ K4 Gunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
) W2 Q% \) c( D- Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" N) p& Z* E* Z$ x- U+ ?1 V( D+ c" L5 q' h" a6 g. \" u
# {) T, x) O2 g" W) e
static bool server_upp_data_recv(Server *server) ; B9 o- S3 E" ]& [. |
{" \1 J/ I- }+ N; K; H6 O/ s! p
if(server->upp_channel_a_recv == false) {6 C4 T) V" q2 U: l! A
server_msg_send(server, APP_CMD_LOG, "upp recv: start");7 E |+ v2 z& {4 E6 D
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
" d& O7 X! p& [1 v server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- c% N7 ]# X' [( C
! Z; A- ^! G( S# V) B, c$ S0 P' i; X4 u) J8 [9 U |
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);) ]/ c7 k. r' Z* j" W( R
0 y" `! C# u, K% H1 U
server->upp_channel_a_recv = true;//
. b$ T& E( i* h* e8 _0 I server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);8 x% ^* p! u2 s0 I4 |
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;+ A* |3 n. y5 D0 M
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ x: x7 E, C8 D+ a server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' M6 g% k- ^3 S4 q' l& S) B
( z# J* M6 C. J# U5 r4 C upp_error_count = 0;
8 V3 t2 \$ v% f1 E8 M7 |! Y; g upp_dmai_int_cut = 0;8 n0 B, K- | r, M$ }6 ^
7 W5 D4 |% q; R. x. J; H! D // fill in data R( u( j+ c4 B( e
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 u/ W/ {9 P9 T( g/ h3 _ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 w' C; A- G& d# u0 }' z }
) o4 [; K; P% b4 @ }
5 T0 e4 D+ Z* p8 y/ d; @- w else{
7 v/ [. w5 @' o if (upp_dmai_int_cut > 0){
+ g. ]" y0 L' D6 @' W; O @, x0 d DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);- u, I% |& d; R
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- W1 U- W7 K1 m0 ]8 n
7 K, l0 q7 X9 m& y+ Q9 O- p: Y
! z# [3 G% \6 o$ \4 _
//copy data to upp_recv_list_busy1 R% X% s: X& z8 G6 h2 r( X
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);3 y! B" A# |9 k1 c2 V* z" q
: n2 i" {& Z& X: X' \. y* F) Y //! f' [( b0 i9 c0 ?/ B
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
/ \; K( j' l# a
2 l) ?# i! J' {, J4 X //# P A1 s% u& i# j6 Z
server->upp_channel_a_recv = false;//
: d% L/ H6 O+ j; }
$ E [# P4 z! V( E! J8 u$ L server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: t: ?0 L6 j" i5 Y7 S+ O }
4 G. y* o% L/ s: ~ Y5 N1 }7 l }) Q: x, }: {- a& Z- c+ c
" z) R# G! I" X
/ W' n/ _3 |. T( I( _- t$ H% F return true;5 o# C) i/ @+ Y) Y
}, V6 g3 T5 M* R3 g2 \+ w
& c7 o0 |" a" t2 Rstatic bool server_upp_data_send(Server *server)
9 O' }0 h4 d% s# X1 J$ v{1 [: {9 G5 h/ j* c5 q
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
# g+ }1 e( ]. G! I DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);: g$ J$ O6 P, {+ `/ G* _8 F( {
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# x: v7 e- I) c0 K
char tmp[128] ={0};
7 v( L: c" p* k5 l9 z$ A
+ ]4 D z1 P' K1 H7 G* Y server_msg_send(server, APP_CMD_LOG, "upp send: start");7 \+ {( [6 e6 W/ V4 j) I. B: Q0 j
print_log(server, data, 64);+ {1 @5 c% r0 U
/ t# n1 g) ^- c) F& H
//! }& j n8 y. v& g7 W7 j: N0 _+ ~. M$ g
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);8 O& n& {7 R% ?) J/ E+ f
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 `( c% H& A4 p/ P ]) a+ g
print_log(server, upp_buffer_b, 64);
. {( T! M& r1 ~ N& q" k* K, j+ _6 p4 T7 Q9 ?$ N( g& t
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);& r/ v/ b: G; z* D1 Y8 \6 d9 R/ y
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
- R& L5 k- s. r/ [ server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
$ m% T+ A- j1 m9 [! B server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ [2 }; W+ B$ x( V; y
+ E9 [ F0 I2 _' {+ o
memset(tmp, 0, sizeof(tmp));6 }3 v: E8 b6 r4 p, _" S. u
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 \2 m8 I7 \# |1 _ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
% r' s1 r* k5 D7 Z( V server_msg_send(server, APP_CMD_LOG, tmp);' K8 a9 A! g& R$ K, b% U6 r
( p8 t x4 Y& S+ c4 K/ F; D$ `8 n
upp_error_count = 0;
! Q* `& u; F1 q# h: q upp_dmaq_int_cut = 0;* J) R! L# |. |& s5 k- C0 F) S
// fill in data
9 f$ q v1 a) I uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
' S, @* H: M% |9 c' `/ Y server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
$ e$ H: L6 V$ z1 g
& D K9 m4 n2 ^- ~9 Z/ ? // wait send success `% v2 X) m& P1 Q
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
+ ^. ?% v, T3 G* l. B
; s$ Q: B+ |! U7 a3 @7 ~ // make data node in free list 1 {* t0 t1 d: S7 _- R* S* {
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);0 k$ d9 m R9 ?$ g) c# n
server_msg_send(server, APP_CMD_LOG, "upp send: success");
; B- \- Z. _1 C( h6 r* G. z }+ C& p# E. W; A! F; E8 O, a+ ^" [
return true;
! G! @2 f! t. `$ r9 s9 H}/ S8 ?: e% [5 d; M
5 l s( l) u5 S/ g+ E7 ` k" h) z8 a J
% g& N: g/ y7 K1 s
1 L1 D& ~" ?% e. H0 S( U
; e# G5 y9 C8 C h( g" S f6 ?+ z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|