嵌入式开发者社区
标题:
138 Upp问题咨询
[打印本页]
作者:
liangws
时间:
2017-4-11 14:43
标题:
138 Upp问题咨询
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' C3 }9 E- K+ u1 ^. B% y
! I2 U( {' Y _" P
问题描述:
e! E% Y# @: y0 [
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 `6 B3 z: @8 X
[attach]2174[/attach]
2 `1 D+ q" L8 \" r
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. N" i6 \, p0 b" l
5 |0 h$ U7 e, D6 n+ O
测试结果如下:
8 U5 j0 w* d! W/ i- Y A) M+ a
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,
这个可能是什么问题引起的?
: C9 F8 M) E: B J- c0 R4 i
+ z. X/ F3 b( k3 x* @8 B. Z
% {; Q& S1 \7 d: v: J* y
备注:
. z8 S" u* O, V
1、看了upp相关文档,绑定的窗口地址
WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
6 F* A# `' s9 Y/ C" w6 ~4 E% B
2、相关代码如下:
/ k d. N& c- X4 j
//UPP DMA缓冲大小512字节
8 a1 r) X" x& x2 Q' z4 D
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
4 |- p0 x. V* w- D
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
+ `3 ~2 b/ |3 k" S% f
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 a |. @. V* r9 t
% Q& k' N9 z. C% [& \
. p- ^! p0 t: j% E% U1 i+ H
//upp接收、发送buffer
: U6 C* k* S& X( F
#pragma DATA_ALIGN(upp_buffer_a, 8)
0 M. s/ N$ u3 a4 p( q; b6 N
#pragma DATA_ALIGN(upp_buffer_b, 8)
' K+ H. Y3 `+ ^* k: U& k
# N9 |" C; Y% W" L
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" B* ]7 ?" N3 N l7 A: F
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
9 d* _9 L# J( G
- c: |7 c: p+ b( q3 w4 c$ J: ?- I' K
( d/ W- ^6 X& ]$ c2 w
static bool server_upp_data_recv(Server *server)
7 A" j! v$ j6 H. L9 q* t5 ]5 x: [
{
# n, _) o- I+ g
if(server->upp_channel_a_recv == false) {
$ d& ?4 j5 q4 D; v6 C2 G% t
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
* w5 v$ b' p+ y9 F
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& k, _! Q( M2 \7 s n7 f
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ o% {/ C8 Z5 S4 @& F8 A
# Y$ P2 C2 @* y, N
5 G$ C1 [( T) C. v4 O1 x7 P- ]
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
# I; m% U/ K/ H/ }* j5 r
8 C- N2 y* t4 F5 x' b* D& V0 Q
server->upp_channel_a_recv = true;//
8 I3 u w8 X3 T! F/ D6 x" C r
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
2 u$ d r6 t4 V! W/ M5 {; ]/ \: z6 Y0 k
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
9 m4 P0 Y& l/ m, M C/ V8 m
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
! v9 D5 n: i$ [" T
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 M% Q) u$ `) f) V$ H
1 Q: X! _) G; z. ?1 Y
upp_error_count = 0;
. |. s$ w; A* Z* r- I
upp_dmai_int_cut = 0;
5 Z9 }5 F! d& C
% o- u+ E* h" r7 K( B( E e
// fill in data
3 s% z: z1 O7 a4 A& n# ]
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 |* l8 x7 ^7 r% m9 g
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; r( Z4 x, t, _/ ^. C( \
}
: O$ N1 U$ P2 o% m/ u. f3 q0 ^& T
}
! \3 E# U7 r2 G5 {, d$ d
else{
5 B2 J$ M5 Y) Q' A9 Y! I
if (upp_dmai_int_cut > 0){
, M, T# B& N/ S. o; G+ `
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
1 s: |$ _0 N- }6 k, e- Q% n
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
% k4 d" R# v* Z( T; g
: r. B! t- j; h( q6 G4 `
0 C6 C! V8 F& l! [9 \
//copy data to upp_recv_list_busy
4 X/ \ C- E5 F3 O# y
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
: D, @9 a: n7 T# h; p8 o) \
+ V1 e, v. X) c- T6 U& t2 ~. d6 `' l
//
+ H( ^1 I( G2 P5 x! R0 [# b" s# z
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. W- p$ O+ b+ f/ G q' o
4 d1 c) U& g6 l i, }) Q
//
, f+ f: M' k% z% v
server->upp_channel_a_recv = false;//
( D8 S3 z$ d/ L" u i
! K4 F7 H% [, y9 i" m& R8 r2 ~
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
" ~: F$ |3 k* M- I
}
3 f9 z; V1 ?9 Y& m% {1 k
}
% A1 V0 O, r. M- \) c# p3 c
$ n, @: p. ^1 |9 T/ f
* h- D& s1 W) F9 w" A2 ^) I6 v5 q
return true;
( g- n$ E. v3 Z! x* e
}
, P4 m* b* x7 m
: L; w p, P: n0 c+ T
static bool server_upp_data_send(Server *server)
@4 L A) A# `+ p2 S9 S9 x b
{
4 `/ |6 V% B8 n% p" y' q4 t
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 m$ Z+ X& W& `! g) I* U3 w
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 W$ b% s$ w, D g B8 p, z
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
$ p9 b+ Y0 U8 a) F$ R8 P+ J4 Z
char tmp[128] ={0};
/ L2 u* C" I+ _7 z
5 p+ s4 ?3 m6 m$ o! g$ j" a0 ?2 V' T
server_msg_send(server, APP_CMD_LOG, "upp send: start");
) V2 l8 A" L+ o5 n4 k) \0 \) I7 l7 v
print_log(server, data, 64);
) _* \8 @' n, b
% C3 l6 b; i* P5 J7 X6 n0 M
//
* L3 \ ^& Z- ^+ t5 {
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
# H0 D* U5 {' `2 R" V
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
) l6 J6 `2 ^! N% x! K7 i; E& s
print_log(server, upp_buffer_b, 64);
! \: ?6 ?0 o' `6 v+ I
& x- e2 w% s6 w& n, o+ U; O
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
- z; I6 m4 e* [8 Q u, L
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
; v) V1 }. z' B9 X, }+ h3 k
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
. c3 _% h$ _! g4 R
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 E- Q% U7 I, p
5 P7 d$ f% t5 C2 K, H! D m
memset(tmp, 0, sizeof(tmp));
, s& {6 b5 l$ J4 Q& r) h
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) w+ ~. d- I0 I+ Y* l: Y
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& O! U$ e; b% k/ A. R9 Y
server_msg_send(server, APP_CMD_LOG, tmp);
/ M$ v. V1 n. o9 w1 f/ F
/ s( l! B; I1 V; D' k, {: `8 ^& t
upp_error_count = 0;
7 b/ n3 `' f% x* i/ V% r& e: t
upp_dmaq_int_cut = 0;
& l& b5 i; t% M* e6 F, [
// fill in data
* Q3 {8 X0 w0 [& X
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
' B. ^3 w8 p; r9 s+ z& ]& U
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
3 {0 y! @+ D% \& I t+ j; W
' J' t, f5 x# w9 n
// wait send success
! g# {. h1 e* D6 E% n0 O% }
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ M9 @' g. u; ^8 j, r$ N2 F( w! n
' j# T6 k0 D7 ~) R" O" {4 H
// make data node in free list
6 W% W% u C- P2 R# K# Y
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' P0 f" e; W2 c, C% T
server_msg_send(server, APP_CMD_LOG, "upp send: success");
R% B! Q" `5 d7 B( Y. L& M7 h( j
}
9 q6 ?! n" ~' ^
return true;
6 [( g1 b$ U7 v. {" ]; T, W( ~
}
& D+ t3 L0 a% K# I
0 U% M% ?- N6 R
! k t4 j A: @, R) H+ s- R
. ~$ H- E- o6 {2 R9 Y# a0 H0 s
4 M) r( l4 g! B1 q" `
4 N: S7 E u# u2 J2 H4 }- f r/ I9 a
作者:
human
时间:
2017-4-11 22:03
需要边界对齐
- a1 ? S$ x7 [* K9 Z4 e$ R. |
[attach]2175[/attach]
" F3 P/ p8 b9 b- T! }6 l) U7 v0 t/ A
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4