|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 % Z y, I* p/ r
s, o, o: u( x& ~1 E' L7 N# i
问题描述:, r6 F% `) J% A1 j m
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- ]8 T# X: h- I. q
{/ l7 Y/ f8 V# t4 h4 M, Z
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。- {, k' G( p" S' y( d$ Y
, ] u, M9 q1 t L, Z, Y) Q, e
测试结果如下:
7 V; m8 Z2 J+ k4 ^) J# w138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的? L( M8 N" n& J+ t2 L& v# h
) J5 w2 `0 Z c7 i. U d5 i$ g$ z- j. I. i2 j1 W" Z9 B
备注:
6 O+ F& J$ f- o4 b; w6 c1 {1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" Q3 P/ M7 B- ] L( w9 z5 v
2、相关代码如下:5 \/ U0 j4 ]1 V P V. ?% u
//UPP DMA缓冲大小512字节
* I0 D8 m; j* G0 m1 m4 ?#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ ^) s+ S8 I! t4 a#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT f1 |5 M4 a4 U( k
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)' z' i2 l1 d! D5 g% ]+ r
1 |; {- M% U* k; a3 e9 n
\0 d5 Z6 U" |/ b6 y8 P" q; W5 q//upp接收、发送buffer' r) ~% x" F; W7 W" U2 S4 m
#pragma DATA_ALIGN(upp_buffer_a, 8)
7 g9 u' ]- k5 d. [# z/ d& v+ V#pragma DATA_ALIGN(upp_buffer_b, 8)
7 I1 u' Q8 V4 @& N2 f. c; v2 S3 m9 ^0 I- Y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 j) S1 C8 ^; j( M% r& ~" K( L6 U
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* Z: c# X, S" c' P$ H. l
5 \7 y6 Z4 x( f; Z5 p S0 L- c ?1 A, B# P! y- [; f% D% R1 `1 c; a
static bool server_upp_data_recv(Server *server)
+ O* Q `6 D6 Z{# M5 Q- _, I2 I6 O; i: o7 C, v
if(server->upp_channel_a_recv == false) {, |* i0 c% ~' }9 r% Y; I: O z, K" D
server_msg_send(server, APP_CMD_LOG, "upp recv: start");: [! C, x3 z$ z( M/ M6 X7 Z" ^
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {8 n' r* N; `4 J- D- F" S9 v9 b
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 [# h3 ?8 J2 U8 Y2 _ W& D5 M& | G
+ T6 R* y+ U( n- f2 h; B0 ]; Z memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% ?$ z0 x) r+ b9 u$ X# @
8 [) I; E9 ]* `) L! F1 d; q5 Z3 o
server->upp_channel_a_recv = true;//4 ]- Q( O ^' e
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);" x3 j8 n3 b$ V0 X9 O
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;& W7 e; ~9 L1 G- A, s8 g% O
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;' t" ^) I! ~2 V! d5 H
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 C( \9 _) m( J8 o) O6 a0 D0 s+ o( F
upp_error_count = 0;5 ]/ y! h) R5 }9 y4 c
upp_dmai_int_cut = 0;
9 n' C- H+ D* h& x/ K+ v: L' S+ Q) r
// fill in data : m: z& X1 ^% Z( a! k4 B6 O
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
) ~4 L: B# m- b server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 o& I4 c$ X4 e
}, T9 W6 ?+ H& P7 J2 V7 T
}
. e8 _( v$ `( k* i C- R else{1 T. O1 g+ z9 {# W0 Z. R
if (upp_dmai_int_cut > 0){$ A, Z% K @- G/ k3 V& o
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
9 o; b2 v- a; l- ]1 P" m8 N) A Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
% c( M. y+ j* k$ O& e. y2 \" [" ^
9 m. ~* e, S! J
6 Y# l o3 n! C, m" { //copy data to upp_recv_list_busy$ E6 H4 c7 l& ^+ d; M6 e1 R
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 z; J3 g O, ?! {8 d
4 d; f! D( a- d( Q( b: d; F" X //5 h# I! S. B8 h' _! B; ^$ L; O, Q
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& Z0 X( H& ?6 z0 z3 ]
; n3 i6 P/ w! o; g) Y4 ^
//
, @) S7 a* f. i. t4 [ server->upp_channel_a_recv = false;//3 R$ V7 p6 R* Y d+ ^, ?
3 O, B; C7 `0 l
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
' W# P; X/ R- a: T f( ]4 _( C% P0 I }
* T1 o5 j$ q: }9 F: ^2 ~; z" B }' y, g. { z0 z4 o {1 N- P. O
3 S1 M+ L& V$ @+ ]6 H# ^) d. S
4 k6 | y+ |/ o return true;2 x7 }, V! A" L; J9 y- X
}7 h* p+ C% d D$ v- g" B
5 _, S; [' r$ x. N' x, g
static bool server_upp_data_send(Server *server)( a( L4 p2 R( A- A
{
: J$ s- m8 R1 ^8 i+ b2 o- q' q if(ListMP_empty(server->upp_send_list_busy) == FALSE){
U4 a' }! x! g+ J: `0 @3 S Z DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);" E2 q$ f2 z' }. w
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* v {2 v' y1 g4 M3 I# p
char tmp[128] ={0};
; L, \0 n, I) e/ z4 e- k/ }0 n' v% A2 i |' }- X/ Z+ i; J
server_msg_send(server, APP_CMD_LOG, "upp send: start");
f1 @. |* w$ ^8 n4 N+ v5 U print_log(server, data, 64);" \4 P5 N+ ^% O; e7 H" X9 H* E
- O- U7 M& J% A/ D4 \% V //
& I4 y5 B5 e7 x: s memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 Z/ J% e) ~. Y5 p9 t( p/ J; B
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ j* t4 R8 u/ s) I) w6 h; B
print_log(server, upp_buffer_b, 64);2 n2 g- S% Z, \" x, I
( F- G& R# D! {3 B0 n# U: ~' S4 E server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
$ H `+ Q0 i" C7 y* Z( |/ w server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 2 e, K8 X' q& X/ G% K9 f
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
! D5 y2 U2 r3 D server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, O* u. J% U! v! v3 R4 }' i
" E; g( J5 r! J* y& p
memset(tmp, 0, sizeof(tmp));* f, h9 @* D2 w) t; {- n
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ! ?+ K2 F3 v1 J- U
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ {, I3 ~+ a# N9 p
server_msg_send(server, APP_CMD_LOG, tmp);; m" J; j& N. u% r
U! T8 y! K( R) F: f a2 _" g upp_error_count = 0;
8 G- _$ p' g. d" C4 f9 ]4 K upp_dmaq_int_cut = 0;
7 [% u$ i# [. |7 F // fill in data - L3 N( ]$ C5 U% j! a# |
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
& v- i% A6 Q2 l4 A server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
" k0 m0 H" O% n8 C" [% a
' o4 S! m+ n: R7 Z // wait send success" w3 e* l A+ ]# M! M9 }
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ; \8 Q |& l k l) b+ B) C+ R
. V- T% M1 \5 R9 \; n
// make data node in free list @2 u! X3 P$ i3 i* _9 G# \
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);7 R& f5 L+ C7 d1 r7 U( { x+ P
server_msg_send(server, APP_CMD_LOG, "upp send: success");6 M) T& p9 b$ a. t. n
}
) S4 I+ n4 V2 Q3 |% d* P return true;, ?; x1 d5 m9 }9 k7 G* x. T
}+ u! ?$ b! o; H0 q, k% H4 r
& Z1 ~; U" q/ u H" X! b0 Z
- { w9 Y- Y! u' M, O* D+ A0 u
: m/ w1 \7 R" L& p( S1 F2 A1 |
: `' b$ e5 V; x) [0 L
5 Y7 q/ a$ u% W# C' P |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|