|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
$ Z; W/ q, H/ B6 ~4 i' L9 M
( b9 v5 B; p" @$ M# Z2 k; @问题描述:
0 t( ]+ I4 \3 e* U" p4 u/ ?+ g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" N, z. p. s/ O6 y: c( O x& e
9 K- O5 M/ ?' |$ j* j1 R图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% t* V3 q5 q! r& m/ l+ r. O$ m# [7 S/ z/ z* F2 b
测试结果如下:
7 K) d% \% M9 ?- c0 ^138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 {- ^; G) H6 j8 Z8 o/ T' O' x
: Q) h3 t0 ~# ]4 i! i
1 y: V" B9 }, h2 |# \" s; W
备注:# E$ o4 O1 R. @5 \0 _8 p
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" X: n& z: `% U
2、相关代码如下:
. W! R2 U" H& g h+ Y7 Z//UPP DMA缓冲大小512字节9 d% A0 A" L" y% I4 X
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 ?4 o q, O* D
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ E' A4 f5 q8 T* g* l* J
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 S1 }* t: }: v4 b) p4 T6 ~9 x4 l' B/ n/ D; [
, s5 \9 F$ j6 r0 s//upp接收、发送buffer
/ c+ Q W6 e8 Y# `" B g1 |#pragma DATA_ALIGN(upp_buffer_a, 8)
& k" V) T" O, d! b3 |#pragma DATA_ALIGN(upp_buffer_b, 8)0 K& m" y. `1 n; y) p! b/ g. Z' y! S
: T9 s4 j% V5 w4 Iunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
. H! B7 f" M; n( h. o( v- zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; w1 p7 n* ~( B0 W# F8 g- m3 n
1 ? c K% q, }+ q" N N% J' P+ P& K* |5 D7 ^% l$ `& x! `. }
static bool server_upp_data_recv(Server *server)
* x+ N! M! [! Y$ R" c{
z- g- q- b* f1 O if(server->upp_channel_a_recv == false) {
. _4 q; O, S4 `& ]3 s/ W; @0 | server_msg_send(server, APP_CMD_LOG, "upp recv: start");" z* C4 a* |) ]0 N5 f# x: E
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- \8 I7 O$ l, U/ M |) S
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) D1 Q% G, x- B' n. C0 l# i' ?7 p2 o
+ o! ]7 r: v" ~) D# T
: ~5 e. Z' Y0 M( Q: X7 W y memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 Z/ h% m; G* \; H7 P9 t# \' t
1 t9 `& z/ A5 Z" R7 l$ }/ r3 s server->upp_channel_a_recv = true;//
# M' X" {) l | |) R+ |& K server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
8 h8 H8 Y% G& ]( E, ~ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;1 D0 y% f8 q4 `0 M0 X' i" L
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;; \* c- }& B# ^( R9 i f& e. H5 U
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 e6 p* l9 I! E: t! v% v) N1 @2 A
0 P ~1 {8 Q0 y6 \# P4 k: a upp_error_count = 0;$ N8 {1 ?/ Q: \6 ]( N8 c4 ~+ m. N
upp_dmai_int_cut = 0;
. J' o9 o: j) D1 u7 `9 d3 w* d# r m& Y! X
// fill in data
+ k- c& s6 p8 y* V0 m( p! G; g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 |! E4 W- b# L0 d8 |6 i
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 c. s" k* D T& m+ w; T }
" i# P! h/ e- W/ G- R }! W/ h Z# N" V+ K" ~) c6 S
else{. |# N' i- z. z+ l
if (upp_dmai_int_cut > 0){1 k9 B" K( W. W2 Q" W
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
0 m6 {2 f" }* t- X Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
- ^9 q1 X: u2 P+ i0 V0 t2 e" V# Q! f3 L7 M! s, `& e% {0 F
* R* c9 Y: I$ O+ w* B
//copy data to upp_recv_list_busy9 H3 Y# E0 G+ L/ b
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 D& ~, p: M0 T1 Z; Y
5 u+ n/ A- ]: b' w4 @ //
) ~- U" m% c( U; m8 k ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
' h3 p3 _: C- ] p9 r1 l
! P( V C, N! ~! W% L //
% ]* _8 C/ g( L1 M P! o server->upp_channel_a_recv = false;//
# \6 ~5 s Y/ w& T
8 b) ^) X4 L7 u7 E: z0 @, u server_msg_send(server, APP_CMD_LOG, "upp recv: success");
' }% w' d6 \, c0 W }
0 a* r& z$ |2 a }
; o: C# t3 y1 A( ^7 T$ b; @1 X! F+ G! E/ S
9 D1 R9 H- {0 D/ H1 V0 S return true;
, Q$ D+ {2 K. B. X9 T# b$ ?}; K5 Y r, Q) i- p
: S. B- V, f/ v5 |: |' w/ h
static bool server_upp_data_send(Server *server)
; O7 V( e+ g$ ]. z{
4 q3 L: n$ d, [+ r# I if(ListMP_empty(server->upp_send_list_busy) == FALSE){% c& N: h2 W) R$ g& G% P
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( Z; ?$ T" @: H) x; Y7 M5 c
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
1 `; w* o! q3 O char tmp[128] ={0};3 y m4 j& B: [, N r
% [$ D1 q' X P V server_msg_send(server, APP_CMD_LOG, "upp send: start");
S" D% X. ^9 ^7 S# X) C8 P9 L% C print_log(server, data, 64);
6 h0 D- ^' J, Y6 E9 s) L
2 ]. e; p2 O4 \1 N5 b0 k, B( p //
. N g' U l( u3 b) ~ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE); W+ K$ V# ?+ r! G8 p) _9 j
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' e6 g% @2 q1 }) p1 W0 q! t) U print_log(server, upp_buffer_b, 64);0 i! S' [# z4 F7 K' i9 f
/ y$ w4 S% v9 _8 k# O1 s server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
. b9 }5 u4 o: @# `) Y server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 3 S; B$ ?# i7 f
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;+ i3 \2 Y+ |) N9 E: r6 W
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( b, p+ ?; c$ ~: e9 m% W" `
/ J6 C2 Q8 L, _+ ?7 j
memset(tmp, 0, sizeof(tmp));/ n: u8 o- g1 O+ q A) k0 m1 T- P
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - o+ w1 L* a5 p7 f" m2 N W
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( C# v: J, ]1 z- `, f: i; h server_msg_send(server, APP_CMD_LOG, tmp);3 [" X" @ i2 r$ u
* K& p# Z" H& V. |/ a$ D
upp_error_count = 0;
( J7 r, r4 _7 s+ n6 S upp_dmaq_int_cut = 0;" n1 d2 C- v q+ \' L! Z
// fill in data * y, p7 p$ d: y& J/ v
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ n* A- j" o* ~, g$ L. v server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
0 L2 v" r; i; \- s: I( ^
7 L. F* X( R; u$ _7 O // wait send success# T" F, r8 Y& \& ^+ k. T
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 `; b, U3 E2 h: p% M5 C
, @* k/ M5 j1 N" U3 m+ l: O% ?
// make data node in free list + I' d7 B, r/ _3 k
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# p& D$ s: a$ A0 n T" v
server_msg_send(server, APP_CMD_LOG, "upp send: success");' c0 b* X" x: K5 i3 ~( [. f
}4 ^& a8 f- E3 C0 D5 O
return true;
& a N, j) f3 t2 F, ^' {% E7 L}
% _$ C+ | @7 F7 L+ c* D/ c6 c+ Z" X5 J! {) H# x A9 E0 m- t9 E- q
$ u6 y& S+ _& j; i
6 e T2 T! Z. f8 J i" }
& V' s$ q' o2 X- @. O. ^) ?! p- V$ }; D A' Y' ]5 c0 F
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|