|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# s* Z! b( _) e8 V: p6 R* a8 C& Z* a
问题描述:8 N, I! E) f! X; b
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 c' L" N! K* U/ d$ E
2 c+ t& p0 o3 C
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 F$ M3 P0 \& A- `/ J& m! c* L. M6 j% ?7 ~! v9 b
测试结果如下:
8 [$ S1 ]+ u- [138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( v, q$ x' w, k8 l' Y
' m4 N9 R9 v% b' b
& s1 b. X) J1 W1 ?备注:$ _% a N+ t) ]" s- J0 y
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ q' z: \' d6 X \+ B- S# @/ r
2、相关代码如下:
" F- f- u7 t$ R# n3 X//UPP DMA缓冲大小512字节
! n) {2 L% H' m% p6 U#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ B7 x3 Y+ w! G, H$ }
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
. P) O: T% E2 [9 y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" W8 m" T$ I! [+ r) m9 D2 |1 n5 R( U9 T4 u5 t8 Q% O
8 j$ c6 E' [+ ^
//upp接收、发送buffer
$ a! Y) K& i. D3 n0 e! g#pragma DATA_ALIGN(upp_buffer_a, 8)
& ~0 w2 v9 a3 k) k5 r% d$ h' `5 G#pragma DATA_ALIGN(upp_buffer_b, 8)
' Z4 f8 O9 I% }- v" w' j1 i+ t1 G) _. C( F2 a" \8 k3 F: S
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];8 n ]8 S+ _# M& T# G( q
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: ]9 S" }$ R7 r! r$ i) x0 @1 t+ @8 H' }
4 Z- Z5 N/ c) n1 ^6 B, n& }1 n; F
9 r! U2 H3 b8 x( b. m. estatic bool server_upp_data_recv(Server *server) 8 n* C8 M: m9 C4 w
{" a& l. G8 F; u* D9 }- e2 \5 Z" k
if(server->upp_channel_a_recv == false) {% v: P3 f" [+ E0 `3 l' _8 f
server_msg_send(server, APP_CMD_LOG, "upp recv: start");7 M% {2 y* O9 ^( l, }! B, c
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 Z$ W: }5 u, c1 I3 u+ b' C
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");, [8 L8 q& U* Q
) y" r7 x: _4 `0 ?, P5 t: k, L+ |, C: W8 \, B8 Q# r/ e
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 l7 t) P s$ W0 J" e. M @
* @3 R- C/ l3 {, K9 U( J, G5 n& @8 o
server->upp_channel_a_recv = true;//6 l5 W {8 }7 T) A( h! Z5 \
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);; @& o7 s( J8 H3 l& {" @
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
4 S# W6 a: N* U) A server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
: A( V1 Q! r) { server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
/ c& v% N+ J# Z5 u. S5 C. ~' X3 O5 J" P9 [
upp_error_count = 0;. g4 q, q) G9 \
upp_dmai_int_cut = 0;7 L, e3 g5 O! g( k1 H" G' g
) P+ H& ~% p ?1 _: h
// fill in data
5 w; \: N- a1 A5 [ I7 c uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. S" _7 o4 M; M6 S server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
6 b! l1 G4 w v' W D }. Z3 k0 g' I( y9 c: }
}
5 d& c1 a- l' l2 U0 L. E1 D1 W z8 { else{
: A5 e. q$ J4 S; `; }+ B if (upp_dmai_int_cut > 0){
5 X- T# }& ~& g7 |3 p& q7 J( P DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 z( p1 B0 U" S# Z, d: j Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 H. A& o$ ]. {3 v1 ]
% O' q2 S( R& s2 d* Z8 U
3 @. A' k3 _* l' V# {6 a7 u3 F4 V
//copy data to upp_recv_list_busy
( g' {" J9 D/ o8 l3 n memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
$ s1 H. Q" {% f
: L2 d5 J: l6 B1 u //
7 K1 ^: Q$ s0 Q* V- A ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 v: c0 _! h! [% s2 }" Z$ R0 [8 k3 q1 f. [7 Z9 k& b* {4 s1 T3 V9 b
//& A% X6 E* O2 X4 \6 W
server->upp_channel_a_recv = false;//
% c2 p: v9 y7 w' C6 |! T$ t0 r1 S9 p; J4 H
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
9 W* P: h/ k: B _ Z: n) V9 [ }6 n% Z/ {- Z7 X7 j! d
}
/ P3 k! ?( T5 E# G" @1 }- u) ^# ^( K/ k: f( X- X
3 Y9 @1 P9 d0 A) j4 ^; N return true;) o* h" a F: S
}: @9 c2 P7 ~0 l7 o3 ], d
9 ~& ~# z6 M. k% rstatic bool server_upp_data_send(Server *server)$ Y# n0 t; H$ l ~: q3 i
{7 |+ N% } l6 W$ y
if(ListMP_empty(server->upp_send_list_busy) == FALSE){* Z a: [) ]7 M2 W+ P
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy); s( t! |' J, M/ e- o5 D
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
) P. M- j! n1 n4 T$ i7 F1 D9 [ char tmp[128] ={0};
+ l) k9 Q/ B0 f% G- v, E
& S% U# s. _7 K. n7 B. _& J server_msg_send(server, APP_CMD_LOG, "upp send: start");
" M b+ Z7 u$ M# |# y5 P) J print_log(server, data, 64);- F1 r: W9 H( k9 w
% P5 J$ {) \& U% q n A/ L) b //) e% [- |5 W1 a( d6 L
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);7 G7 M* T( z# y/ e- t( e" i. j4 {+ M
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
3 L7 S7 t3 D$ H7 L: ?% M8 j print_log(server, upp_buffer_b, 64);
: o% c5 u( G0 n& S! |1 [, g* w8 W8 \0 `8 F% I- ]0 ?
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
. P# a3 ^& z& w! m. ?; |( J server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
4 l7 O1 G9 p. t& Q( k server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
. ^6 E4 A9 s( w' r- K0 m# \ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 Q. P' v2 Q; \3 y+ t" w. b4 q1 C# i. h
memset(tmp, 0, sizeof(tmp));, g3 Y" Q1 B% ^9 I" ]
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; Z0 ^5 E2 l* z+ V
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);. e$ x+ o5 N+ h7 l2 j
server_msg_send(server, APP_CMD_LOG, tmp);" Z! P) Z1 d$ i/ b5 u
7 G+ W6 M# R( O6 f; v! U5 [. T
upp_error_count = 0;
4 U I, R& H0 p% [2 ^ upp_dmaq_int_cut = 0;
5 s4 e% U2 S7 m. C: a9 M( T2 G // fill in data
+ N% @) ^& l: K+ O/ a: R* P uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ( V6 B4 H+ z3 E9 h7 @
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
& l; X- J' y# d! e2 S( K) n$ ? y# }) Z7 |& ^. U* _
// wait send success/ K- X1 Z t O' F7 W5 J: |
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 8 E; \4 m1 Z D% Q! p
8 ? \* l/ q% e( {) x6 n% l& E" ~ // make data node in free list
- o" V. I# O6 ^) {$ Y ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
9 G( S# p5 @4 ]- Z$ d5 l server_msg_send(server, APP_CMD_LOG, "upp send: success");6 W( h, j7 U; p$ T
}5 n$ I* ^/ C* ~4 V+ m4 Q
return true;7 T b# u1 j/ P$ v) L' W
}' V' `8 `! Y/ _5 E' q' D- F: s: j
- e, C, j! E; T4 z
. n K7 H5 u: t( p% g) ]
( s8 ^ o5 u; W I
5 A9 D' X# W7 N4 O* N8 m, j' ]
( s9 w$ B' Q0 s9 O
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|