|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 B7 M9 D# u) P7 h4 t9 F
( @ K/ ~, f1 X6 |/ ^问题描述:
$ y( N" J U' E5 q在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. |3 H* Q& C& ?1 l- |0 E
) R- N4 ~- ~" \' G( d8 y图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。% ?' o3 a: {1 ~ @' p: M- ~6 x* _
' f. x5 ]* r* v1 c
测试结果如下:1 V/ h' R" p* `" }+ S, w z2 V
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
& B9 _5 v9 h6 J! W
: ?- N$ y& \: U# E' Y. ~$ Q$ P% G+ k4 N
备注:
$ F+ X( J8 j; W" \1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 g Q. `5 X; G4 W
2、相关代码如下:+ J k8 U/ W3 @# W# e
//UPP DMA缓冲大小512字节5 X' t- @/ g$ `, f( N! O6 N* g1 K
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ a: ^; Z, x9 o1 |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 z6 x/ T' }% M/ \# x- d) s
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" k4 s0 I- {8 D
9 t1 X E% H! V0 S$ l3 l+ ^) E2 W/ K: ~" L- S9 H9 H: F7 ?8 j
//upp接收、发送buffer
- j& n/ j) U- Y+ s1 h#pragma DATA_ALIGN(upp_buffer_a, 8); o( ^! V$ W" G
#pragma DATA_ALIGN(upp_buffer_b, 8)3 L$ _) K3 f: L9 S
$ n" O9 w4 N# h9 T7 F$ M% Y* Funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, `4 c# A6 j+ x" u# Zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];# U& p. n0 W+ R# E
0 V5 d+ M) W+ A/ ? W6 l* E" M% E9 C$ S! A4 G
static bool server_upp_data_recv(Server *server) * o- L* R) f3 S
{
; R& q- q0 y! K. u' ~ if(server->upp_channel_a_recv == false) { H. [# ?0 @( _
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
1 C1 m4 @% `+ u) l$ }" J6 A if(ListMP_empty(server->upp_recv_list_free) == FALSE) { ^* K; _) T; a% [
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 R! W$ F; |. p
4 o8 `1 `2 k, S( H
N! X1 {% R1 K/ y# }# P memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
- e$ d# V4 S- `" C0 l3 z. `3 y3 m# M/ g3 p3 A2 t. a1 F
server->upp_channel_a_recv = true;//
+ i' a7 ?& l' K2 h/ y3 k0 J* V: Q server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);" t* z2 {) ]0 w6 K
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;" y/ i1 m2 ?& z- a7 w
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;9 P$ t/ L: ] B- ~
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% f- P7 ]1 O- k, j. Q7 z7 w9 ?) ]1 F& g- g+ M+ O
upp_error_count = 0;
0 |0 U' |4 r. x7 T" r upp_dmai_int_cut = 0;
( G% K! i8 c7 z0 I9 g$ @: \: v: X! e& ^* Y5 H
// fill in data
; F: h" r! E. E- Q3 X$ z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
- p! |2 ]: t8 I3 V( Q server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");. A# K2 F; t) K: q( b
}; u: O4 O) [& m' D: g9 B) s( q
}
9 H, g3 h1 c( L. h4 H S else{5 l* n, F! D9 `
if (upp_dmai_int_cut > 0){
8 J) N, @/ C' `* H DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" J, m( X, f" V# h& M Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# ?$ B' d: ]- f, q
3 @0 \) ~4 K' i% j( B9 h1 b, y: |( H
//copy data to upp_recv_list_busy N8 a5 \" o7 _' e
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 T s3 q% o% X& ]- [9 e0 O
6 s' A3 m# j& u1 X8 M! Z9 L2 \ //
5 b# J7 h2 W. g- p ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 e5 N" Y5 W7 X! ]) T+ h; r$ E: W) n( T3 Q6 H$ k
//
- Y; W: j9 R9 T. E server->upp_channel_a_recv = false;//
0 V7 J, x) H6 A
2 |8 L% h; G6 e server_msg_send(server, APP_CMD_LOG, "upp recv: success");
y, e3 P7 W9 l' o }
9 x) u. V8 j G) T+ F! J7 c }
; Z4 Z$ b% x T2 i& o6 b) H+ p$ E8 ?) U( t
9 s% [/ i. y" z3 q% r return true;
% o. P. `6 o r# N, x}
9 X0 x \) L/ \( l/ ?
: }' A# H4 _( {5 M$ z4 l8 ?# Ustatic bool server_upp_data_send(Server *server)
( z% ]* }5 u6 C{: w; t# ]; k# v$ E# F
if(ListMP_empty(server->upp_send_list_busy) == FALSE){; w& [7 R' ^# u; I( n) k( x
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);- p0 ^5 h& o- [! X7 ~4 V+ s
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);! G# k7 R$ W8 l' q( Q% y( t2 k% u
char tmp[128] ={0};, |4 m/ |) i- f( r
7 r3 l' Z9 x# \3 Y8 l server_msg_send(server, APP_CMD_LOG, "upp send: start");
. z" O/ Z$ j" N3 e print_log(server, data, 64);
, K' J: P" ?/ f" o3 M
. _! i$ ^# W1 F/ g! S# m) P( I5 P //
9 d$ G) b& N' g) b2 @# p9 X2 [ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. [5 G4 B- u- P8 {! r memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; i% V0 U* i2 X, ~" q9 c* X
print_log(server, upp_buffer_b, 64);
! k1 [5 Y* s. w( `/ ?# z/ o
5 P; ]3 B' B M) e3 q! C' ~0 a server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
: y! {. N: r; n8 E9 T5 N+ T" d+ | server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! I# G* m( p% C0 F; c) @
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;/ Z! M. z0 }1 R0 @" L) ~
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 G, a" C, @0 ~% y* a3 Q
9 A2 s2 w1 c- b7 f
memset(tmp, 0, sizeof(tmp));) Z! S G# D1 Y4 T H
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 E/ P! B$ c2 I( s" N+ e
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);* k. M) ]% l# A/ u0 j# W- |* M
server_msg_send(server, APP_CMD_LOG, tmp);. ^! z: \& @7 [! ~9 d! T
" g3 |/ q/ O @2 v
upp_error_count = 0;
4 @' L: M% W% t( }1 U6 T8 o upp_dmaq_int_cut = 0;
! a/ }3 q9 u. G- c // fill in data
1 o8 A; t5 J1 z+ p; i3 ? uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" _! s* p6 `' p server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");2 o* S7 O; h4 k3 F" B: f6 N
5 y0 m/ M `8 v( F m- c8 d
// wait send success7 n- w& `* g8 Z$ K. X' V( @* ~3 m0 @
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
9 F6 o3 G. p3 F' s' z. h/ {4 U/ F) W! G6 v* q. b( u
// make data node in free list
1 Z. i/ i+ O6 d1 L ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- h9 }( m0 q% _3 T' R
server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ T, b& E# B& M* p& T4 r# K$ \ }
8 S& V- Q6 C6 M6 |* ] return true;6 ]" e, ^& J; r" `7 \
}2 R( V8 `' q3 h7 ^4 a
% n; L3 ^* V2 g
# u" L$ S' u& M0 V1 L& C( `
/ N2 E2 {" y3 `2 S+ E
. ?' c& a5 r! e2 i% v
2 u) n& P" z# @ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|