|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ; r# F6 B7 t. |5 ~) B/ X
! `% f1 I; [7 a$ G$ e
问题描述:
7 b5 _ G2 ^& v) {在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& x6 B& Y8 C9 k6 s: w0 {# {! [
$ z. Q- c; g6 b! {, z6 c s
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 b& K: a1 R, v3 ^- d8 R5 O5 X
8 I% p( @, T) V3 T测试结果如下:2 ]5 |1 m: }, Q$ }! ~+ B
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- f- ^# y" q6 \; b% j( f4 ?8 c5 I
3 ~# f- ?8 j9 f8 s- C) \1 a4 Q0 ?/ U8 b
备注:
$ J4 u6 S1 {& s8 o( Z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?- X6 \3 r E% H0 c6 |# G1 _4 L
2、相关代码如下:
) x) `7 R7 _% B3 _1 H//UPP DMA缓冲大小512字节$ x2 ]; ~+ z! X7 U; }$ h
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍1 o/ j7 k! r" C* U& U
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( U* w4 \/ x% l3 J#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
* T8 O# c/ p; w4 u! T/ Z8 J! [8 Q4 L7 W+ I( C! S2 v
- L+ S1 N7 O+ u" R# D
//upp接收、发送buffer
4 u* b( m3 \2 V& @% k#pragma DATA_ALIGN(upp_buffer_a, 8)
2 A% w6 D& }$ V- x \, u: `#pragma DATA_ALIGN(upp_buffer_b, 8)) `' F6 X: ?' l/ R1 o: J S
1 y2 o$ I3 ]! D; y/ `4 Z V% I0 C3 h. dunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! v2 J8 t P; ^unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];/ ~7 W: G3 e. |* L2 C+ A/ z
6 D0 C! h/ A+ a. \+ `; t7 `; f1 I4 h( k$ o3 A# ?
static bool server_upp_data_recv(Server *server)
; H I1 ?4 T1 `+ q{
7 |$ Z8 t7 j: P: ~" ? y if(server->upp_channel_a_recv == false) {2 F) K" B# H. h& j1 @9 V' J
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% P! K: V0 `7 Y( s2 T" _% h2 j$ Q if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, ?" r4 ]2 r0 n+ o* A server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
7 w7 v6 C6 g# Y3 F
+ {4 \4 J2 C! l2 U' S. P0 ^# x2 q; q; r) _ F7 E) L
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
4 W2 ~4 j. g, [; z' L4 R9 K* G) x1 m+ D, C9 o5 Z
server->upp_channel_a_recv = true;//2 ^. F* @+ V- k2 ^+ P; ~" i! k
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);8 v" r$ E N4 T0 i) }+ M
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
$ Y6 S- G. X; V$ f+ f* u0 @ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
* a4 `! F$ W( S2 E1 M server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 W N8 p& A, w( A+ x6 f5 y- h8 S) T
( D) G% Q1 b0 L7 g# b0 z& |- ^
upp_error_count = 0;0 f+ F q+ B" ?8 U
upp_dmai_int_cut = 0;
: N: H m @- \
+ r% }# ?7 A; Y/ o // fill in data + _) I. h) R* c s- B
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, w" F3 d) ^4 w- _7 C! l server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");" }7 r: T, h+ `5 p) V) B1 y% K- V
}
8 ~1 `4 U: |4 _5 h c1 o) ` }
u9 x" n$ K8 R& ~! ^ else{7 I" |& H6 Q7 u+ D1 o( { \
if (upp_dmai_int_cut > 0){, |! H3 Y. B9 {
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
7 v* n/ W: C% z( U4 N Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! i) M$ y* O% Q( x3 [( N7 u; p. H0 f( T( Q% E0 _, w$ r
/ N n5 x- r4 H7 j y/ { //copy data to upp_recv_list_busy9 f1 i% j- M% @8 Y* P4 r7 P* v8 E# z
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
0 z+ C6 e8 _' l2 A% e1 j
8 A3 S& H- h# H/ B9 _4 I/ Z //
2 |7 t' G* B; K9 n: Z" |, v ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
, m% R$ b2 s( p0 d& {7 c
; D* G3 u2 O2 j) W //
& T9 p4 D5 S9 u4 \ server->upp_channel_a_recv = false;//
m: F' \, Q1 r8 l# Y9 [( e& Y* Y
) J& K8 T3 B. e6 v& t9 H server_msg_send(server, APP_CMD_LOG, "upp recv: success");
k& G' O! V. K$ d9 a }6 @2 w1 ^% k' {6 m
}
- w! ~+ ^, q. m- C E
2 H. h2 f& M3 F! ^) v. g8 _: ]& U- p2 V& G
return true;
9 e! M8 E1 I' C. t- B4 Z9 K}- ]2 s3 ]; U2 L. w# N' q8 |( x
S( k5 H! ^# I0 w9 D. l3 Bstatic bool server_upp_data_send(Server *server)& O7 z$ n! O F; \& c; v& |) A" T& a* I
{
1 f0 P. ]' K7 K+ b if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 G" g. q" G9 o DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% _# H8 j; P! h unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 V7 A& v* l' g8 K* P char tmp[128] ={0};1 \; m5 n) \8 }; \1 G6 o
* o/ r6 q9 q+ W7 G
server_msg_send(server, APP_CMD_LOG, "upp send: start");* }3 \5 a6 I+ U3 ]1 f/ C1 T* H
print_log(server, data, 64);7 S5 R% o3 a0 _4 O" W7 L
+ y* I7 L* ?! x4 ~: Q7 ?+ |
//5 q1 R( u3 [0 Q) o/ W- q6 T8 @
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 l, a# u- I2 T! q' a memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' X1 e" E' ?0 [0 J: w, y print_log(server, upp_buffer_b, 64);( g+ @2 f0 \7 t" O
. C/ u J( t+ z9 x
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
8 L5 `% K9 N$ i) |/ ? server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
) ~: Y4 z( x- t7 P% g. I server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;) M$ m8 n b5 M6 D! t+ f7 ]
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;. Q/ N1 w7 Q& c% r# F
' c4 @6 p& e) F( L" n
memset(tmp, 0, sizeof(tmp));3 n3 J% i4 |, a1 H3 s# A# P! i
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 r- s0 p! a; U" a3 c, N% O' H
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
; Z' T7 i0 m! j) A S server_msg_send(server, APP_CMD_LOG, tmp);0 B/ w5 O. Q; j2 k) Y: q+ O
4 q# Q: F4 M0 g( c- P1 | upp_error_count = 0;2 L" g% u. Q$ X& @
upp_dmaq_int_cut = 0;6 i' I2 L8 A! g+ I* \ a: v3 k9 B
// fill in data g" `4 u/ L* u6 i8 z+ c
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); $ z! z' }+ Q/ L
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' }/ X1 o4 s' q) H% R0 M" ^! R4 a. v3 J0 \' K* }
// wait send success& a* f. c( Q# x4 x: \" V) c/ D
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
; @" H$ N3 Z+ E
! c. |+ j" _% w) z0 y% S/ s // make data node in free list ) [, H3 N& s, R) T h
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);8 H- D, W" j" _* G5 Y7 z
server_msg_send(server, APP_CMD_LOG, "upp send: success");9 @) H- W, B5 V- ^+ A# \
}
6 j) Z# ~* {5 N* L3 R return true;
b; l0 Y0 \1 t# {& R$ ^6 a} M3 b6 h8 Q2 ?% `0 p
9 |+ h9 V: y7 t/ r' Q7 T) w* p4 A7 f& q
# C7 E s" I: k) ]- B
4 J" D9 J0 P0 `$ `6 Y( C
/ W: _$ W# E1 ~4 `3 C2 k, o N
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|