|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 . Y% K8 s* ?( _# {
+ Z) y' \3 @; X' H问题描述:, K# y+ a8 |9 t( _! ?8 J
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
# d% u) n* A, V# D1 c' s9 k1 t. v
/ S0 W6 c+ R! e图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: l, k2 ~" `. `4 d& v9 C
p6 e5 Q, x9 K. D/ T, K- { B测试结果如下:, J0 }- f% x/ b( y( r, C7 s: l
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( Y- n* n4 `. q E. z
/ t6 F( e/ r% Y8 V, S# u2 \
' u1 u8 E6 x$ H; ?; L备注:
/ h/ e$ H5 h& {1 F- M1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
0 B$ B6 {/ e6 Z! I, z2、相关代码如下:: j! \* R/ w. |) x
//UPP DMA缓冲大小512字节6 z4 A& p6 {7 x6 C( P
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍% L9 N& [) D. h* {- y$ X
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' v; u* f1 m8 G" t% X& U' i
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- e/ ^; j- J) \& }) t- \. M1 ]) Y' N: L2 L: I3 Z
: J8 J( |4 b& { Z T/ C" r6 d5 ?
//upp接收、发送buffer
* v+ R8 x8 J, i: i" h#pragma DATA_ALIGN(upp_buffer_a, 8)' L: T& {6 L! k* U. Z0 K
#pragma DATA_ALIGN(upp_buffer_b, 8)
1 q! {& w( v8 E( Y. d7 o" v, X
4 j; a7 v. ~! tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- @; _8 W N/ Q( m: D0 vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];6 s$ h: {+ N8 i) l4 C- k
7 l: e! X4 {5 N4 f! V" w1 f5 o4 V
7 Q" E/ G9 E1 M2 `/ dstatic bool server_upp_data_recv(Server *server) ! b) ]+ o* @! H
{
9 F& t) _' D' J, J ^9 Y if(server->upp_channel_a_recv == false) {9 S5 S: z. Y8 M3 m E) j0 ?
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
P: k$ J+ k$ e% {% K7 l8 G7 X if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- k- q6 b" J4 h, C
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success"); C' ^' S) I* A; [0 D( z
4 U! f8 f6 H- J8 {7 w& C0 |0 k* a" s( e. J( m
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 d9 N) R- E- K! G
6 X' ]' F0 e% m7 A: N Y
server->upp_channel_a_recv = true;//" U K% n( K3 w0 j u! @
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
/ ~6 `0 Z8 K) x3 Z server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;' r1 K k+ B- c
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
# ~" C% b6 d# M3 e" g4 V! ]+ | server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
- b3 C% f |; c5 j" G* p0 w O* q, x) N- b, w w E! M F
upp_error_count = 0;) V% C, a2 `( I
upp_dmai_int_cut = 0;7 j# @' g( ?5 u) `4 W. o: w7 L
, i% O0 Y; n0 N( q V // fill in data ) k5 S7 d0 w- e. q( d- e3 [
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
& w/ Q; S# D. u) q+ o) X9 r) T server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");6 y9 `+ _) B2 x
}% W! r& D, y0 R& B
}
+ R% a0 W( Q& u else{
& A$ j5 h; ^3 Z: y if (upp_dmai_int_cut > 0){
' d. F7 l6 P3 W8 ?# t DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
9 L2 G9 o6 T, I8 w' o$ _ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
t8 o+ a9 M; m& a7 B
- P% i* r. z: U) L1 ]4 {8 j n5 w8 K6 z. S1 F+ r \
//copy data to upp_recv_list_busy
2 S9 ^: w/ Y' y+ M9 _/ b memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
7 A, |' s4 U1 P" `5 K( `& a$ V) Q! F/ ?
//
) [7 Y5 f/ q4 L- N% {9 {: \' O3 y ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. [9 @9 B" o3 O8 M
3 l) D/ h- q, s2 X1 y //! [" I$ Y$ ]" x4 ^ ]
server->upp_channel_a_recv = false;//
( {+ c& F, k# X& A$ z
' e" Q3 Z& H, u. ?/ J server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 p4 u+ D8 F& C5 u }+ x7 j W$ l+ H4 c9 {# L$ b
}1 n7 R$ j# T% Q3 b+ Z& Z8 w
3 K8 C7 L: n- Y' H- l. K
[0 X& u* G& A" D9 H
return true;0 P$ O) p( d! S- \" B& W, @" L
}
/ S' a, f/ G1 F- f
9 D. ^4 N1 Q( e4 w0 E! j$ C sstatic bool server_upp_data_send(Server *server)& Z3 S# W6 \6 e% c
{6 T( x; v9 Y- x$ ^; g6 o
if(ListMP_empty(server->upp_send_list_busy) == FALSE){: H" V0 C& Y" A/ @: n$ U
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 Y2 O: m: w$ O unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 C( }1 M+ }/ G7 b4 w
char tmp[128] ={0};: F# d m2 v4 {
# w& f! m$ t; }; Y2 Z4 Z6 n
server_msg_send(server, APP_CMD_LOG, "upp send: start");" O$ ], J8 k8 w& C: k
print_log(server, data, 64);7 }* _, ]1 q: o. H5 \
8 W3 I3 S0 l* W& V; p! Q //2 r! y( l5 K9 m. s
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) |- c( m% G2 [8 H! T( D
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);5 n# L( K- V4 R
print_log(server, upp_buffer_b, 64);
- H7 @: v, m8 W2 @! o: m6 ?* ]& _# q- }4 T
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);* H: \ I9 R. A9 |4 ]5 i: e4 D
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; % i! R4 m" J2 D$ |. A
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;$ s: M$ i/ N# S/ g
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* b) M8 F1 X( N& l4 v7 @) c
: ]/ p8 _5 ?( H4 x7 i/ e3 o/ w* n memset(tmp, 0, sizeof(tmp));
7 W `+ x- K* _: g' G sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; P6 k* Q; D3 x( I- l3 j sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
; I& t, ^- d" L% S# w server_msg_send(server, APP_CMD_LOG, tmp);
2 Y& M- M* h; M5 h7 z$ b. A) L- |% h1 b8 C6 M" ~9 I0 o: T
upp_error_count = 0;
4 j- n: A- @0 w# R8 V upp_dmaq_int_cut = 0;
' t! `6 Z! i9 J( A2 ]; Z" O // fill in data b, y1 N: K0 M( Y7 C' X1 L! F/ S
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ ~2 e# o9 y' ]9 a2 h server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 N/ m% L. s9 u7 O& P- ?6 l7 @" P' o0 @# |) G5 L4 I. C6 Q
// wait send success
: ]- N9 S7 _3 ]: I while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
! ]9 p: \' c/ _5 {" Q% E6 ]8 ]+ V& D, q. K5 T- j, _* D, }
// make data node in free list 8 z* r; y& T. b" s
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
7 ~, c2 g7 w; @& g a% N& [$ { server_msg_send(server, APP_CMD_LOG, "upp send: success");1 `+ C1 Z+ o+ j0 R) e
}4 S! g& \# e. [9 }: V4 S8 G% ~
return true;1 `' }$ W* k9 ?% f) \1 \
}
; I+ X0 z1 e" L% U
7 N. K, x/ ?) W; I- q) t
- ]! A3 q" X! [; k U$ c. i+ r- N2 l6 @! ~
4 ?! q9 w5 a! E- I* q+ p# W& a) p' T: U( V
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|