|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 m/ D. I! c+ c" A+ F3 |0 r
/ M; c: Y: A, f1 W. _) \9 {3 U+ |- g
问题描述:
* k8 `. w8 D: X% `" ]在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ x/ z- i/ p% D, d/ Z. ?) J9 L x* i, R4 U, Q& |) S
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。/ v6 Z; f, V8 |2 `# ]
3 f9 i4 {) W& M, A5 ]测试结果如下:- C9 T( Z8 g( @9 V1 I* O- z
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
' m( @3 V4 x ], A" h; v+ J
- v& p/ e% D3 e! Z9 \4 N" p; a& \5 p J8 T% T7 u) E% V9 B6 N
备注:
" ?: P, f+ m9 g5 ]1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
( Y1 F1 [5 _! u7 @( r& A, _2、相关代码如下:; w' X& Z! d0 Q5 I- O
//UPP DMA缓冲大小512字节
8 Q9 x/ Q& N% j' [% F#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 \+ J2 j1 v# `+ B6 x9 x5 b9 k#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* K" D. H* ?* O1 W! t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT) z( A7 E2 [0 `
' b4 }4 }3 ~8 L; C+ c# {
8 \" \: j+ b4 z
//upp接收、发送buffer
! Q& f$ C: W- A- g- }. Z#pragma DATA_ALIGN(upp_buffer_a, 8)4 L5 }4 \1 L7 A2 J/ E
#pragma DATA_ALIGN(upp_buffer_b, 8)6 Z* Y, J2 u1 O2 n
5 D6 d4 N! X: J: T, Wunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];, q. z) P8 T7 m5 m) s3 Y
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
9 |# y/ C) O0 m$ l* P G2 T
6 g) c# K* s% n$ L! Q: M' B6 r
, j h1 ?2 y" N: b& F, s% X6 Jstatic bool server_upp_data_recv(Server *server) 8 G7 Y) \. p& B! q
{
5 w9 \: y( K) N* I5 ?; j if(server->upp_channel_a_recv == false) {
# S! P1 @* H( l server_msg_send(server, APP_CMD_LOG, "upp recv: start");7 c' U: K& P8 Q/ k
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
: p1 W: ^0 X: }: R' T server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 J2 ~9 ]5 d2 w& Y9 Q7 u
( R* J0 A4 P! b% A/ G
2 X2 E8 L& D3 ]5 i memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ P! h" A. l& K. X: C8 V, S z: O; E$ K u3 w* O/ `
server->upp_channel_a_recv = true;//0 a3 S; } f, \- u d8 w& j0 @
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( ~4 |# z) Q3 y1 C1 P4 ?! R3 V
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
6 E5 [' t+ R& _4 R9 p0 c" d; e8 I server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;- J! v( t, {8 P9 x8 W; E
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//* r0 f1 V/ z; G0 |- Q. Y
/ @, Q/ e! k+ E3 t# c! U upp_error_count = 0;
q$ V1 x d" i- R) V! N& x1 e' H; n upp_dmai_int_cut = 0;
2 b0 ?* O9 z+ ^* D; a" w. g! \1 a. a4 t% V7 o0 Z$ ?& {5 D- Y
// fill in data
/ j; a1 s- Y& Z s6 r0 a uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, |% j9 {0 x `7 O server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");0 g3 f8 t& n7 v) U8 e- p
}
2 j5 w9 H( n0 A+ \3 b+ @2 I( p }
# S2 \- D, V3 R! C0 f else{
. E. Z, D# {# b. e if (upp_dmai_int_cut > 0){
7 h& T1 t0 v3 H2 v9 x' I DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, ^ I" o/ U$ B
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 p, \+ S% ~# j4 h, l
8 l, ]" P/ I' M% w' \6 L
; t6 v* c2 v+ q( n, f1 C
//copy data to upp_recv_list_busy
! n7 L1 `4 D# M: T3 u, ^$ D memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 F$ z0 u A+ ~8 U3 D5 M
9 X L* b! L3 K# k% [1 E //
# F8 J ]+ I6 ~' z( n/ D" r ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
) Q! ?. r6 c& B% v/ |' G+ S* D: H+ ?, E
/// d$ d' b" R. b; a$ ]! d0 V
server->upp_channel_a_recv = false;//
: M' k; r/ E8 N/ s' Y0 ?5 e
: }8 m ~. c2 m server_msg_send(server, APP_CMD_LOG, "upp recv: success");0 E0 H, |9 L+ Z' b* J
}. }+ \/ `! S' R r; n; n/ t
}2 ^2 G( o( H3 Q& B: T$ U3 Z
0 `0 Z+ G" p6 G! n( o2 ?. H0 g# b9 q1 s. F- ]9 W2 F; `
return true;
' {2 J4 n1 z4 |% w6 g5 M}2 U5 ]9 C1 | e9 k* ?
# t4 k! c4 ?9 o: r _1 [static bool server_upp_data_send(Server *server)8 a' u; H( a- E( L
{: Y0 ^8 C7 K a$ b9 [6 \7 r
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 E" o7 c. }2 V/ f& e' W: ~ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
4 ? Z1 @9 e) W8 X unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 M0 v6 Q E5 y- L: m+ l% Q+ C char tmp[128] ={0};
* h7 q6 w3 F8 P8 N$ s6 |6 L
7 e- ~' p/ a; k0 g% _( I server_msg_send(server, APP_CMD_LOG, "upp send: start");0 ^0 M: @1 Q* ~/ o8 d {$ r
print_log(server, data, 64);; h. |; ~+ r2 l7 Y
% y% \4 ~" l* a# F
//& R: U4 t3 N+ |+ w ` L# ]
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
c8 ]+ @' ~- X5 s; I memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
- Q4 e. }# s; A: h T7 h, T print_log(server, upp_buffer_b, 64);
d9 o+ U- P+ G+ N% Y9 i& K/ X/ {7 X7 e6 e* _' B1 S: ^
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);' j g9 r8 B& O# [
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
) _/ M- u# o% c$ ]& W/ S% C server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
4 J* P' j; J: T" `) R% S server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 ?# \0 @5 k, P) r
% Z' N! V1 m* j" t# R memset(tmp, 0, sizeof(tmp));7 T: B+ p1 ~& M+ C9 X: p: C
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 v2 J5 ^7 J* h" P' ? sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress); k3 K4 Q8 f! F
server_msg_send(server, APP_CMD_LOG, tmp);* d. z" @7 K3 t8 G$ d
8 s9 A' F _& w, M( ^1 Z- e
upp_error_count = 0;
1 C1 S$ g) P3 `( r% d3 H upp_dmaq_int_cut = 0;3 s4 i) I0 L; t' h, t" k
// fill in data
& R* H" h D+ l8 D7 f uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
2 `+ I7 Z P& K# p6 w server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");, `1 u- f+ n; v8 G/ [' K
9 F$ y& C3 d* T& V& x // wait send success7 f; t6 e2 t" m
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 ?' F2 q" ~) t. z1 x1 {* p: ]' a+ [ E3 ^$ L
// make data node in free list - S; {+ |4 u& z$ g- o7 N& d
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# M2 K( o# V& s9 A& k+ { server_msg_send(server, APP_CMD_LOG, "upp send: success");9 f" S; K) p) Y: @; Q/ I
}) M1 n. Z( K: y8 M
return true;, }- a* \$ r7 L7 v; l) Z
}* T7 n" n& v# @- B
* C d& l; G" M* u: x
+ }6 K8 @8 _: \* v3 ^; T
2 [% D: \5 D j0 w* J
! ? L( y0 B$ ?& m3 H, i* L! H" |9 f0 \" u
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|