|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
9 z9 g9 L4 i+ W ^2 p) n! k( M! G) H0 ?; G7 x5 E
问题描述:
4 u& }, |" ]. Q5 M) o2 j* S在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" W$ z, D( ~# X* O, [
% s6 \( i) P: `8 |0 A5 W+ a$ E+ v图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. G) g$ h6 u! Y; @0 Q- L
0 _9 W/ {) G9 T, z0 i+ I! A2 L
测试结果如下:
, d' O5 l+ o/ E: Z P8 g* P138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
' |. A6 J* ]0 L" {6 p" D2 Z4 a6 P6 g: v& v; ?5 R
; Y; v, e2 x! k1 O0 x& z" e; w
备注:
9 f6 [" m+ V. F3 J1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 h; i+ y3 t" |6 |: a/ Y! ~5 W/ j; p2、相关代码如下:7 e Y% w5 |; I
//UPP DMA缓冲大小512字节5 ~1 I4 X0 Z4 q/ z- [, p& }) |
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
) |' L! n0 P: Y- v i [" m- [#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( V' f4 {" ?; K% j
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); V8 U3 p; H. h4 u, u: q
1 k/ ]' d9 g3 m4 L; |
8 y1 {1 G1 f0 A+ {* }$ I
//upp接收、发送buffer! r: t; a4 F' }, e- m
#pragma DATA_ALIGN(upp_buffer_a, 8)' ?& }7 r: P# E! F, m( v' b
#pragma DATA_ALIGN(upp_buffer_b, 8)
, D/ S( f5 o, b
. g( Z0 z, M+ q" w9 _: Eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# V+ m" M8 I+ V( b$ b, S# G9 n
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];$ g0 Q/ u. i/ s6 c2 V! Z
7 k+ ]$ c- k( X0 G5 D2 T# f
0 d- i! k5 j# Z% R6 B
static bool server_upp_data_recv(Server *server)
% D- x) e. Z+ `, k7 ?! V{
6 E! X$ X- O6 q: L% W5 B% \+ a if(server->upp_channel_a_recv == false) {
4 ~; f7 R+ u7 S0 q! E8 v* l9 L server_msg_send(server, APP_CMD_LOG, "upp recv: start");$ A% t( r* `) I; C
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 C7 T- e+ g# ]! s9 E0 s0 G
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
: f( V5 Y6 e6 |
) X9 _# X, R& l# d" X
5 C* Z$ B, ]9 c7 R8 w/ i+ h- n memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 R: D" u: Z' d) g4 Q6 G. e+ {$ P6 r4 g% T+ f: A
server->upp_channel_a_recv = true;//
1 r) I. l4 w! }& Z. t" P( j server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);7 L$ [7 Z2 l& {- @6 B
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( m/ W" @) i* `4 j server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
* P- I h/ J% l/ C k- W& n server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//0 X8 z0 S" k+ G% ]
5 [/ }/ V3 a7 F* `/ T" G+ T; O
upp_error_count = 0;
7 f- ~5 i' Z; U v) w2 d$ c: Z5 B( y upp_dmai_int_cut = 0;
0 [6 k3 y4 X3 W0 c1 F: D9 y! J1 c
9 T" r* m) X1 {9 ~8 Y% d) ] // fill in data
# @, ^7 o. v# K6 } uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& C% Q% [# i' n, E% E4 [, _7 M2 N
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
9 @+ c# X9 O9 x1 k$ q }6 Z' i5 e" ]8 Q6 x$ j! V' y
}
- P1 O/ h) _! |7 o2 J% j else{
: @3 q# C2 K$ }' { I8 p& B8 a if (upp_dmai_int_cut > 0){3 f7 |; J" y6 `
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
# b2 g5 t* T; ?, B8 Y1 ], { Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) B- x k/ J$ s/ H9 E8 ]+ w7 A8 }9 R1 R
/ ]# }( j9 C. Z) ?( ^$ p1 K
//copy data to upp_recv_list_busy
/ }, s6 n w/ k. R1 ^2 @( g* S memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);0 [8 P1 `' v4 x" C$ X: B6 K
1 f3 y" A g/ } //
0 F" M9 g7 E5 E( N ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
- }0 u7 ]7 o- ], Y7 S( _+ R
# y% K. C: h7 l //" f- C! r9 u' H' ?
server->upp_channel_a_recv = false;//9 n. v+ p. {0 }2 K
! ?; C0 ]* \$ }- o3 F server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ Z( P/ V. Q x/ v/ z+ q4 S }8 I6 h% F# s: y" r$ l3 O
}
! j$ L+ Q1 E0 C/ Q! D& J4 z
6 v$ p" X8 ~5 A# b& H0 b$ }. a! a9 }" P
return true;
o- |) A+ @* M9 ]" \7 A}/ R% T& z9 _) |" ] ~" l7 I
! k) R4 v0 [/ {# c. Zstatic bool server_upp_data_send(Server *server)
: g( S; z5 ]" u Q* h{) z" z s) _* s3 {
if(ListMP_empty(server->upp_send_list_busy) == FALSE){( {- u; q8 x; }& r/ t
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ }" `9 @- p0 y& d8 [: u
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 \2 z& [; B; u: r char tmp[128] ={0};
2 O2 x, P: t0 ~, u( y) y% [* [; I$ A; ]$ M( a4 a
server_msg_send(server, APP_CMD_LOG, "upp send: start");% h: o0 E% g$ A! z
print_log(server, data, 64);5 i# m' U; j5 f6 V: r4 u- b6 P- v
% j1 B1 g, J0 h8 K, a
//
' l* k8 T e( T( ~# L1 n memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);7 i: g# W; s5 P8 Z( v! }; G
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 |# _* L7 g9 {' ]$ B: A
print_log(server, upp_buffer_b, 64);
+ D& m/ N5 N" o3 I# u* [3 G. d+ [1 x H; t" o& _
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
! {8 x" y' b) A8 A7 Q( B6 [ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 5 z4 h# `$ k) b n' V
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
- t6 d; V" j }) D server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: \$ d# z, u: n& e+ t" o6 I+ f- }
memset(tmp, 0, sizeof(tmp));
/ G: t$ t! M* V sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' T4 f. S. E7 A5 j$ o
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ G1 t( z3 f5 j, o, B
server_msg_send(server, APP_CMD_LOG, tmp);
# z; W6 T H2 q( K* i m7 x i1 x
upp_error_count = 0;- r" V& \; m8 z' l; ^
upp_dmaq_int_cut = 0;. g: s$ T8 D4 z9 m" Q- ^* X
// fill in data " Y M0 }- A- J8 p
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" C/ W4 A8 j( Z, Q8 k7 V server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
r V! k" ?' L8 X- r
- a- D$ m& U7 F! \" C& | // wait send success
) P: I0 x, {8 G" y8 ] while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : i/ _3 ~" a5 U3 N/ Q% a
5 W2 P8 F' S( M4 a/ [ // make data node in free list & u/ ^+ j# B8 T2 a' p* x X
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
B* [7 i$ G3 [ n server_msg_send(server, APP_CMD_LOG, "upp send: success");
) p/ O0 f$ ~% S$ C# p( y2 d }2 i) ~6 _* R$ ?; ?" C: s/ X- K- ?. W- G
return true;' D7 I2 ?7 D0 m6 h' D3 U! i
}1 Q, ?: D$ o4 f' g/ c/ @
$ X& w# ^$ A" H* \
4 |9 D2 O( L2 c) {1 @1 r1 X9 s0 W0 b; ^# |" @& {
( P; X/ A5 w9 O9 x2 p6 y, a
( Y j2 m* U Y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|