|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 u9 f, O$ d; k; J5 W3 l- _
3 e7 ^3 V9 f3 r/ i# {
问题描述:
# f6 K8 k; I! O7 A; U在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) ]8 N/ N' K4 ^2 X E& S; t
2 w2 [8 l7 i( i8 C' i7 {3 q( n
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
" h, R% N( Q; q: l
3 X& q! P3 j$ J5 x( \测试结果如下:4 G9 V: O j( e9 j$ g/ O
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# U9 \' q3 n: l' A, p2 q
6 V G( U, J7 l" Z# [/ h5 `, q6 a% @+ d/ t
备注:
3 ^8 j# Q; P; y$ Y6 `" \1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' O9 j4 H" \; t5 c% N! J1 |
2、相关代码如下:
& f) o1 O# I8 ]# _! B//UPP DMA缓冲大小512字节! h9 }; k0 n( r0 D* P; H5 Q( t0 W0 }/ v! r
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 V; Q$ V; d9 ^+ g! w3 n
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" x w$ b: y* M, m+ N# @1 y, S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT), L0 O( }# }- y* e& s5 r7 x. l
, U- x o, d" h( x
/ v* h G, y5 E
//upp接收、发送buffer
9 h' D9 z3 V2 ^, j/ }5 r#pragma DATA_ALIGN(upp_buffer_a, 8), i4 e1 Z* T$ B& R: _+ w. Y% u
#pragma DATA_ALIGN(upp_buffer_b, 8)
3 t }+ |$ b' D, I
1 T4 t" w9 u* A) F# Funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" \1 s! l _0 D8 } q7 A5 {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: y6 d" V) ]( f2 P
4 Q }: }$ A6 Z1 j z! j& z/ f: @1 x, s- {
static bool server_upp_data_recv(Server *server)
1 X0 p- R, n% T: o{
6 |8 o! V' p2 ^3 F9 r2 q, A \/ Z if(server->upp_channel_a_recv == false) {
( Q4 h4 ]+ @6 B, V. t server_msg_send(server, APP_CMD_LOG, "upp recv: start");* Z, D& c) u' [
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ A& @, _3 ?4 _0 d' n/ f% N server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
: t$ D0 ] ]9 B+ s0 d" \8 ~$ D5 z5 ~: z. |) B+ R3 ~0 e2 \! C. i- [
$ C8 B- x' K5 {1 N9 v, e: @* a" g: v
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* S) y+ E6 n/ ~- n
8 e# c. h4 v! A# r4 m; g server->upp_channel_a_recv = true;//
5 W2 |" b% x% Z6 G% i server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
! ~/ t- V$ b% }2 f server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;, N7 x7 r! v* ? |1 S* Z" f8 @
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;2 z! m5 z' z9 q6 d5 ? U, G9 \- Q
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 s J( C, w) e( n! L
' S3 S% f* t" ^( c: Q upp_error_count = 0;( C$ t6 G8 O; Z
upp_dmai_int_cut = 0;$ Q1 U4 f! d% H/ \+ F
- e* Z# K. K: B% ~% V. d
// fill in data
# O( \- X/ }# O* @ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- d3 C; K/ `% i
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# A D5 u, g2 R6 Z }
! W& j! U3 J3 O L) f9 H, c }5 W( @5 ^4 A! k7 E, N6 u
else{$ I' i2 [4 g, |9 j
if (upp_dmai_int_cut > 0){
/ a) `% F0 i' r: h0 I8 G% A2 c3 g& D; U DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);0 }, x7 j. K1 n, K' R# E7 f( V
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& d" q6 _4 D+ o2 Z; A' l1 ~
$ |0 n/ ]; F) k, y2 q: ?3 z( H3 r0 x) V- c5 N; h+ q
//copy data to upp_recv_list_busy
2 o7 Z: g3 L6 o7 S3 F memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 ]. w/ U! L/ g
. S: I% d( S8 S p; e) A- @" u# V! d* k //* u4 n8 [0 J5 s% x) h
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& R: B3 s8 R* K
- F% `) j* w- f( i" S //
7 L! A4 T5 t' P) l server->upp_channel_a_recv = false;//- G9 {0 `2 X# R7 o' E
- ~9 [7 V! ~" k3 g0 R% n# z server_msg_send(server, APP_CMD_LOG, "upp recv: success");2 N: D7 l, v( F! e: M5 @, O3 w% Q8 o) {
}" g* t* b% Y# Q; C
}
; {; [* l: }- M9 R5 K- N+ l3 i8 h' {- X- J9 ^
4 J/ [, M# k$ M; r! A. n# ^ return true;& A8 X. n, o% _( P; ~( q+ p/ A
}
/ N# ?6 s/ ]2 G, }# B% G9 a8 X7 u4 u" [- |
static bool server_upp_data_send(Server *server)" m b. O0 `, J$ q( T' G2 l( H
{* U/ @/ Q: D j, G1 A* y( v
if(ListMP_empty(server->upp_send_list_busy) == FALSE){- q4 W6 o# o% k3 K7 X U/ \
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
H; C+ e- A0 ] unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ {1 e, G3 w; |9 { O+ C
char tmp[128] ={0};/ Y. v) r( D) X% [5 P8 u1 k* e
: I* C; L ]; [! Y
server_msg_send(server, APP_CMD_LOG, "upp send: start");6 r, i$ a# A2 X" c
print_log(server, data, 64);: ~; j( d9 G3 U, [
6 X' W, ?1 R; M% U% `9 a# Y
//( i' M3 v" p# K. k. L$ B4 x
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& m: C! t1 q" Z5 n# ~5 }
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
) U$ U6 G$ M7 m print_log(server, upp_buffer_b, 64);6 `4 T1 ^+ `2 K7 L: z) f* c
4 v3 M1 P; I, M3 x j9 [- } server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);) [. S- J# \, N
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
6 e# e" a+ p3 Z7 X" D" w server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;5 m6 E- e2 o1 `" x* E" c8 O
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ V8 u# ]3 Y" {9 E$ V* { T
1 N4 T- [; r) x/ R/ V+ L/ R
memset(tmp, 0, sizeof(tmp));7 @8 |8 X: u4 [9 t P: U; c
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 n4 I. V& G0 _
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' p) w% w7 h9 _ server_msg_send(server, APP_CMD_LOG, tmp);/ n; q* T9 Y/ B: P( {- ]/ Z
) {8 r0 y- n) _+ C) e upp_error_count = 0;
( K$ \$ ?. n6 h/ y8 Y+ P upp_dmaq_int_cut = 0;
$ r) p# B" q9 j( V3 `4 V4 m // fill in data
) m- N* F7 F( y uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 7 M! z7 }- t+ ]# r# A7 Z8 G6 h: m
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* ` v8 ?! l- k$ m; q% p
, f1 K. g( i2 ^. w1 E
// wait send success
/ O# g1 R0 O1 q6 V( t7 A9 l/ M5 J while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' p9 q/ @3 d0 v: G4 _% B2 v4 V+ Y2 l! R
// make data node in free list 0 e( A; P- n J9 N+ `
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);, x: F) H9 v1 t0 d
server_msg_send(server, APP_CMD_LOG, "upp send: success");1 ]! }* L* {1 m3 S; I7 |
}& P' z4 u. |, k- h9 p+ E
return true;- M* k8 l5 u" E( u! [
}: r3 o/ R. E: O/ m
" u- U3 J% S6 z- l' J
% o& k0 e6 ~# Z) s4 o. `9 @2 m7 e7 M. K6 j
0 X4 n1 _2 Y; \8 h; J+ W0 Z
/ \% S" I7 Q! U/ H5 W7 V# d
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|