|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 O4 ~: U* a5 \% k
! A! n- I& Q$ V( k a/ ?8 g$ s* _- T问题描述:
3 \( V' V2 r$ t* N! p在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:2 q, ?3 G2 w7 E _# I
/ b( J* c" D0 k图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
# ^' _8 R, G/ Z i2 g
5 A! |, h7 w; m4 ?测试结果如下:
9 ^( r$ [, N; g6 ?# G138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?7 n6 f# C( f3 d5 |1 x( v7 s
+ J' | S( Z$ q. A U% L( Y& {9 y
% n8 l% E5 j4 @6 Y备注:
) \5 q$ W( ^+ F2 f& k% @ C1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?, U- L( m1 h% E' o
2、相关代码如下:. ]2 k6 {8 S! Z; ]- N/ S8 F9 P4 G& x) ~
//UPP DMA缓冲大小512字节4 f" F. d l' N' Z. A8 }4 ]
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ B9 E0 g, K! k#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT9 S$ O7 L" E& t; B1 a$ x
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% R P9 J8 T" ]) A2 p9 t6 F, [
/ g! q' E! X' T3 y. _5 {( E( X+ Z
//upp接收、发送buffer
$ Z5 F5 {4 X5 D9 s4 S" a' ~" _) r#pragma DATA_ALIGN(upp_buffer_a, 8)8 i( C0 M' M w. A
#pragma DATA_ALIGN(upp_buffer_b, 8)
; f; Z, \" |2 v, |8 J) w; d* o! B2 [) t/ H3 R) e5 T: L1 a
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
9 V( i$ K3 |: S7 m" A; _4 {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];7 a* l6 g0 L6 H; K
# {2 B/ O) d5 y2 Z, l# E5 S
. u3 M1 T. ?, N6 o7 ^# Q3 Sstatic bool server_upp_data_recv(Server *server) 7 v. @* F" J# t
{
# O4 D) I% d8 b if(server->upp_channel_a_recv == false) {, g+ l, [# U n `0 }; E
server_msg_send(server, APP_CMD_LOG, "upp recv: start");6 w+ k3 W3 H9 V& u) b
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% q: Q4 V8 @, F9 R5 _5 S/ D( O server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 b. Z( f8 O6 t" i2 h! G4 V8 E: N- r' a+ c
" ~0 P' m- s( P$ N
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ O3 o! l5 {% M; R: `. _
4 P8 l9 S$ T# @, G server->upp_channel_a_recv = true;/// O N. A5 [, b a% W- o
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
. c$ e2 p1 d% A0 X2 _2 P: P server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;, y; @, {0 V$ `8 _
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
% [6 H; i! Q: e5 B! r server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//& C4 b0 T) A# ^! p, x
" N: z9 y" r) }+ e# m; N
upp_error_count = 0;! z) `+ s' B; N) j
upp_dmai_int_cut = 0;: m. B( q5 R4 c+ a
6 c- Y6 ^8 p- Z* v. H9 p // fill in data 2 z" G& W% I3 z }# S: m
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); L) P! J- |! f8 u l' L$ h% |0 E2 t
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. S' [5 ~, Q9 p. D" C }* j5 {4 g( `$ ]! _
}
( D& ^2 L. ?6 H( Z( b1 i else{+ w% G/ |' g; p3 r4 R* M
if (upp_dmai_int_cut > 0){
: l1 C& X. k: ^' S/ @$ z4 w4 s: n$ H2 a DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 Z5 N4 S2 }; Q2 `' w
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
7 `3 ]2 w6 X7 N# b' d( a. p# h4 D/ E# R3 s2 i' U) c: o& q
! E8 Q* {% |$ i! h, o
//copy data to upp_recv_list_busy
7 w) Y! Y4 z2 j# v: Y( d" [" v memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, H) t# K( ~8 H6 I8 Z k
* h4 G2 H% e+ H i h5 x0 T! a9 ]
/// l z3 j9 b" [+ s# @
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 \( ]" @7 @8 m
7 ? o3 W9 d$ } u" r. _ r1 G: O //6 S9 _* ]9 Z+ v2 X/ L5 s, s
server->upp_channel_a_recv = false;//
; _, R# I( c; m0 ]9 X) H- Y: t7 } u7 w
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ l; @% N. y% F( `' J }
# E4 h5 g% P9 V }
$ P" h3 ^2 C9 e! u; T% I8 n; B( o, k0 O; Q
( t7 U3 }1 C# ]/ H9 P! k return true;: c3 E B. e6 ~/ `* T) y
}: D, ]( B( V3 p% X& r3 @! q
5 [9 t3 D" e- g4 q4 R2 E
static bool server_upp_data_send(Server *server)5 @, w* E4 ]& \$ l3 z( q4 |
{5 Z, P3 y: E- d5 t
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: e6 H( d" }+ L7 {, G' X4 D% D. ] DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 T. o+ J3 p6 d1 J) a1 f unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* W$ E. L9 M# d4 e2 j char tmp[128] ={0};- ?8 q$ I$ ?; ^8 Z
8 t0 V8 j2 r! r/ d, n1 t: f" | server_msg_send(server, APP_CMD_LOG, "upp send: start");
3 l% R* I7 \% X$ S: i7 i: K3 g print_log(server, data, 64);
5 ~" H7 s, w! f* o8 y4 U$ m8 I. M
% ]+ _ L2 V9 [" c //5 s+ p- a5 s2 c: ?3 s
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- L8 o/ T; A' o y2 M+ Q memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% m7 q' F( M" H* p' I, J0 k$ j) \ print_log(server, upp_buffer_b, 64);
2 s! F. w9 i% Y% F$ c: O& @% X& n8 T) x$ F* j# z
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
2 y4 [0 A9 X3 { server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ; ^( x8 c3 o, [: Z$ n% b, E, F3 D+ ?
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;9 Z/ n9 v3 ~$ i: Q C- C' ?
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, ^, c$ q# @% c, O) K8 k$ `8 W& j8 X# \
memset(tmp, 0, sizeof(tmp));
* {. P! p- K5 E. v$ m" O sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", / T( _0 P9 v: B8 G# [) _
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 i1 r- w+ Z2 A# {- G server_msg_send(server, APP_CMD_LOG, tmp);- w1 v& u+ U/ q1 s2 D4 P) }6 L# Q
- X3 }3 n/ b9 L upp_error_count = 0;
' u) a$ G. \: N9 g* t! n" Q' m( Q upp_dmaq_int_cut = 0;6 ?5 V- {/ W7 Q4 `, a
// fill in data
+ l- ?% {8 W8 g D3 |+ }* r* o uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 5 q4 s) D+ y& n. }4 i1 v
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. u- l% B- _* @$ ?+ P" \
3 }0 q H$ h) n/ q! P; v // wait send success" T1 V; v; I5 Y- x+ t& v
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); h1 u7 S& s+ O: |0 h% ?, }! e
& }1 Q/ g8 f- G1 A6 N: E- K
// make data node in free list - B/ }$ ?! h' h: ^7 [
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);+ f! h% u4 G) n. Q7 A" J
server_msg_send(server, APP_CMD_LOG, "upp send: success");# d, n9 h; a! f. L3 Y. T
}% i: `" v" g: M1 s
return true;9 R6 i- ^, [8 p' M+ Y
}
" e9 |5 X5 y7 P7 p( E8 M( R: s. e* ]0 G% }; I7 \
! K! i# f) \% G: ~9 q7 l8 E
+ _" Z( S8 b/ l4 |& W$ t3 A' v* z0 {! P" N" |$ B. ~. x1 M4 Q
; S' k9 v6 C; V) u5 R
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|