|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
( m- U' e/ Q: D; ^5 D1 _( d( p1 q2 f' U% U0 C- s/ l
问题描述:
7 ]* r7 T+ T: m在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. Z$ r/ M$ A, e% i) \, w3 t- T; V; O
$ U; C4 y" i, x% Z% _! m2 W图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" t4 m% O- \) _0 l3 G- l
4 B% u: Z% a! P/ k- R8 T' k
测试结果如下:
* U8 C& R6 D3 a) R5 e138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?: i: w" k2 G) F7 Z, |! |3 g
) \6 r% {' a$ I# v) s( H3 X9 c! q, r M8 a
备注:4 [# T) ?; [5 L- R$ F# @' k
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' ^* O! R# Y" {/ b ?; p
2、相关代码如下:
6 K+ X/ B+ H1 m//UPP DMA缓冲大小512字节6 V5 T# U2 y1 `1 L: ^; L) H1 A% _
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. S- P; h* L7 x9 `#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT, c: l6 G* h5 E, w# l
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ u1 K; \! q7 i
1 x& R& L' A1 B# W
0 f$ H" c; n$ |# f& t1 s4 B. G& W//upp接收、发送buffer
. p; }' m7 N$ Y: Z3 [" v1 c#pragma DATA_ALIGN(upp_buffer_a, 8)
) c9 W+ V2 X# K/ U2 U2 H( k#pragma DATA_ALIGN(upp_buffer_b, 8) `# @5 A1 V0 b. Y
, T' ? b$ ^$ b4 Y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 z: D4 j1 D* q6 b" h" ^unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- b/ F. R7 P6 t3 \1 ]
! m. s. O4 h$ r a7 {0 k8 A
/ |( E$ n! ^8 X% s, r+ m$ astatic bool server_upp_data_recv(Server *server)
- ^( U3 L+ m; E" ^) B# d{
7 o! g. ?3 g- l( `- D if(server->upp_channel_a_recv == false) {
- ^; k5 |' m8 t server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) U4 c8 o6 |% [, \/ p if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, u) ^/ N" S* L server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
" D3 f/ F& q* \
3 {% e' t4 P0 F
f1 D6 N- R! Y% I' ]" \ ]9 I memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);' x. q) u3 h/ H# T7 H/ T: h4 h2 ^7 \
, _0 A( A' I( w( Z/ z server->upp_channel_a_recv = true;//
4 q, Y- v4 s" H5 N' K3 ^ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);, x0 J- K* c) m1 `" \& S
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
" r4 D" H7 _, b' |, u+ a% L server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;: C: k" {- b, |3 k
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' W9 H4 Z, h5 Y( ~5 F8 W+ a- ?
|+ H( D# I6 f2 r upp_error_count = 0;) k! u. ?& J, X5 V
upp_dmai_int_cut = 0;
! u( x# B o2 n( [+ ]
6 l. p) |: a- m% a2 f // fill in data
" T* w' j0 o+ V" i; L- {9 g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( Z7 J) k9 c$ g% F8 q
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: x) ?5 n- m: h$ I8 P' N
}8 t. z7 U# @* c$ |6 O
}
6 `2 b/ y8 S9 b2 ` M else{2 m+ ]6 J" v$ B. B6 d
if (upp_dmai_int_cut > 0){0 B/ h4 s/ `% R
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 U* S. n+ Q! a
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 t4 J. c1 U/ u6 F5 b
/ v6 k9 n5 |, Y! Q: ?3 g/ U4 w8 X3 G4 O" s$ Z5 r+ N( k
//copy data to upp_recv_list_busy
, P& [) Y- |8 O6 o: ^ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( `( p( ~+ D s8 Z) U8 n, a& [$ b6 J; v# Q; C
//% C" \0 w% _* m9 J' G7 m: e
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
5 q9 }9 S) d! c4 p
* q- W; g' S1 m$ r% ~ //) Y' D2 i, S# q1 U$ N; D+ u. ]
server->upp_channel_a_recv = false;//& m F# @- x1 c0 j' M* _: Q
, [" |2 R0 N/ W
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 B6 q+ c L7 Z6 h+ D, p: L' P }- ~6 ^ C f5 F, ]' C0 e
}. [! _' K# A' X- E4 l
1 T5 f6 J% N$ h/ o% c
# `3 l4 S1 h1 b+ S# s8 k8 d return true;
, M' Q; r7 a! k) t- z& M}4 R7 p8 g; D5 y8 x5 J4 x' G
4 h7 a/ z' H% G2 d V0 T# Sstatic bool server_upp_data_send(Server *server)3 W. |6 M' r: N' b% z
{
2 ~. G+ u& l; J8 V% C, ^ if(ListMP_empty(server->upp_send_list_busy) == FALSE){) D9 a( |; i6 l$ E- L) i2 x( v4 F
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) m b; K1 _- J unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% m6 q3 }3 m8 k char tmp[128] ={0};
8 [1 I! n% u6 `5 T
% G6 K# P/ H2 @. j: ` server_msg_send(server, APP_CMD_LOG, "upp send: start");
; N+ R Y5 q2 w& r- J! x& g print_log(server, data, 64);
r: V' N/ u# G$ F
3 p* n4 C5 f1 P8 m0 A& M$ H6 B //
8 B) f. Z/ ]" R! s! S! M memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 t, k/ N. b* z% s# F0 }# Q memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);8 ^* d/ i7 Z0 u
print_log(server, upp_buffer_b, 64);
$ X+ n6 `6 Q% G$ C2 n* u: o- q4 Y, }1 ?& F
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
3 y7 @. F. w; @ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
0 N* j" n; J w) I) H server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;2 |$ H7 x* @) U2 F
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ U& q: k. Y* p/ W& I( }
$ u- {$ p( G; r! u! Y$ z
memset(tmp, 0, sizeof(tmp));
1 V" Z: o6 R' N2 f- r9 S sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 Z/ k8 `" i1 j sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);- D" g7 H# t* ]
server_msg_send(server, APP_CMD_LOG, tmp);
- M+ ?- s8 h* J) Z1 ]8 t2 k
! _# I! x) V* a! c4 j/ s upp_error_count = 0;
3 p: A2 U- k' ^4 g/ m' X+ p' K: @* \7 } upp_dmaq_int_cut = 0;$ @% L: W& x* I7 w! X% ~
// fill in data / { n7 n0 \2 a. {
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); $ R( @8 s# z6 s( _/ w
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
0 H; `" L- C$ W* E
9 R8 @+ o8 S8 E8 _" z4 Y9 [ // wait send success
% V2 Z8 a: o- I2 v8 ]8 o while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
Z( d0 x' ]; n! b& H w8 v L o5 @5 x- g2 o1 I. A4 j @
// make data node in free list ( a) z- n, g C9 C
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- ~( w& u( I) w6 F3 p server_msg_send(server, APP_CMD_LOG, "upp send: success");# b7 Y% m' j$ u) X4 Q
}
" h! z8 {- m; Q( L7 l return true;* r X i5 @4 J% n2 M! g
}
5 @1 s. ?* _! L y9 j. D4 J7 y% P' b6 _0 R7 s' c& }! ]/ j Q% X
) T8 O) U. ]# j" g( C5 a8 l( N8 \
& T! w: T9 s& g5 o" m' C3 R5 A5 s) ~
8 G) R0 d2 Y+ A! R k
. m+ C b5 n. B
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|