|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 N4 h: G; X/ T. {
: G# d6 z) ~# ?( q {
问题描述:: L) O* p5 a0 O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 X: y9 M8 n( [. B) P$ `
% l2 D. {1 c% k+ K0 Y" w
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
9 V5 {& Y+ |/ b4 n* e% Z9 I# k' M/ q5 P
测试结果如下:2 P) g+ a* c: S$ p9 b
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 E+ S, H- G, @' }) {" m
+ {6 `1 h# c8 a' d- j) b: u6 L" _% X" i$ y% ?8 t& y
备注:
. u+ H$ N. \" M1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
( K/ j2 o) ^/ Q, i2、相关代码如下:- F' ~( _7 ^7 Z6 J
//UPP DMA缓冲大小512字节) C: ^' |0 m5 o# s( L, c+ P2 A0 Z
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍* C( V$ H3 Q7 ]
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" A1 z* v" t& G' o& `8 N: i3 y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT): q/ q/ L# x' x
) j: x2 Z& r* S8 i0 o
5 V& C( W+ {/ C( ^# a) X+ r7 m
//upp接收、发送buffer: |9 c0 M* {0 Z- |) @" W, l
#pragma DATA_ALIGN(upp_buffer_a, 8)
) [6 G# t6 r5 o#pragma DATA_ALIGN(upp_buffer_b, 8)
9 ], ~( [5 F' P2 l3 q8 `
$ K# D: R* ^. r( N- Lunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ B( c9 t: |/ G
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" q( J" R' Y3 f) _2 q% o
( g6 l" h5 [& O$ k5 C5 R+ S( T) H6 B: A6 Z5 ?# i, @
static bool server_upp_data_recv(Server *server) ) X& D' l5 G' \6 e
{
$ V3 m; `. v2 d0 j: O5 ^5 A, x7 Q if(server->upp_channel_a_recv == false) {) u, M7 |* Q- C1 ?! w f
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& B1 R+ _4 _5 Y. ?. {) i: A5 C if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
5 l6 c& v0 {. o# l& n9 J$ N9 l% a server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");, C6 j( U. H5 A
8 ?. O3 T/ s" M3 Q3 N! s" E' [
/ y7 x7 `( B) B$ h memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' }9 l5 H9 d6 J, x& u5 C9 X' ]* \8 F8 U" T) Y1 X" P/ B; @
server->upp_channel_a_recv = true;//* D& {% ]: _7 s& {
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);+ Y. F7 ^/ X( `- w; u3 E
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
/ V3 V% Z# V# k5 Z& ^ i. o server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
6 S: V5 c9 r9 q5 ] server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. a! |9 E# t1 ^
) a. N0 v" A) t, h) g upp_error_count = 0;% j: w6 q" g4 R5 I! K
upp_dmai_int_cut = 0;
: v+ e; L% m/ E
, j1 F4 o) n* E$ F0 d% [ // fill in data
- V* x2 h7 o- A/ i: R uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);* ~# j7 C! k# y/ S0 ~8 L
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: z5 |& @' |) F8 m( Z }
2 N' L2 w- E. S& m }+ ]; r' k6 D/ c5 D( J
else{6 K9 e N9 B" G
if (upp_dmai_int_cut > 0){
& s; ^1 P/ ?; w0 @( m4 a! k DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 f' Y3 y+ g6 Y4 E Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 y: P/ c+ \' I) c' V% Q
9 `3 `6 ^2 X Y2 u; U; P5 S! H# d, Z! A
$ Q; J. @0 `% K5 {0 i
//copy data to upp_recv_list_busy
: a6 M6 Z0 s; F; { memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
. G$ a6 f# m9 }! H. \: D" n* @* J! @' |8 u- v) v& Q
//
/ k- C1 P' L4 t* i2 r ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: q/ c' s+ _5 X0 _
. l) W' [* |4 h( M //
7 i* ]$ G6 N& N/ m2 W server->upp_channel_a_recv = false;//; ^* t3 L: `) ^3 m
, f" R2 x! a% L: c6 a( [' S" u server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& Z( | e4 e3 I- n8 T5 l. u }
" _* c8 M# h2 h# x! q, Y: ? }
: ^3 i8 x+ i5 @. I" P! X+ ~4 S1 ^: u+ k d M; P! g7 c/ D
4 C2 i' E4 B q: { return true;9 j1 Y. H8 T5 c. G( b' g$ a/ l; {
}4 Y, T2 A6 d. @ Q/ n( Z
' J2 K8 U* o% u# D. L
static bool server_upp_data_send(Server *server)& D r: @: `5 H! f
{9 R) E0 n: m* f. N1 `/ |
if(ListMP_empty(server->upp_send_list_busy) == FALSE){' F9 j7 `1 x' k1 d) E
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' q8 N9 a# `, Q- h( I/ @ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
- k1 p$ ?# b; C; g" G, { char tmp[128] ={0};$ m. A/ W2 M* c. V
2 Q: ]6 c% |# }# N0 S server_msg_send(server, APP_CMD_LOG, "upp send: start");
9 ]; F( l. }& d print_log(server, data, 64);
/ \# o- k; L5 y! |
8 o" g" v$ G# N/ f //
% \! @$ z! L8 Y- k- t; T: B memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);/ g, G3 S4 h# ^3 S+ X: B$ P! }" R
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);4 E( E) P; k1 s$ j* k. x; g* O; R
print_log(server, upp_buffer_b, 64);, N$ d( O6 G, ?* |* J; K' s
1 D+ j2 }1 V8 `( e5 s6 }) c" m
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);4 M" T1 m; G! X1 C( O3 d
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; , a3 }9 D4 Y# A2 ?# y1 w: ]; s
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;- {. H( S: K8 ^, q; I
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& l- a$ d2 w- h2 X4 _
- S; {4 D3 h- J memset(tmp, 0, sizeof(tmp));
1 Q& G ~0 e! v; A' W sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( A2 N- ^' z! i8 c+ |: r sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 k* ^8 o, S% ^+ g" \
server_msg_send(server, APP_CMD_LOG, tmp);
. @ w, y0 s' P& u# w7 P- B8 R3 o3 r( \* p6 i1 E3 s1 ~; c
upp_error_count = 0;" h" _0 T! I& ]
upp_dmaq_int_cut = 0;
: E0 {$ K0 t( F. D/ w // fill in data
- B* F' a# @( E/ I( x, Q uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * Q0 z$ v$ E2 v# j! ]
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 O& z0 E: ^, K9 h& h3 f3 @1 V8 v/ ~" |( q' ~/ X. M
// wait send success
5 d% V# [4 Q1 J( g. V8 ]9 ? while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 5 Y) X5 i' [& }0 q
( b( P$ p2 b' `1 Y8 i' j( H8 Y: D3 G5 |
// make data node in free list
* x ~& L6 o d8 q) S ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: N; }( ]0 I R7 b( m$ \
server_msg_send(server, APP_CMD_LOG, "upp send: success");
& H u+ G, n+ Y }( W4 n* O+ r% c/ C' z1 E6 U! ]( c5 A" k
return true;
: q7 E( k5 K- T/ y}5 L5 d1 \" W% N b$ h7 M
. O1 n9 x* s: a) B! W- R. a1 [
) | Z2 i/ u, j# k' ]9 [ U r/ b8 q _9 B* d% v: |( w8 u
& @& L6 u* x0 ]: R; l3 ^
" `# T! p/ v! U+ x9 r) F+ W, h
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|