|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " e$ @0 O2 y. a6 v
, {, b+ }9 n. V" |& ~/ W- U问题描述:
* F- [; A7 q+ T" e在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% P& n4 d4 L( [8 R4 e5 [1 v. @
, t5 M' o8 h, `2 m0 e& s- f: E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。4 A9 V F" `/ H8 V, J
& y5 `! q* `: @) k0 {+ E3 O测试结果如下:
0 G5 {" U$ [! m! A3 w; s- B1 {138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?" [% E$ n) M3 A- `& Q
) V: W! H! T. ]8 x$ I
9 ^# Q/ n6 ~0 o# ` y
备注:
) o2 ]" H+ y3 F) o0 L. g8 h- T8 ^1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 s; b; Y; l7 F3 {4 M
2、相关代码如下:+ R* _1 k' U* C
//UPP DMA缓冲大小512字节# {4 {; F% b) L+ G: H$ ^( r
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
' a, j$ X9 e+ r4 E# C, _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT) |7 C: J% n1 Z8 {& B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
|- K9 I- K5 p9 a0 a" `# I, g, Y+ P' _) O7 k
0 V7 c1 R, Z, G# R5 v1 z: }
//upp接收、发送buffer, ^% m! T5 `, V7 c# X
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 Q# }2 r8 e( M1 F6 X" n2 o#pragma DATA_ALIGN(upp_buffer_b, 8)3 E6 N N, Y; t, h6 P
0 L t) u4 S$ `0 H! Eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
3 R0 @. \) x2 L& M2 Iunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ {$ @' _; w- ~6 Z# [: @) n
( s& T' l& U6 I' d+ `: x2 f& ?' |1 ^, b% `2 T0 Q8 l
static bool server_upp_data_recv(Server *server) 3 E( I2 n1 l; y9 |" K9 H+ X; H
{
* A2 v' d# S% l* @9 a if(server->upp_channel_a_recv == false) {2 K' ?( G5 z3 J; G8 _! I# D
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, t. z) p+ Y2 c) V2 | if(ListMP_empty(server->upp_recv_list_free) == FALSE) {# a" X$ L4 k2 N8 Y! K
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 J) u* w& c, m2 T3 F) E- c
' l) O. Z% v' Q u- s1 o; \: c8 c( ~/ Q& Q2 X6 x3 l
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ g: D8 J# X6 |! {8 M% q; d! }. S% Z$ e/ w+ d& u
server->upp_channel_a_recv = true;//
; u8 ~" G' d4 L# A server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);. j( K) k2 G; A* Y
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
" s) |/ M7 _% o+ ^ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;% P& j% ^2 S5 b$ b( m
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 |9 O6 j: V" q: Q5 }" Z+ L
. l9 z# o! ?( }0 z3 ]: [! i upp_error_count = 0;# S' u3 X8 K! l1 }/ [
upp_dmai_int_cut = 0;
0 A3 l2 o% p2 k( e: ?6 n b- Z) h2 U! z8 v* R
// fill in data ) m: d/ g) G" \; |+ {
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 c# |: M Z/ E: H server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 z$ w w& m/ t }
7 L ~9 B, q) v }3 f; N+ z$ G" R0 i0 L
else{! y4 ?' ?% D9 R% ^; @: Q7 Z: t: M& d
if (upp_dmai_int_cut > 0){
+ m0 g# Y( s8 ]! w; w DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% ~4 G& L; W. [, }7 J6 [8 B( I Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 L& G+ P. o/ T" o
3 k, `$ N! L7 w: r1 Z$ k1 E
% W* e" Q" e$ g( D+ B! V //copy data to upp_recv_list_busy
/ A0 e' t& r) E1 d) O memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. m! H2 p4 P& J
% c, v5 H0 n1 f& T
//
* n/ R3 t3 P: Q: C ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 u. l1 l0 T" O$ s7 w6 O$ N% ~2 m
?4 \5 h }6 K% V3 z8 L
//
. H8 n3 Q0 _& U server->upp_channel_a_recv = false;//
/ L, Z' f" v) z2 I8 h4 N0 B
! Y2 V! N$ h5 l! C& x3 e7 o& ~5 L server_msg_send(server, APP_CMD_LOG, "upp recv: success");. s) j0 J0 L6 J
}' ?4 \$ \/ w: ]9 i3 h5 ]' _" t
}6 D, F9 j! \- s5 e2 {' }' @& ]* R: R
& i' J$ U% x3 ^+ W! w
& v* a b( z) g% |' q; P
return true;/ E, W" u& I5 K8 t* D$ ?) P9 ?
} j" r- H! u8 a) E7 ?7 h$ n
$ F9 E+ X2 g0 g- tstatic bool server_upp_data_send(Server *server)
. s% q, k/ q5 y: R) d% `' k{
2 G( j. S k" D8 l& w, o3 R6 _. _ if(ListMP_empty(server->upp_send_list_busy) == FALSE){' x& m- B3 @( s. G3 B
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
9 I! u5 R! g$ U1 {- B unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- M; k' P9 E4 o
char tmp[128] ={0};
0 I# s7 J, m- d3 k- G4 {( Y# O6 y" l* q# F7 G" z8 [8 X
server_msg_send(server, APP_CMD_LOG, "upp send: start");7 d3 R* O7 I/ N3 F+ Z" m# V
print_log(server, data, 64);& I4 e* G6 C) V A
; z! M+ ~& V+ @ c. @+ G
//
( {) ?7 U' u; S memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! R0 t. x1 p# s memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);/ H; @' h1 _, L7 G9 ]
print_log(server, upp_buffer_b, 64);
7 M% l) \" E" Y4 k+ h) N
5 D# g7 q" B/ Y# S5 Q8 W server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
4 a& W, f, O6 k" l( o Z# V server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
1 [; G5 {. p M) R3 j& ~) y server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! [ l1 b5 k/ v2 C6 k. @
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;% s+ K4 C% c" R
& ?- u" _6 b/ u( {$ t: a: `
memset(tmp, 0, sizeof(tmp));
& d$ w2 o5 {& g( G sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 i- b1 O; e, N U. D/ | sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress); D" a: t; f' R& ] y ~! m
server_msg_send(server, APP_CMD_LOG, tmp);
7 O- {; G: G V( `
9 o1 ?# V1 { _6 B4 s! r8 @ upp_error_count = 0;
/ x# x5 I1 F9 |* l: e9 X, d5 T& g upp_dmaq_int_cut = 0;2 z k6 I" V' A
// fill in data & Y6 _& f5 G7 p( `! q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
& z$ I F/ A7 p4 g# R1 E: | server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");0 Z9 i( j& O* P: F# H
6 u$ l( a6 O+ c% p* `/ T
// wait send success
3 \ l* k1 N2 @8 g3 }. g while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' C1 m7 M) l( z6 }4 c7 O7 n# W' B2 Z e9 _ }/ K1 e; Z8 T* K& ?
// make data node in free list : I2 [8 g. D; c# B1 z* z
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# o2 \1 Y' A* I8 `
server_msg_send(server, APP_CMD_LOG, "upp send: success");2 D8 A5 U) a' ^( z, D$ A
}* P* \" h1 s/ }4 A
return true;
1 _! u9 W9 \$ \ W3 x N}
6 A7 j+ r% U `9 e, y
- L/ F; L& ?% q! Y0 ]5 j) d9 ^, p% M6 C9 {7 W
1 r$ w) U: O/ P {. M/ W6 P k# F" N$ ^9 S* P. L) c2 q
! ]9 h' z* d4 H |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|