|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 r/ V* {; A9 G- t+ D: D1 n' S' Z9 ~' k( Q
问题描述:
3 g k* q3 ]; t2 P' y" e在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 L8 D: l/ S5 A3 e8 ^" h# T D5 l4 B& N; o8 s, s7 A9 V# X
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
- c4 ^0 u7 T+ K6 U9 j9 R w( x( {5 v5 E A4 `
测试结果如下:" ~% C# c* F) `
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?2 [- C D7 L9 b1 t
3 P' G1 D2 y; L: D1 Z( r& m5 @
6 m a" v: D9 w1 L: J s& u1 Y' M; Q
备注:
% c! z; v: r% M3 i& x1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 c1 n) G' l. w( f
2、相关代码如下:6 z! ~- N; s1 k, M1 Y
//UPP DMA缓冲大小512字节# M/ B+ F0 e4 B4 i
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 b- M# L. y4 F; V
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; H! ]5 ~8 K4 W/ ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)* r8 t- t9 z, y+ _7 o6 c6 `3 V
, q* f! S' ?, E2 t' {- P, E! J# u. A6 Q, t' X4 Z; ?
//upp接收、发送buffer
T- ~* L, @: E& K5 [- }3 k#pragma DATA_ALIGN(upp_buffer_a, 8)/ s$ G+ s& [4 j$ w. B
#pragma DATA_ALIGN(upp_buffer_b, 8)" Z, n5 q, Z: P& G) H5 X
. z% ?, V+ L. s- \) ]- b+ r
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
9 \' e9 h( E8 ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. {( R4 }2 I5 a
+ t! q. f2 o5 c! H! g5 f8 k
, ]" \) j) A" @" L$ V. u. a& Rstatic bool server_upp_data_recv(Server *server)
8 Z/ x$ ~5 a, ` p2 o, w, `{7 |, k A# C- p5 I) U
if(server->upp_channel_a_recv == false) {
3 r& b3 V% h$ o1 Y4 C server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# L/ _, t' {( a2 k if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 H5 a' F% x O& w8 S0 r8 u/ e! K server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 z. H2 [7 q) c* C* q
1 _- @: L0 F6 T# L1 ^
' z0 n* i* N; ?
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 W6 `, l3 M5 [$ M+ _
7 R9 L& q& w# D' g; D# c/ G/ e% o' F server->upp_channel_a_recv = true;//6 j: ]0 ?# A& p# [; F! L
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);5 S) Q, `3 l2 \7 i. u) x* L8 R4 L3 B
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;( \7 O9 G3 F$ i% D1 g
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;' d3 x/ x5 X4 f. C5 X9 m
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 @, _" A$ A5 H* W4 y4 g* d
) n5 G8 }2 k! L$ u8 G) x upp_error_count = 0;
- q2 n* G% l6 V# m/ O upp_dmai_int_cut = 0;7 j0 m4 N: C/ a2 Q" s' E
; P" h' @' Y: }; X
// fill in data 7 p2 b6 o8 b7 ]/ `& ~. m, z
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
- S7 e& T* R& t8 `# v$ r- Y( z3 i server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
P- |' Y3 a2 `* j) O5 I F }
- K$ r5 M" b* _9 |/ j9 h! U8 @- W }! _3 \9 }9 Y& q1 P+ Q
else{& {. U- b9 D( T/ O6 I s
if (upp_dmai_int_cut > 0){
0 Z1 Y4 C( G! K- m# J! R5 j3 t W DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" d) Y3 Y; \7 t7 T7 c2 e8 m Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);9 }1 w x2 n! \, ~9 d. R3 Q
' p2 |9 T: Q& y. j2 ?9 M# F1 d9 [/ c/ `% ~% G3 v, P2 V
//copy data to upp_recv_list_busy3 C: ?. B; q# {2 |& _
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, G( ]# ^5 x) }7 A
: H7 q% ~# e$ Q% H# j0 j //
: d! o6 M. q! C ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
, u; y( z+ k3 U: S& A
$ L& M+ R. q( S- r- W5 M# D# X% a //: i4 D7 ?& W- w7 s, ~
server->upp_channel_a_recv = false;//
; v C# u' I; I' N$ J: E( @8 H' o2 ~( C. f0 B: r( `
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& ^9 w6 f- J4 l( A- [; [; H }
& B, i# {2 V- E* O* K }7 \- j' X# J2 l3 t
& P! }/ ]' j9 I ~! \
/ d$ Z9 V% o- n" Y% z2 j3 v return true;! S q/ _: P1 s, Z* x
}5 f- j& h3 Q( G
4 A) h$ ~4 I4 T9 L9 n7 F9 e( {
static bool server_upp_data_send(Server *server)
, L: T4 Y- @8 d{
9 Y9 g% R* U( S0 \% S* C8 G0 ^ if(ListMP_empty(server->upp_send_list_busy) == FALSE){! d( i) E9 y) ^# A
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 b; m, W) |8 l8 z- g: }
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 s6 [' N* E: p& X% }' m0 \) P" r; _
char tmp[128] ={0};$ Q" X2 p2 F) I. z
9 x. T" W d- A& I* A9 ? @; ] server_msg_send(server, APP_CMD_LOG, "upp send: start");3 d( ~0 h0 c& O& |
print_log(server, data, 64);# Z" B3 A/ k6 }# {
, }! r) V4 k0 R/ q0 }( `7 _7 j //
$ o0 K/ t$ h* K0 r( p& u7 { memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- Z- ]6 I) p6 }* j memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);4 T/ u6 a8 }6 ]6 S, R. e
print_log(server, upp_buffer_b, 64);
6 ~# o: Q5 `0 Z; {( @7 ~# d* K% v) K$ ?0 L$ \
" f1 G- e" u$ U# P5 l9 Y* ~ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
& A; A' y' P" Q server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 2 u. Z- L8 U6 f V7 B
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
* q8 q/ v/ h0 y% y/ r* [# W server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% y. H4 M7 w3 B* C0 W/ S. P" |3 S; t2 B
memset(tmp, 0, sizeof(tmp));( o+ i, v8 E& j- Z1 u& ?8 q2 D, c( M
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 K2 G. o& }+ J2 ]
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 b% u3 J! \( h$ M+ v& b/ l
server_msg_send(server, APP_CMD_LOG, tmp);
, {7 E8 V7 l, E8 y9 k. m6 m: x2 [5 G: b6 {. o
upp_error_count = 0;
9 r1 {& S& ]+ x8 _3 g. S upp_dmaq_int_cut = 0;
) ?. Z0 B, p' I$ e5 q // fill in data
3 h. o. Y8 l4 U' s uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
. H3 n" R! K% G9 Y9 ^ server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");4 K7 L# T7 F+ O n) y
& _* G' v: ]4 D: Q
// wait send success
. H; `0 K- ?4 _/ W! y* L while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
1 O0 ?/ M: B( I5 {8 Q( D$ c# ~" g2 q
// make data node in free list $ [1 ^+ h0 E3 n1 ]; i8 w
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ ~: _; D& W4 P2 ^6 N9 Q; c/ J
server_msg_send(server, APP_CMD_LOG, "upp send: success");
7 G1 w/ Q* E; H: _$ S" V }
3 w- b# O& u% W" v) \ return true;# z. a& n5 y' z/ \5 o+ J9 S# Z
}
! F; X( `% V' W: h" L0 ~) V+ N; {8 M: P! I0 o$ k
# U& p& n6 E9 e9 |
* L/ D1 _- y4 e9 e
6 V2 y8 |0 k+ E k+ N
4 [3 d4 j! G/ M) U( l4 c# L |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|