|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & ~$ y, y: {, j
) U0 `+ Y1 L4 T9 T9 c3 L
问题描述:, ^) P; D7 D' G$ q- A/ M
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( @5 a- m: k1 R$ n
! s& s# x( y! D& a; _图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。1 H4 ~% t; o: G* Z$ d
[+ u/ K5 e, V( g
测试结果如下:
& s! y6 ]7 n d6 s& u8 F+ z2 Q$ e138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的? i5 w+ v& G0 s, a$ Q5 m, q* T" [& G
9 n6 b4 Y* `9 {$ m; q# q
) T0 I c7 N h9 `4 S- j# f" N备注:3 Q7 P. E3 ^2 Q
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" t/ l! g" T" k. g# O2、相关代码如下:; V$ S4 h- R# N5 ]; \8 q; |( m7 d
//UPP DMA缓冲大小512字节* }3 c, G6 C+ ~; \7 }( f
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; D7 b! h# I9 |/ a7 h
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
2 k% r3 }5 t% q w: d# i#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT): G( b7 {$ L+ T
4 l3 y7 q( g" J, X3 I `* n/ q Y2 d% _& i
//upp接收、发送buffer" O! x% c& V: Q: F9 A
#pragma DATA_ALIGN(upp_buffer_a, 8)
6 | e3 t4 r1 L% \* w#pragma DATA_ALIGN(upp_buffer_b, 8)
+ Z/ M2 j: x* Q. a, k2 a, O/ _" \
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
3 y& {7 a- `" ]9 `6 N6 I$ Cunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: X/ k; {: {1 q, B, D+ C% K( p0 m
. m/ e9 ?* ?/ l& r& T& C2 U, y
+ B, c9 ?# w4 Zstatic bool server_upp_data_recv(Server *server)
8 C9 F- Y. ~; w Q+ t# Z7 `" c; [{5 B7 b/ W, z: }0 \: K. `
if(server->upp_channel_a_recv == false) {
* l3 U( F4 W2 [( M# e/ r server_msg_send(server, APP_CMD_LOG, "upp recv: start");& B2 g% x2 ?1 \, Q& w
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! z$ x* B7 E! x9 K3 S4 a5 @' A+ x# | server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- {! n( F$ T+ U9 Z1 O8 w' u. E. M& Z4 _& T1 e4 {
; f" H; r' d# p f a
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
; J& @9 }5 ^* m, |8 ]
7 {9 C8 u; A7 C& B5 @& a( L% a server->upp_channel_a_recv = true;//- R2 U- u; T$ k( n+ |. L$ k
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
# N) @9 S1 |# t server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;, t1 _# |+ U: n5 G8 C. r/ C
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
, X3 C! M* ]& F) W5 h* w server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ D' X& V6 q( q! A
! e7 l4 m/ d7 M; [; | upp_error_count = 0;
, S" G& g: H6 }. u# l upp_dmai_int_cut = 0;3 B& {7 C8 U) ?" D& h( ~& }
; `7 b' y3 \ R! z# A4 m* H
// fill in data * H, w* _2 b* {4 y3 b
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& h- F3 @2 K3 p4 G" w x
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( \+ T& @# A) u }% B F. {- D) h* ^2 W
}
6 B6 x% v1 D9 O9 [: `4 S8 {# r else{
, R& i! C8 v0 n: [! y4 i if (upp_dmai_int_cut > 0){1 e- N7 ]: ]2 x( w0 a0 n( t& ?+ N/ k
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, _' d0 L* `% V. I6 |# d
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# z! Y" V1 G; m Y+ \! L" _
3 \" {) I% ~/ K$ w2 n8 L# P* v1 X/ a. P$ g( r- F
//copy data to upp_recv_list_busy
: @; _! R1 K6 Y9 E/ s0 s! m memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* h" s4 Q; q, d- A
) T; D. I9 O% F" m# ]
//
6 k6 _1 }2 ^! M9 E ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);! t7 y! w1 h" {! y/ U# Z; A
- @! ^) |3 U4 M' W //4 c% t' e* [: ^
server->upp_channel_a_recv = false;//
! X3 s C* l! }- v( l1 T! x* _% X5 c( V
server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 {/ {$ } }8 t3 X) L% Q, |, ?
}6 F3 T: D+ t7 s- S% v# S* W8 i
}
6 F8 y# j! {: W S8 U: w4 J& F+ O
, u2 s' Z6 z/ f2 F [& g
return true;
( x9 ?* a6 b/ }( a' m) _}
/ X! s2 I- o( Q4 g4 [! X% A+ E; Q8 }# P. W4 \! e
static bool server_upp_data_send(Server *server)
/ V" u0 q2 s% s9 C7 P{
. `9 D* X* u3 [# r, t' X2 _ if(ListMP_empty(server->upp_send_list_busy) == FALSE){; x; T" B6 O9 c7 Z( ]
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);3 R& |) i7 D- o$ _5 y
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);/ w/ H! @* f3 E& o \4 s7 r+ P
char tmp[128] ={0};" K+ j6 r! C/ C
" `6 }: M( M. ^1 h- [ server_msg_send(server, APP_CMD_LOG, "upp send: start");/ t& f9 A& F. s' B. Z* t
print_log(server, data, 64);
1 m0 R+ f/ M2 \1 K
/ V0 U: _2 ^! a //
5 e+ d4 ?! v' O1 b; \3 J& _; L* {( [ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% H# m; p2 z7 w, _( } memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
# U$ ]/ m5 J8 F2 k1 J/ b! k print_log(server, upp_buffer_b, 64);
+ [, w, e* j) c
# f! \8 |; r! Q1 ?( v server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
" n" D6 S) u/ a! D$ c6 g6 _ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
" A/ c M2 l+ U* M6 V server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;9 M7 G) ^ U; A! T. T8 x
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;" r7 t$ e4 f+ z2 d
% E0 c" T- Q. H
memset(tmp, 0, sizeof(tmp));
5 }0 ~; V, ]" X% A sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 0 q& W* ?- r( M3 Y1 ?
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
0 S) O0 `: ~# |# Q( j }# l server_msg_send(server, APP_CMD_LOG, tmp);& `1 ?# l8 }/ ?: I% @
, m6 b$ P# F! l9 s
upp_error_count = 0;7 T# ?$ T. M4 A. z
upp_dmaq_int_cut = 0;
b k2 h/ t8 {$ M // fill in data " m; V7 M" V( U4 w
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ; q+ C8 l8 C& h
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ {0 Z, A! D2 K6 m5 d* W0 s
1 X [& i0 ]# x4 E: c: Y5 K // wait send success' c8 l# ~& x g5 z# z
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . v1 ?# ]' S" V
) b) Q! W' _1 m& l+ }* c
// make data node in free list : v4 _$ d5 E3 ^) h% o ?
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 U) L7 g! B+ J" @ server_msg_send(server, APP_CMD_LOG, "upp send: success");2 c) w; ^! {% k5 t1 ?
}+ O8 T1 K* T* t) C7 L
return true;) ^) j2 [ i% M% T1 ]% k- t1 F
}
: G' |4 X( g l
- ~4 `3 W- Z3 u. y! A5 T
# Z" _+ C4 N" x3 U4 |+ _
1 q9 E; Z" R* S' [7 d8 A) S* V+ Q- M4 F+ V' o$ o
4 O$ k+ l' Q5 O! L5 k |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|