|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 {* F( K |' K1 Y, P( S$ R4 t/ R7 L
4 H9 A: Q9 r/ S1 K
问题描述:/ m# N* z- N8 W/ l2 i* `! W
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 z5 f( S( X$ }2 z
/ D. G' w0 [% U2 P( N$ Z
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。1 N, C8 S. K; G8 T& w
4 u# u5 c: F0 j% D/ I测试结果如下:
& `0 {$ [/ a3 u @" u3 O; u138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?* O3 T: [7 I* e3 k+ H
2 \& a& N3 V- U9 }0 w2 ~+ a
# K& \/ F# ^% L: H; Z4 f备注:& ]; o2 n0 b+ z% B- l
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?& }) p1 [7 W3 _- w* A
2、相关代码如下:& y, I# I$ m: W7 i( r
//UPP DMA缓冲大小512字节8 `3 a7 \+ V7 N' g- q
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
# I( y2 A Y9 `& W! H#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, J4 o8 B6 i* `9 j2 q4 [9 A#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 [9 H7 o# B8 }% x: F3 |. W( W! {+ B# y# Q
# \1 _) n& @5 m# z5 I1 D
//upp接收、发送buffer! V8 r9 E) [; I, o$ s
#pragma DATA_ALIGN(upp_buffer_a, 8)
# T7 J* l* M/ @# F* l r#pragma DATA_ALIGN(upp_buffer_b, 8)
( e) l+ G7 [0 V1 x* l7 |0 `8 r% b5 k* B1 P7 r/ F( L
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 ^" l) v" t3 s Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: D+ H9 u; |1 K! @, \1 r) W4 c: c/ Y# G& b
! o q3 D% L% H+ R, rstatic bool server_upp_data_recv(Server *server) - {/ w* R q( I6 [+ u& |- x( e
{
8 @* ^7 ^1 e) m' |6 U5 ^4 C if(server->upp_channel_a_recv == false) {
7 E7 N# N/ x3 L0 ] server_msg_send(server, APP_CMD_LOG, "upp recv: start");& l+ M6 T" |& @' w$ D% `
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 \- {9 F$ e1 \ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
$ Q. a" I" \) ^9 p
& F& m- f' M3 q7 @, `, m9 [
+ A* E+ _ I0 m7 T2 K memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
! u* W) a; ~" J9 m) f( w' ?* }! e$ a! ]( F- o# W) L3 p, `! p& [; v; U; Z
server->upp_channel_a_recv = true;//% \' A. S7 j4 z. E7 T
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( `' k1 c" F# O: {4 X l
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;5 [" V4 |& b# [. n8 N+ d4 |
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;& f5 H5 @9 f7 s% ]/ f2 {/ {
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//# ~5 G, N! }8 O' E( u1 F# _- z! z
2 P, R0 s$ A7 U% n$ \ upp_error_count = 0;4 u, q V0 ~- a0 M' N
upp_dmai_int_cut = 0;
6 p! ^; ]6 W/ l1 _. z: q$ O) X) W" A4 ]' ]4 f0 E
// fill in data " J6 L$ }, @) n. h
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);0 V( f. Q& e5 G9 Z2 w* s
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 K; t+ p! |* \3 {" m
}, h. l. v" E3 g5 a/ e; E# }$ X
}
1 C2 V& P4 [6 {8 D4 M2 ^% ~ else{6 h( M& A2 q5 J, z9 Q0 B
if (upp_dmai_int_cut > 0){) ?( q. v; E. B& C% ^6 h R
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 p3 t) V% `1 L4 a7 V5 Z Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# u; C7 [" U! M4 f: \$ X( j; c( }
, J* g* P5 m) I. g, W- n% P
1 f k; {# X# P0 C% i1 u! w
//copy data to upp_recv_list_busy
: I1 U3 T( u7 ?" J6 [7 ]9 b memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" ]5 |1 J1 W' D9 H
9 x; _/ a$ C5 {! G( ~; O! F9 Y+ ~ //* B9 u' @, J3 E7 u0 f
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. [4 `4 T! q& i9 f% e% ]
G8 {. V0 \/ ?: F, r! \ //
& C& }2 l; c( f" q% x6 J, J; I# s server->upp_channel_a_recv = false;//; H9 m5 _6 |0 c3 N: Z& X# K
7 I t% T6 T2 a- w server_msg_send(server, APP_CMD_LOG, "upp recv: success");
! R7 d, S! ?3 Y; I2 @+ Y }
+ o$ R5 [! L* H+ V1 { }
! k3 |# {8 Q. `/ L: P5 \, \$ \( `2 q4 }& j% r1 l
# D$ {2 H5 r; z" C" B9 T
return true;4 ~) T6 @* [. D% f& o0 A# Y
}
7 r2 z2 ]) Y: e/ V% v
% F7 J8 z4 ~- f8 P' E5 ]# Vstatic bool server_upp_data_send(Server *server)! Z5 Y0 {; t1 N" s( M, F. @( v# |
{# O! [' ?. E7 ~3 h6 U! Q0 p
if(ListMP_empty(server->upp_send_list_busy) == FALSE){! \# T" B$ F( }, U* W
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 _ b8 j7 W( }9 f G! @1 Z7 y' q
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
; @2 t I( x8 Y! M char tmp[128] ={0};
4 }. J- W' z% M+ I$ l: v- A* z3 O' F2 d, G7 @2 V
server_msg_send(server, APP_CMD_LOG, "upp send: start");
' p! n, {' g( r# S; n4 a) W print_log(server, data, 64);
0 V0 {* I+ f) }6 w8 z
$ t% j4 @; x9 d /// x4 C: l" O& Y+ n6 A
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
$ S; V2 u: u, R: d5 O p memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);" g' M9 I" I* Z, \+ D( a& g
print_log(server, upp_buffer_b, 64);
_+ k5 A) m+ w! a! H5 G8 i0 W/ y _7 N. A' {" X& ~
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
2 ^2 f2 d+ h* @$ \, K server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 0 ^- v. _ l) k: w- j) k+ H
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;" X( z. U/ `) ~7 G4 y, V7 Z: }
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 q4 \% V6 a2 P, {" W W& Z$ K2 }1 \. ~: c, z' g, o3 G* t
memset(tmp, 0, sizeof(tmp));
2 K8 o/ m. h. }# \ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 2 s- }) ?8 F1 ]& h7 Z
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# f# h' |- F/ s
server_msg_send(server, APP_CMD_LOG, tmp);. R b6 z8 U, p: W
- L2 \5 Y" G6 i3 u) n, g% v0 V upp_error_count = 0;# |, W3 L' p% }$ ]
upp_dmaq_int_cut = 0;% h: J; I" l7 v9 f
// fill in data
6 r! {$ n7 X4 ~9 M4 V- y/ L- A* J5 | uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); / f4 _9 R/ o- T6 y# Y8 W7 C
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");2 I* d' B' C, `) c$ w# | `
5 N9 d9 \) F# u+ P. Z* D
// wait send success
0 d% ~- a$ I# j$ p8 [7 F while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 d; X. M% b: E Q
# h: _' s, E. e9 @1 D // make data node in free list
# c& P {# Z7 H% X3 | ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);. E5 F; e: C, F
server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 d$ u- {! [ r- [2 ` }
D5 S) b; @9 y" D5 U$ s, J return true;' K2 e6 {' Z% U' i
}; S) N5 O. s4 ?& p
3 O2 W4 \& ?( l( d0 y2 u) g, D/ W; v* v% @; v3 }3 p
6 b; |4 H( |7 L; h9 I
& H1 v4 F# K4 K/ G8 @& @4 [ c+ O7 U3 m' I$ r9 B2 H6 z: q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|