|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & Z, w7 C9 |9 C) L! h! r3 U
7 ^* ?3 C' [! G2 Z9 D$ G
问题描述:- n8 f. R1 b& i/ j) m5 \6 x* t* a0 R
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ |2 d) J% C7 F4 o2 x/ d8 t
) U; K8 C* j3 }6 [, [8 v' N5 Q1 U! I: k图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. I' c Z- U- a4 W9 a; K7 Z
, ]: a' T$ V2 Q) P6 s$ V' m/ z, y测试结果如下:. P; d5 o$ U5 i# K% v# G* h
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 r, |! w" t' S1 a* Q$ Q& G( \5 G; z" h/ ]# j1 P2 _
2 C ?5 ]( }/ N2 q/ p备注:
8 B' Y0 W( L8 }& H1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' R) r; s3 ^; i
2、相关代码如下:% J" E. _6 Y2 K. m- D; @# \2 U3 {
//UPP DMA缓冲大小512字节
" Z/ D# N7 B! g' \0 E" N#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ M- h3 v0 r" h- k: w9 Y; D6 c#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( F, `- K& l: ?, _& ] s3 ]#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 o$ |# A3 f4 I3 U& [
, s, _% ?# J6 J8 ]( i3 K0 H
- l6 R s* `+ J; m% [3 h: Q//upp接收、发送buffer
5 R& C* s- i; v `#pragma DATA_ALIGN(upp_buffer_a, 8)' A' ]$ g8 l Q( @, J
#pragma DATA_ALIGN(upp_buffer_b, 8)
) @* f- ~1 T) ?3 m5 Q' n1 X4 i5 k5 A3 k( a7 X- v9 V, m4 `% A
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 r6 @$ m. B% |unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
( J7 o# N. V1 A. g! M8 n5 B4 Q# w! N6 h+ B
5 V7 a) W& @1 B$ Z3 s! Cstatic bool server_upp_data_recv(Server *server)
1 E3 P1 i/ O/ N2 G& e/ Q{
* `& m/ L& k* ]: S* f2 G$ j if(server->upp_channel_a_recv == false) {; a' o% K! F! t, V3 f5 u6 @
server_msg_send(server, APP_CMD_LOG, "upp recv: start");3 p7 M/ Z0 B5 s/ E2 _+ e& ^
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
( q/ I" w r1 j. o5 j2 s server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 J9 S/ a7 A4 t! {6 Y
' `4 c) b/ \' t/ a' } W- l; v
; `8 R8 e2 b/ Z2 _ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
- E7 d4 A! G5 o$ y2 M( R
& J7 K+ n4 B! F" R. n2 c server->upp_channel_a_recv = true;//7 o9 ]7 f: D0 b" U9 ^- e* f9 _( g0 n# X
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
4 a7 W; q/ {7 z' O: n4 P server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;0 s1 K2 A- f$ Y5 _
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
- s" h2 E) R: j! q2 K3 h% Q/ K server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ \: b* f# k) r3 E# k9 `' `1 L$ P9 y4 Z8 c; r9 U
upp_error_count = 0;
* W. Z% Q, c, { ?' s upp_dmai_int_cut = 0;
. d3 h. B6 K* ?* V4 J
' t' d# c A% ]! B // fill in data 3 h7 X% x$ n" }* d3 {7 G) O% C% b
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# A, h# p0 K5 Y+ @6 j+ k3 W" L
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 F4 o3 V$ z0 p2 h* Z) f
}
2 I5 k. n* h- A/ a; j. y+ e }' `- Y) q. e7 E+ @8 E9 e- X
else{
; k5 @ x- f, Y0 k E if (upp_dmai_int_cut > 0){
7 k4 ^3 E8 l+ f* Y& f9 V DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ C7 O6 a& U& S Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ z& _+ ?9 x- r; M, R7 R
) q+ ]8 M8 g6 D9 K. f% q& G7 }# b1 O# H% X2 z+ _0 v( @2 n2 S: g
//copy data to upp_recv_list_busy
! J/ V# d, ~6 C- Y memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ V5 G* E( [( O5 Y/ |
3 s1 O! V* @! o& N1 o: @: W1 b: L
//) Y9 M% V" |% S o
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; g+ }2 c1 o9 G: q+ L; z3 Q
3 }: ^# S/ n8 i //
* W) H3 P, y9 [$ S x( b! f server->upp_channel_a_recv = false;//8 T8 M! a7 L1 W( y( ?) }7 a
/ I# l6 \$ m' w8 f3 \
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 G* Y/ R `/ X$ F* }/ W }
- C* u+ f' E f- h: X- c, o }
! |, W/ M$ T d; w
: X% u" H# F2 n( h4 a
' M. G& K @7 ~1 ?6 S return true;
$ \6 W6 {7 t; L9 z! D/ [; Z. u}
, h( Q) A* E& X6 O0 |/ Y% {) U+ _
static bool server_upp_data_send(Server *server)
& l; r9 \3 n) `# m! N; A{
6 C4 M8 m! Z0 A2 M if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 T6 f2 C' `/ x3 y" L1 w1 j* A. { DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
0 y9 B2 ?3 \. h8 P unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 w: B3 D& D4 F K9 w2 `) z
char tmp[128] ={0};
5 u3 c* C& E1 P, a1 C' y' `* _! S# A- i& x# s7 q
server_msg_send(server, APP_CMD_LOG, "upp send: start");
& T. p) `' X; v, l6 U8 n print_log(server, data, 64);
0 L J6 e& r5 c0 c) W) F6 [; Y
9 k3 g4 x4 c2 ]9 }$ I% D9 W // z, R, H7 p- J
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);1 @1 j/ b- n5 F5 C) }
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);: K' W, J% n. v, E( b4 _9 D* v3 C
print_log(server, upp_buffer_b, 64);( p/ C- C1 O; X: k% J# @
# h# a3 r9 K( x/ |
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);: I( `2 [- y( g3 v+ O! u
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 8 C6 ]8 y4 b& ~1 q; `
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 s) M( ]! _ T8 Q2 L
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 M" J! u; I4 p9 Y+ E( ~, O5 T2 @& {4 i
memset(tmp, 0, sizeof(tmp));
" ]- w6 P9 [9 R, u sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - d+ h1 t# K- _5 F
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( ], Z9 W) l# u9 w( I
server_msg_send(server, APP_CMD_LOG, tmp);9 @# [3 b+ ?1 r; Z- d5 w: j2 }7 k& X
7 o" p6 L1 k4 l
upp_error_count = 0;3 N, L/ a9 t) H. D8 `* o% N
upp_dmaq_int_cut = 0;
! W. e" j0 }. _8 o6 y0 ] j) E9 l // fill in data
9 d( x1 N) s, o& `" ^- C uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ( l" A6 V9 y% x, s' s6 `
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 G) ]6 g" D! f, ]6 g
7 c- V* a) S4 n- D4 x // wait send success; `, h7 l8 K5 c2 |0 h/ |
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
! K% |! v8 H2 r, _& \/ O8 R7 o+ U- [( `+ f
// make data node in free list ; b( f& O9 A5 V9 y" Z
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% M( G0 C. b0 X4 ~7 c
server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 }6 k1 z6 y1 @6 { }
7 S! C2 J& Z/ ~ return true;* O% W/ B& R& [* l, Y0 b
}
' Z& \) I( X9 c
8 P7 e) f% Z' X0 N5 A5 D7 x) O% R4 ?+ Q! R/ @
5 I* T2 B6 O* R- j
2 {% I5 A% R, a, z. F/ _! c+ q8 A; Z! B
' y0 y U3 w# S2 o4 ~, R |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|