|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 3 z& `3 n9 [% ~
$ [$ F) r% j& y P0 \! h2 U
问题描述:
! a; j1 X5 |" K- K: W3 n在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ \; \5 n3 @+ u4 |0 i
) C) I! P" n: `/ Y8 e图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
) F0 {! p: e2 l% p7 I, J- V5 |' f% X9 B" U
测试结果如下:, ^* B, P8 T+ R; }
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) s9 P8 M9 ~2 @0 R2 ~9 w& I9 B, B( |- J( c5 C4 Q( x
+ o Z7 o- O( J0 c备注:" n6 P( ^$ N* u- S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?5 \) f/ _' R/ t! Q& |, n
2、相关代码如下:
/ V+ b0 V/ b, i% z0 b//UPP DMA缓冲大小512字节
( x0 u6 i x3 ^8 v#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
, }7 Y. B( G# \6 H#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* M9 g- ^# O3 M+ U' K/ _) S9 x#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ D. y R4 g1 \: I' A) F* k% N2 T7 k# d3 R# s
# g- V! f* Q6 f/ }- F. A
//upp接收、发送buffer3 [& m# L! a& R7 x
#pragma DATA_ALIGN(upp_buffer_a, 8). P) c7 v/ I0 r7 u
#pragma DATA_ALIGN(upp_buffer_b, 8)
, C/ U# C4 X9 a2 E
9 G4 r2 r! Q, k+ funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" a" A7 e9 R; T! e: {& _2 c
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];0 c% R3 s7 T# H! v/ U
: j; ^! K% S! A: p; i
. }. Q- M- U3 b# w2 F& O* I- D" u2 Estatic bool server_upp_data_recv(Server *server) & Z& v7 ?8 x" T, }: ~- m
{* _* \9 D1 Z I1 y
if(server->upp_channel_a_recv == false) {
* }7 F3 j x9 \3 _ Q server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& N# b, F" h9 O, L `0 h if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% O- s: s! k5 a( y6 B, r& | server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");$ [1 e5 d; e s5 R$ l
; F$ f' N+ M4 x
% ]7 ?9 J: l' N5 V* ~1 ~ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 j3 `7 f5 d" N% ]+ b; p5 W. A$ q3 c2 z* K# k% I
server->upp_channel_a_recv = true;//
6 a' D7 d p2 F) Z- Z3 P$ O server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( K- ^: m) e' t/ q
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;( g/ X" y8 r' G' D
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
% B* _, X2 A4 W! j8 `9 C/ ` server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
8 P9 `/ w' m7 F1 Q% Z( C
2 s) d. `) u3 D/ P1 B. ] upp_error_count = 0;8 _0 G+ Z$ n) X! I1 \+ [$ {. u
upp_dmai_int_cut = 0;9 }# Y) |! A: A G9 J7 q2 m- G
2 W' n4 q5 w! g z! Q. G/ N // fill in data
, e( S2 G. U% f' G- Y. c uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
1 h9 V7 S9 F9 s1 _ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
L2 O, q8 r. t }
. Y& V0 |" m2 j7 ^7 u8 f }1 s) r7 c, N) C5 u @2 h
else{
7 y6 m8 C1 ?! L5 A& I9 J if (upp_dmai_int_cut > 0){
1 i3 U9 u5 s6 y" w* V DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);: l) q% ~+ E% y2 }2 h
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
0 Y2 A( T% Q9 P& H5 N
# Z9 L% g/ b d9 j% g# g b! [
! H B& F! R& { ~ //copy data to upp_recv_list_busy
. {$ W! D& ?' n3 K& R9 ^. W: I7 u memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% X9 A5 E' p+ I. d& m2 a5 R
. J e' V( B5 z! h/ i- H: d //
; [( t5 a5 H# O& }7 M0 ~ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);, s @" C$ r( s3 ?# Y) ^ r
, U0 J+ T2 a$ y; Z
//, D' w. j5 M1 d7 R
server->upp_channel_a_recv = false;//# ~! b1 @, o2 n, [3 Y9 D
6 U. @5 V6 A, W( m9 W d1 h server_msg_send(server, APP_CMD_LOG, "upp recv: success");. z9 F4 n5 _, Q: E: N
}
/ g3 B& k8 D, |+ ?" c }2 r- K/ m/ C, `. q( b
" I1 P o8 N3 m" a4 D4 ~# h; \' c' e. t' _9 J4 U) x( W q; Y
return true;5 C" `) V$ q0 F6 {$ y9 z
}
n: u, x5 s( S3 E( t! o
+ `6 U6 K% Z4 |" l, q+ Gstatic bool server_upp_data_send(Server *server)
3 x. A- p( E: i5 i* ?{
2 b! e& r" O7 M7 ]% C if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; z* S1 x2 V1 O" i( j6 A9 x DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 t; a7 H8 b% q, X K/ O0 o unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) x# @/ k/ x P! [; M7 ]5 Q" p
char tmp[128] ={0};
" r F7 a( D; s: f; ]' e; ^) W% [/ Y
server_msg_send(server, APP_CMD_LOG, "upp send: start");
( x& a/ K; F4 H# @4 A6 F3 D print_log(server, data, 64);
" `, t/ L$ c/ Q0 ` s1 J0 D G- C; F8 H3 x- [
//
5 k$ `! I8 q" R) O b memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);0 B/ Q9 h" y9 v/ K
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
" A+ J0 l- P$ g H- U# v' F print_log(server, upp_buffer_b, 64);
% [& e6 x4 b! o2 L9 X7 _( j' b+ N$ z6 R0 i
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
8 x M9 A. v7 z" i server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 {2 B4 P) `# i4 S: _+ S( \ server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
$ q' G4 F" [! I server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* ~1 U; ^9 h& m* ~% c6 E" {5 U+ \2 H( g* m& s+ G
memset(tmp, 0, sizeof(tmp));/ ~! Y- h; G9 [. T, r( Y7 k2 I
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( z* B7 `. `) O. X sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);+ j3 ]0 J m# U" Q' H; B
server_msg_send(server, APP_CMD_LOG, tmp);% ^; }* R8 o% [0 X- ?' M' K
9 M1 W8 t. k* i upp_error_count = 0;
' X( ~% ]/ V9 |% S0 K# q' j9 h# h. `9 b upp_dmaq_int_cut = 0;
O4 E1 f2 l7 G // fill in data
+ [5 L' \# D' a$ I' o uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
: l% v/ J+ C2 _# L& _/ x2 f server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
- r$ q! Y! l5 `" z/ W8 p" _& a0 `5 ^0 f, t
// wait send success; @- l; s# o4 [
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : d* `' k+ Q$ \! a0 F, J# t
$ Z$ ^# ~/ E+ A: Z, R% O# J // make data node in free list
" E, i! }, j; L; _0 L ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 }; m* ]& x- l: {9 q
server_msg_send(server, APP_CMD_LOG, "upp send: success");
* c/ t/ ?( Q. m }
7 ]# T3 S, q( e return true;
U7 H3 S; w% _8 j i! |}
3 Z. \( `1 w7 Z' H0 W9 G S/ y1 E5 }4 o0 V; |# A' `' f
, Z- m; F! M# F8 C
: D6 ~7 \9 I* h; U9 j" G/ J( t7 v, D. O4 S1 @: f
' u3 }; l: E" s. d
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|