嵌入式开发者社区
标题:
138 Upp问题咨询
[打印本页]
作者:
liangws
时间:
2017-4-11 14:43
标题:
138 Upp问题咨询
本帖最后由 liangws 于 2017-4-11 17:00 编辑
}/ G( n) A7 }2 ?3 M. m
4 G5 s' n& L6 x( w7 e7 K# T
问题描述:
+ I1 z6 o5 g C$ B# e! v
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
+ o; v, z1 F8 r/ ~+ k! @9 ~
[attach]2174[/attach]
4 n' c: w! I1 g6 V
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 [& Z% S3 a1 p7 ~, S0 t
* H! k: D R2 H
测试结果如下:
! c9 ^* F- K( ]1 ?) C# F) [
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,
这个可能是什么问题引起的?
' H G* B1 T, n
2 P1 o* l+ I# j: w
; U7 z9 ~& `! D! G/ {
备注:
0 }1 K A+ E& h4 {
1、看了upp相关文档,绑定的窗口地址
WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
3 ]6 q; ~6 J$ \& X0 F* {
2、相关代码如下:
' o7 @, y1 x" H# {# d5 t0 a, t3 T3 N
//UPP DMA缓冲大小512字节
6 A# j% `' l/ }5 h4 j+ ]) x
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 L9 w+ `8 M; y- Y
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
) u# X# y8 p! `+ I u% h" y
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
* e$ W3 k& d% S' E' J
* _& N+ b6 r9 x
' i$ W/ w& y- I( E D$ f$ e$ T: {
//upp接收、发送buffer
. V3 d2 e/ \8 |6 D* _6 p& Z
#pragma DATA_ALIGN(upp_buffer_a, 8)
) n2 Z1 F1 z6 I' H$ Y
#pragma DATA_ALIGN(upp_buffer_b, 8)
p. V2 r- H+ S, @
5 k2 c5 k j# R: p6 W. W' |
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
) \# p7 k9 a }4 V
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
4 B+ `6 S! y3 K' {, `
/ V4 V/ I* ~# T0 I3 }0 A
M( ?" C6 M! \6 ^8 O: o" Z6 m
static bool server_upp_data_recv(Server *server)
! U4 N: s/ D& [! ^
{
: i" _- K0 {' F0 |1 z+ ~* Y3 A2 x
if(server->upp_channel_a_recv == false) {
+ U' _$ l. i9 h4 D; U! C
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( [$ ?+ W: |( f- A4 z6 }" d K
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
3 a$ N) b# g; w3 \1 r
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
" }- s9 T. p) E/ Y4 T5 A4 ?9 k
3 b% ?" j" L' |& s/ ?3 d. s
/ K( U! }3 b7 v, m$ y
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
, E1 n* F3 w2 n5 B9 ]0 \" E. J
, @0 m# [6 I( |
server->upp_channel_a_recv = true;//
1 L D, w) V9 x! [1 ]3 [! D% e
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
/ E% K) i$ C# c+ w" b; o5 O
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
# ^6 s5 x; J o7 Q# |
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
' \) {% q5 B) [) U
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
! a2 ?) @) K5 `9 H ]- E- E
- b# m, a7 z% W1 t9 I ^( K
upp_error_count = 0;
' [' d8 }6 | u
upp_dmai_int_cut = 0;
3 Z% p; y* L# s: d# v _& C/ {
& `3 _3 Q* ^1 b; l2 O' Z9 s- C
// fill in data
7 f3 Q& k+ Q: s, D: W. e- [- Y
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 \2 u5 k$ g* [6 z3 S9 [
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 D* }9 L, E' S1 j9 c
}
6 O2 n2 p7 i. G/ O
}
" u' u- w- K1 ^
else{
% w2 w% e! y' _% I$ C( T9 F
if (upp_dmai_int_cut > 0){
) Q$ A; @: @2 H. o1 U7 C) b
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 R" O" d" z% g- b1 q3 t" j
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! y9 P) j' X0 d; N! K# O. t2 V0 s
' p' D* K. j9 }9 J. \1 c( H
5 g% ?5 |1 X2 R
//copy data to upp_recv_list_busy
4 J1 x8 X3 `. \) \1 L! Y
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
5 `2 c5 ^/ N5 n
3 T( q3 w K h6 o. e- M! _
//
# [' o5 T1 Z4 z& z; [+ N: E d
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" i0 a: M! ?5 t0 p9 _
# Y2 d8 p6 c3 Z, Y8 I
//
$ w; J- E' Q% p1 q* _0 |
server->upp_channel_a_recv = false;//
' h* |" N/ ]& Z( Q
1 Z& ^8 e: \; p M& ]( r% ^- p
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
" D( a u( D- }: c' ]
}
Z) l) _8 a# J7 N
}
+ [1 `3 e9 v: n& k) }, r# `9 [9 E3 Q
2 k1 V# \$ _5 a# U) }6 W6 w
2 m9 ~2 H. Q, B' M
return true;
; W) w5 {/ |+ s$ n/ b
}
7 Z2 J! z6 z% N
- X1 x$ t+ T( [7 F
static bool server_upp_data_send(Server *server)
W1 ]. {5 L& c( o: G( [
{
; a! ^- r% z% p7 y9 F
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
# w! j7 F+ @; K! \
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ R; z" z& O8 o0 ~
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
3 d: r8 }: x3 t. L
char tmp[128] ={0};
+ x& ]' L8 R. w9 e: q" k
3 M& F* |) r( Z5 F3 Z# d6 n4 o+ o
server_msg_send(server, APP_CMD_LOG, "upp send: start");
3 w( z: m2 h5 z
print_log(server, data, 64);
. g* G: \2 A/ ]! }3 i
) u; N- x9 c# t( ?, x
//
4 T7 z+ u# T+ J! t
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 d" C4 H/ N: @4 y6 i
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ g2 }3 N5 f/ @0 V3 L% F( l
print_log(server, upp_buffer_b, 64);
% C* t5 U8 Z" ?( Y
+ U- M I% O7 u2 l: S) L
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
2 e" K8 J2 [$ ^
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
& t7 F$ l, }$ v- C, C: [; i0 k/ o
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
0 \9 J* A* [/ y" {0 S" n
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 d% w: A0 g% P1 C
; o5 b1 A" X0 w3 }
memset(tmp, 0, sizeof(tmp));
: {) h" e- Y* c- C/ t2 e- R
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
% E5 V6 U! K7 o! T; F9 ^$ s
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
4 D( r; b. n" U# x3 W& [
server_msg_send(server, APP_CMD_LOG, tmp);
7 p# `; `9 \3 m# o. M2 L
0 t/ V9 z. U7 g+ b9 L& f0 D; Q
upp_error_count = 0;
6 ^( k* B7 S5 n
upp_dmaq_int_cut = 0;
7 p; @6 a; V# T/ k& J: a5 ^
// fill in data
0 _) }- C# _" [' C
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! E% K2 S0 A9 ^& I- o/ n r8 \
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. S6 U( ]2 C9 q
: K L5 b0 \; A
// wait send success
. n& t& [/ B5 f$ [1 F
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
3 X1 y9 G4 a A* C
' F Q7 t b9 d7 W+ L
// make data node in free list
+ H% {. C6 U' Y" p6 q7 R+ |. U
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) j( v5 X: l6 Y5 o* `
server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ n9 W+ U1 G) p8 c
}
3 s# f6 q3 B% ~) S9 e
return true;
D. S- f& z# ]% U# l
}
- H6 A1 t5 n2 t/ Z# z
0 _" c+ L+ f2 H0 k
4 \, A& d& y2 G1 N; H' M, u; X( `
; {0 `, S* q, k0 Y
4 O1 g9 }; d! u. U1 K# o9 f- D
2 `. z! ]: E- F" {. O1 Y; F
作者:
human
时间:
2017-4-11 22:03
需要边界对齐
3 K L' Q8 n! C0 L2 a% A5 b
[attach]2175[/attach]
' j, ]5 |% D+ ?: o/ T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4