|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& Q. C Y& n0 z% Z, |- J5 d; i& v/ L9 z7 C8 \
问题描述:
: @' N7 y8 V! m' w6 v% Y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下: t A2 T n7 J3 A1 H# F
, n5 J+ [$ D) b4 e: c
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 E: A2 C+ X" B b0 J' k/ m* R, F) P
; x# |7 d( N+ y2 P, x J+ u测试结果如下:
6 s) ~) x1 A6 l5 J! {$ `$ h138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的? P, b1 X0 K' x$ v% h
5 q# o& A6 k, Q
9 M- ?" @! Q3 o: | @" T
备注:( n# \) w; @2 C8 F1 V
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?6 f5 m, t( C8 E- X
2、相关代码如下:
/ I; o+ M0 X- p! Q//UPP DMA缓冲大小512字节
0 h3 z* B% o% G6 v- w#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
' [' U+ _1 u/ O2 g/ E#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
3 V- j& `4 a; [#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 l8 A! W' d3 f( z8 ?
: I/ O. z9 \1 f6 a5 @# J; z9 n- t
9 i# Y$ r' k1 O//upp接收、发送buffer
. h- L- L2 B7 G2 t8 q#pragma DATA_ALIGN(upp_buffer_a, 8); z8 b' f0 l3 p8 Z
#pragma DATA_ALIGN(upp_buffer_b, 8)
: m1 \' N7 F5 l( ~! L3 x. I1 O
8 K- _8 ?* l( y% u$ d/ junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 W* t8 P" q. @, i; l# K6 D9 D* c, }unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: g# C$ R0 i" E+ j6 t" b
6 m" @3 {2 f7 f. l, F' r0 Q
* Z2 d$ K1 X' }2 `4 pstatic bool server_upp_data_recv(Server *server) 2 |) t; { q+ J3 o$ U9 z+ J- G
{# b) y6 L' h4 m" y) s$ i) k
if(server->upp_channel_a_recv == false) {
5 V+ m/ w- l6 \ server_msg_send(server, APP_CMD_LOG, "upp recv: start");! w1 p7 n" R7 d! ]3 h
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# E6 w+ A+ h! W2 i server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");+ L& l( k( G- k( m2 Z+ n
! P# }2 H2 L# k$ L7 c$ }( ~- _7 c( @ p5 J+ f) Y
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
3 @, j% L# t7 a! P( \+ X& h! r$ o9 E$ s7 Y. M( T
server->upp_channel_a_recv = true;//
7 B' ~; U: e( m$ L+ F0 j) j) H server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
& m: F' M8 _$ a server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;# v2 T& G/ x, {* P0 c* l
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;" E+ B: U* a' ?# p9 j
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; }& k; C; d+ g1 D% a4 [) a' [4 D" C
) f/ [. k+ q. F; v5 m$ j& X/ [% C w upp_error_count = 0;
. Z# w6 X0 m7 t upp_dmai_int_cut = 0;- b0 u7 S0 [' O) {- y, }
* S7 I* z E' N) J% v // fill in data ) ]$ {1 X$ Z( U% l7 c; V) S/ j" t
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
q$ R8 l/ a* r" ` Z server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 w# M( N% P3 p7 C8 p' y2 t
}; ?8 z) ]8 B) g; P9 Q2 r
}
% p% P. c6 K# l5 p4 T" w. w else{
" a3 G5 ]! g, l5 o1 \ if (upp_dmai_int_cut > 0){) n+ U2 B9 i+ w
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);8 p7 D2 `7 a* H8 u
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 U. m) B1 F$ R7 G- \$ @" B5 m* X' R0 M
! [9 f B3 P$ Y! ?; b; J! N2 l
$ K% g: {. W1 |7 w& t% k% ? //copy data to upp_recv_list_busy
9 _! i, D. Z& V& P( j- b( \+ |8 U memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
. m6 i" j& `3 I# I2 p8 r
2 ]# S% N0 r2 A- U //9 ]3 m) p; l+ v6 X4 c$ H7 a1 h; m
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ ^; C- z7 x* V w R# n( s7 S) b2 G: C9 @& p8 S* T+ r
//1 V3 o$ b3 @2 {* O3 {$ z
server->upp_channel_a_recv = false;//5 O- m% D& @) W* ^2 O$ L9 ~
% c" d; C7 ~3 Q. F
server_msg_send(server, APP_CMD_LOG, "upp recv: success");% j- L; ~5 F$ o; w: ^! t, h% X$ ^
}
9 S( n2 o# {8 G }- t8 ]/ p: o& x% F, x2 J$ s
& T% Z; G. C8 x) D9 Y I4 ^! o5 Z; N: w& x
return true;6 @% ? K/ m4 s9 |$ ]7 _% B; Y3 a
}
: m! v- t( J; [5 @! W8 U
9 U2 d9 a6 B7 Y6 Lstatic bool server_upp_data_send(Server *server)
: K1 q% \' f3 p$ t2 q1 ?{
- I' a& d# ]* a2 X* P( p* i( A if(ListMP_empty(server->upp_send_list_busy) == FALSE){ q, P6 \) q+ u3 g: P
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 v3 A/ I+ e4 U
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
9 M( n9 c6 P! O5 N! |% q8 A char tmp[128] ={0};, H q. @. _# z* m+ h- U
$ N2 H1 q9 ~3 M" l( }8 L
server_msg_send(server, APP_CMD_LOG, "upp send: start");3 ~: O- D+ ?' V- i6 G
print_log(server, data, 64);
$ F% r% z B$ {2 C% _
: o, y% ?8 q, m& ]- [ //2 q5 I: p# p6 Z; [' l: T0 R
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
( h7 c/ w; K$ F- J3 w" @, H2 A memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 H8 N6 ~7 j/ y& T# ]8 T+ Q' z print_log(server, upp_buffer_b, 64);
& {/ K. I2 B4 \$ }) D, V1 B( d6 ~( n2 F. @9 R
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);! I: V. E* Z ]6 `) w
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! ]- U) o' v6 t& T0 Z
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;) W3 t$ |/ q+ J8 f
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* ~' m: R" m4 v8 q6 i2 N9 O8 _3 s: N* C. d) D, J
memset(tmp, 0, sizeof(tmp));* M$ u; `+ n! @0 y7 `
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 ^6 ?1 O2 H e! ?' ^ q V
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& a/ Z4 t' _" Q server_msg_send(server, APP_CMD_LOG, tmp);
( E7 H5 M% z2 F" m: P: R; J
" p) {+ u4 B6 `8 S6 Q2 s7 s upp_error_count = 0;: t3 C0 }/ d5 X; m2 ^
upp_dmaq_int_cut = 0;
) W: I4 F4 }0 @ // fill in data 2 o8 o) ?, \! Y8 C$ F% H0 P0 i
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 J# H6 t2 r# y5 d9 ~4 n; g8 Y server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 _" J3 \; Q q- n
& O- p. D- v a* ?$ X. j // wait send success
5 z4 @; L1 p4 ?+ w9 B, N B while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! A7 r( ?4 E7 S- J3 @ I
' G" U$ i9 O" `9 C // make data node in free list
0 I: |2 `: [3 P# I ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);* d2 A, h6 R" ^ \9 {8 I: x# h
server_msg_send(server, APP_CMD_LOG, "upp send: success");4 ^* S0 j8 A. V9 S$ m7 Q5 ~8 q6 P
}7 t" C! i4 J. l T0 P
return true;
- @0 m6 |3 s% E3 }, _3 U}! Y1 w1 v1 H/ a7 v- }
' R2 b' k% Q' ~$ Q2 l* W2 y
% W( ?+ _! Q$ R, |
( `/ ~3 N0 c# s/ X- d
C# x0 x, P& a& c6 C8 H
: ^* M, @1 m* F$ V0 k |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|