|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 a3 j/ V5 E s8 o h
g4 F d4 S# q3 g- X1 G# ]3 B
问题描述:. a7 g+ q0 K8 ~1 v& H6 B9 H
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ v3 a7 s* E* o( {
7 K8 |9 g. ?0 @0 d; j. Z- Z
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。# a, b9 R) B) B% i0 _$ S0 N w
- T, m' v6 _9 o: k/ [9 e测试结果如下:6 k5 ]! L* z: V+ A6 a1 [6 m
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?5 n; M" W# g3 o7 x) }2 [' {
8 t2 r( e! C# ?# F n1 N/ y, b
& f( w+ w. `0 Y# @$ G备注:: r/ Z$ X, N: Z* Q
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& L! V, {# |8 p. Q3 E2、相关代码如下:5 L/ D' ? `1 s6 f
//UPP DMA缓冲大小512字节$ [' _2 C2 K' V4 j! m
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' @7 h3 m* F" S" n4 z! D- S
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 G; p# O% v- P' t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. J) c. ^% j! V* W' n+ m& t; ? }6 q. j1 S
6 J4 E; ^6 {$ |4 S6 a//upp接收、发送buffer
0 A5 G; M* a, y$ b+ s, l: e#pragma DATA_ALIGN(upp_buffer_a, 8)
9 k- ^. p. ~7 z4 d# b; w- ], n# d- ~#pragma DATA_ALIGN(upp_buffer_b, 8)
$ K- }# I* K' l
. r! V& ?8 S/ k2 X% _0 X! @: C2 nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];; ]3 ] B+ I7 ~" M3 v' G5 q1 Q( E
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) O4 r4 B- @% R0 y8 f" P9 G
- J2 V; ~6 z+ N& [/ r
" m9 Z' b0 L* S4 ?, d6 Astatic bool server_upp_data_recv(Server *server)
' I8 R/ v$ w% ^* E{
% R. {7 ]. d. [+ y; ~6 y' @, c if(server->upp_channel_a_recv == false) {# C- b. D# k: ^! {
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, @: n I' b8 B. H4 z) X+ D* H! | if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- N( Z8 z: I4 F1 p
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
9 }: ^( |" _2 p/ h4 F' N/ B& W0 o) W9 @
# l& X- N1 W7 x6 p$ H
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, ^( C: |3 h8 j. B+ c
/ W' O- }# B+ r
server->upp_channel_a_recv = true;//% |2 W* b! y O0 D" P
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
4 p( N1 C( H5 {$ c3 E server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;0 L' ^! B! W: X5 Y
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
7 |5 V( ^/ K* @$ H, ^; ~ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
0 j, v6 T) w4 E( w- G5 A5 k. u. c% w% q5 U& ?' p7 q+ {% k( B
upp_error_count = 0;3 ]3 [" B/ W$ l6 L$ k* Z3 p
upp_dmai_int_cut = 0;3 o {" }; O9 \7 v: Q
- C& s' y! c: T1 b( f5 u // fill in data $ T8 s) J8 G- ~& j. m- g. ], N0 z
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* ]0 T0 `% A! g0 N9 m6 V9 }8 ~ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& z% h6 L# ~' c J7 f; G+ ^ }
8 d1 N1 N4 S7 O" @+ a# Q }
8 O6 B |9 G% Z/ _( q' y else{
' e5 E. i1 x; A Q if (upp_dmai_int_cut > 0){4 k1 j7 g# ^! b
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);# F% _: [+ G, W6 K1 @; i
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);, L; W+ t1 p$ x0 X
5 G! r( J0 g9 H/ e6 I ^
8 ~3 [2 D5 s7 T$ y4 ~ //copy data to upp_recv_list_busy$ e' o+ u9 t( w* P
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 }8 Q4 G' i; H
. H) d J, z- g //
$ D# w/ o: k) t. [& D ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 _! P7 G7 G, A% p" d! i
& g1 N7 { D2 X$ b* S* s' r //
" P: v8 p- `0 q, ^4 I server->upp_channel_a_recv = false;//
1 h5 j! y( R5 I
" F9 y$ E4 P# G! c7 a server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 F! d' d/ I# p }; E1 \% @6 l7 @- g* B2 [
}
. b3 E5 _3 \6 a1 I5 G1 H ^* `! Y6 B. I2 \) n. y- p+ c+ f
$ L: H4 ^- W% s- _# |$ P: a return true;. s! o& ^( H4 O1 N# l
}7 D! R' w A& r
! i- e* K: R$ L* n( Q5 C
static bool server_upp_data_send(Server *server)
3 x8 K) i& e! \6 l# c4 `9 V{% m* f3 n2 E6 {$ ~. w) V0 D: p
if(ListMP_empty(server->upp_send_list_busy) == FALSE){* U+ [3 Q0 J6 ^" R2 y9 X$ J
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
, h2 a' y( x0 v& D& W5 M1 x& x unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% O9 O) Z: K; {1 ~7 }6 n char tmp[128] ={0};8 o5 v( K5 p6 Q9 h
, B2 j- u- I: m9 R9 T; g( _. U
server_msg_send(server, APP_CMD_LOG, "upp send: start");" I: k' u& f0 Y. k( g) `3 B7 S C9 Q5 |
print_log(server, data, 64);
1 W2 G, m) Y" X
. s7 U4 F! L1 }& P( X' b //
- f2 _: I1 n( ~: I$ I+ ^ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
# L/ F8 b) f& g; S memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; M- J3 _0 o. U9 Z& i
print_log(server, upp_buffer_b, 64);
' W2 A* \" ^. b0 U( t0 \4 w9 A. z5 R* U8 L" d
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);: {* \$ r" l# f+ _: `1 o. L0 l
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; , G% F5 B1 o/ [( u! i, V3 {
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;' i0 u0 T5 S8 V" R2 _
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;1 R# i& L- I5 @& q" |* z
4 H9 t' D7 u% B# _& i8 _ memset(tmp, 0, sizeof(tmp));# k8 ~9 B2 V; h Q. g8 j
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 O9 y5 K9 g2 o/ q0 }# B" N sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ ?1 i! a1 B0 f6 X: S) O server_msg_send(server, APP_CMD_LOG, tmp);
8 F; x1 n( h; O9 y3 m+ ]$ {' n9 E/ C9 I
upp_error_count = 0;
" p4 X4 V( c. x upp_dmaq_int_cut = 0;
. x4 y* }9 T, K' A6 h1 D) n$ ` // fill in data ( F/ s( N6 r2 K/ p3 v$ q4 S
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
- J- Y& R- B# Z6 f# F8 m server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% p2 k8 c' G" B# K9 K( z. n
# r! f5 W- p0 ^* L9 I6 m8 l // wait send success
2 E8 @8 A; _2 e; o( k while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : W& D* |& i% c0 q3 w0 o. n
* u( J1 F6 e' l9 ? // make data node in free list
; `. s3 R0 j/ ^6 v! n ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; i3 c0 e# f( o0 l; h
server_msg_send(server, APP_CMD_LOG, "upp send: success");
! D* x9 S8 N! G }: N$ J8 |. j2 |5 \) S+ Z
return true;
! p6 z8 K: J8 k4 j7 e* L& \3 y}
9 [) N( W' x% D% m2 r
7 d9 m- t7 t; {) b' ~# S# `
" A! n# O/ Z4 n% I! t
+ F2 n* H7 d6 {) w
, l/ q! U9 w4 d6 K& K9 ?* S
8 ^0 F0 D. F1 |4 U9 b" w$ m3 e6 y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|