|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
2 R8 c5 T. V' N: Z( \7 Z/ e5 d! F, K& A0 O# [) d0 f$ P! y
问题描述:2 z+ p) k0 p$ e( E
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:! r7 w$ N' q$ |) z u
: u( `; n& @9 y l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 B9 [6 j) w! q4 Q2 F, n: g8 I
' {3 B7 b; W4 B5 q! Y2 m" O% N
测试结果如下:
' J. w- V' H. Q* t, \: P138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 `/ W. u L6 E* G- I" a- m
# p/ D. b. ?& _6 @7 X, K
. d; ?5 e$ i$ x# k! a备注:- l& T) L: l9 L3 @$ u
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起? e9 f" S4 z$ t, l8 W6 v6 \% O% q
2、相关代码如下:( z1 V* L9 h: p! @# F
//UPP DMA缓冲大小512字节9 m/ X( M! e2 e$ y' r: ?
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍7 w. X7 Z V1 p8 A
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" ?: N! `* m1 s- r& l7 ?8 o* t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 W% h4 p* j' N/ i+ ^: D' d6 ]! h5 W( Y/ A- N
( P2 w" R& @" U
//upp接收、发送buffer
6 s# ~3 c {8 z' L#pragma DATA_ALIGN(upp_buffer_a, 8)
, x4 ]# d, D3 d6 e#pragma DATA_ALIGN(upp_buffer_b, 8)
5 c) A& @, u- i7 g; N9 G: j' T8 Y- P( O
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];6 g/ ? a2 g' l% F( b }
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* G/ n3 s: B2 f* F
[& T* B7 e+ `
2 D& k+ I) ^; D L" t( j+ d
static bool server_upp_data_recv(Server *server)
( t3 s$ L+ {/ T9 Z, G) K2 x( j{) C* m& g# x% l8 B5 x4 r
if(server->upp_channel_a_recv == false) {; ~2 P4 T* p) D
server_msg_send(server, APP_CMD_LOG, "upp recv: start");# s: c0 a! e+ X% G
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
3 w, _: U# K) X server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
& z! X0 y: X, C) `7 i! k& N# @$ L' Z. @# {0 t
8 i M0 M, P% y7 Y( ]( e7 c memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);. a* y1 n: g. w. m5 c* c) }7 ]
2 C3 J$ Z* {/ J: ^: v server->upp_channel_a_recv = true;//
9 u+ h. d) I' E$ F! }" J; ? server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);0 A K) W$ ?1 m6 N0 P- ^( b* V! ]
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
5 r! }/ E2 U) X" @0 @6 Z' z server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
' y" e6 B) R y server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- w! W6 U: Z, S4 i8 D+ t" M( t
# `" n4 \, Q6 ~6 g
upp_error_count = 0;
2 v( A5 l3 @/ D4 b; x3 N! L7 K* I upp_dmai_int_cut = 0;% `+ ~) }( ~" |
5 s7 ?" W$ ]4 i* u' ]! F! _ // fill in data ( [8 E8 K' n! \1 H) [: K
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
B4 o, M3 S4 t server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. @7 R$ L. t# b) w% G/ E' x/ w }$ m6 h. u, _% e$ q) A
}
, P B) Z2 @ R2 d else{) M) C+ E/ x8 T
if (upp_dmai_int_cut > 0){
" s- d* J+ {4 t" c DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. _9 C( h! G+ M% y D
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 b7 c$ o9 j0 o# U0 Y
$ O- |! q5 }1 ?1 {& l, U8 H
9 o: [2 P, ?9 n //copy data to upp_recv_list_busy
* Q( Z1 ~: g9 G8 c. s( | memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 V6 [% G6 j. h, {. ?3 t, y: w7 N, a2 b$ w- z$ A
//7 ]' ^* _- O# j5 i& p' w d
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
4 J- t3 g+ H; B5 Y- } G8 h. q8 V+ r a
//
1 e0 f! z- W. C/ l2 I server->upp_channel_a_recv = false;/// h& v5 m+ A# V, o# k
4 w* F' ~+ T$ i$ ]' Z0 M1 D
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
! e i: z7 M' A6 ^8 h `& z }
1 n: { Q" O/ t9 m }) G. |" f! w0 {1 t2 h
* s: p/ Z7 m( v- U1 y7 E/ q/ I0 o3 y9 p2 z# v/ A- S& d
return true;
c- a8 @7 e6 D. o}8 T% M# f' x) p; e8 U3 ]4 n* k0 i
# C" I' E% D8 Wstatic bool server_upp_data_send(Server *server)
0 H8 w, g. o5 v/ T7 C2 d{
2 q" W. C7 `! E" F6 J, j7 | if(ListMP_empty(server->upp_send_list_busy) == FALSE){% L7 F8 z4 W6 _. K
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);) e; ?6 l$ B3 r! g/ h: l
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ J9 y$ C- t, ^5 u2 R6 t6 c' m9 Z char tmp[128] ={0};. e+ ~+ m7 Z) Q9 d9 \
( u# b3 U h- ?( c H; B& E5 S server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 T& ~2 A+ Y% h% J0 W$ U9 a print_log(server, data, 64);
! J1 I' i, F4 q3 N D
2 B1 C( ?4 H! i //* R6 e$ d- |! o, m4 l2 u
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);/ z2 @1 [) ]2 u: t" \
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ [9 k7 S& B% n# W1 h print_log(server, upp_buffer_b, 64);
; ]- Y2 U( W( W1 B+ c
+ R) X- T% h' f V1 U server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
: l6 K6 b/ G2 t2 ~0 d server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 1 g+ v- X4 t) x& v# \: `
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;- B. Z$ h8 L, K' d3 q2 b1 G& U2 s
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
" V9 v) o1 g; `2 L; g, Y) D) N+ h, B
memset(tmp, 0, sizeof(tmp));' W( R4 C' n1 |7 \) U3 V1 ~. e
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
+ f. `8 h8 ^1 ~7 @+ ~2 Q# ~ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 g0 ?" _& j9 F4 i9 ?5 d
server_msg_send(server, APP_CMD_LOG, tmp);
& X% H$ q3 D4 i. v5 w0 s. N: y, k x$ d2 m3 Y
upp_error_count = 0;
( L% t3 z4 I9 j7 \* r upp_dmaq_int_cut = 0;# h& o" G. }7 t' E% h- s9 n! V& A
// fill in data
4 C1 }4 W$ O7 d9 y8 @ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 7 B/ w& j2 {5 d: Q
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");2 B- q0 E$ ?* _3 `% q
4 y) r+ Y' g1 [5 |& Z+ S7 t
// wait send success" E( c c& k6 E% g( W' I8 N
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! P+ b2 f: W+ e5 N
2 c! T6 C) d; q; t" A+ v4 f- A
// make data node in free list
$ V6 ]1 l! P n ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. p4 M' Q/ L9 _" T server_msg_send(server, APP_CMD_LOG, "upp send: success");8 s) Z# ^* C* {# X* }1 w
}
2 [6 }5 A, s/ _( t: l! r6 j return true;
' H3 X2 b M& U# @, M8 O& ?}
: l. x+ }* R9 v+ x% C3 m1 z- S$ v: Q( _! A9 V7 c9 b( [4 m0 L3 A
6 D8 E/ @) ]& F8 e& a
( ~/ K7 ?8 ?! j3 [. `; k- L+ m. o( F5 o$ `& Q: k
7 O _, B7 v; a- E' x) L8 Y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|