|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 e ?) c5 c- B8 s
! J# I; G# ?( |8 i# L
问题描述:4 T3 S7 d& [! ~1 _2 R; x# R
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- [3 \( F! T( p. c
$ c. j' x" o" I8 _/ q7 L图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。) A2 @+ C! d1 q; Q! V0 b' E, |/ u$ }, W
! x3 ^- F, _4 z- D
测试结果如下:
+ T& C" D1 q ?) Q) J2 }' q J138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: }1 f1 t/ \' k) @$ Y; A5 |& W/ v: _; x$ p7 x4 r! v# }) \
5 [( ~; C; W% W7 Q1 J% e+ i
备注:% @6 j$ w5 q) j' T
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! p5 K) h, ~0 ^, E* Y6 B# P, y2、相关代码如下:
4 U% ~0 B* }) B! B3 Q$ x//UPP DMA缓冲大小512字节
* o8 W' P9 g. V6 y" E#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍5 n+ l: ?: h9 e0 I7 c8 v3 r; ^
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' \) A/ U% Z8 o/ g P- ^4 a- W#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 F$ M' T6 g, X+ g; v6 Y: R
+ y# g' }% [- b8 V
! h& L) N4 e2 x& w
//upp接收、发送buffer
1 B* |; Q) `. m" J. Q#pragma DATA_ALIGN(upp_buffer_a, 8)! ^- W) ]4 K R
#pragma DATA_ALIGN(upp_buffer_b, 8)$ Q2 F8 o6 R0 T# \
0 ~" B& T0 Y" m
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' l/ r" f3 Q9 Z, J, M' `unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
5 ~8 e+ P+ u- }
$ H3 y; L. F3 _# _+ \" Q- H# t3 T9 Z( c
static bool server_upp_data_recv(Server *server)
8 J2 b" D' Y/ J& p{8 V8 L% K3 R1 \7 T
if(server->upp_channel_a_recv == false) {
0 O% U% r3 _) c5 _3 @ server_msg_send(server, APP_CMD_LOG, "upp recv: start");) R+ T( b! f: y; y, ~# j9 p# ~
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {. u3 I" w/ o% m2 [
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");9 h9 j' T1 O1 ]0 _3 Q4 H
* w" y# r' U! d A1 x
. u0 \& y& y# ?$ P: A& a5 [ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ }) ~5 V, M$ }2 c \- {
8 Z# `9 @7 _. O0 M9 m server->upp_channel_a_recv = true;//- y4 H% N3 {& h% z/ `# |* o/ o3 x
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);) v1 @3 h4 x( }6 D
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;! p- a3 D2 d1 ?5 g* O5 C
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;7 K- J5 V2 \: D5 N( {
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
2 z( A& }* [) w$ P' h3 Z- b _4 Q) k/ z) J: }
upp_error_count = 0;1 n |% I* t. N! Z- Z, ~8 C8 x1 `" k
upp_dmai_int_cut = 0;
* W+ G) |% m$ p
" Z: _' R3 p( j+ Z' A // fill in data - @; ]4 F, b7 x" ~
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);* ~- }: U9 t1 t7 I) _$ c- b
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 K( ~. Y* U& \+ ? }+ |+ i4 F' g6 G
}2 L9 q) p% u) L( T* o" K
else{
+ X' B" E4 z2 J/ x6 Z if (upp_dmai_int_cut > 0){
7 g2 k/ ^) V: c, E- s DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
# U: m5 d+ w% @- B; n% l+ ] Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 I0 @7 c" K M9 B# O& W/ t8 a4 q! s6 u' e' \
/ F1 W: |9 g% M6 d //copy data to upp_recv_list_busy. P: I" d# E3 n4 J& b
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; L4 j7 h1 Q9 j; C7 j ?$ x
6 |1 B0 W9 ~, Q9 E; j# [ //* q5 I+ c( I f9 G$ y
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);* l( u* ^, n9 P: E, B0 `/ n
/ g# d4 h' J# h* D9 r# x
//' {3 T% z# ]. `
server->upp_channel_a_recv = false;//
- f, ?( G j$ u/ R5 y0 V+ S# v/ V8 ~0 m) ?" E
server_msg_send(server, APP_CMD_LOG, "upp recv: success");' Y3 ~8 ?$ [: K- m
}
% C# K& j5 t5 F9 K }
( v) K! o! m5 g. B# s4 N7 M* e9 }# C( c T! ^4 v: A+ w
8 e6 z3 n: P, J: @+ J' g
return true;
- E2 J7 l3 `7 k* f8 ~}6 E4 l$ l% x# n/ M: q0 h7 o8 B
! n; q4 K, s8 c4 E1 o, m2 [
static bool server_upp_data_send(Server *server)# D5 N8 q2 u9 A% ^) _ }6 ?* {1 \
{
5 e, P! v$ c: U# V if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 V. g9 y( H5 U; F& k# N# l( ] DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);: _- Z& E4 o- ^7 i6 K
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 J+ l+ T4 V/ e2 H' ~% I8 z" P# b8 j) l char tmp[128] ={0};1 h/ Q- d* C+ E: f
$ E c* ?1 W, v8 v
server_msg_send(server, APP_CMD_LOG, "upp send: start");' d. P( ^5 P( e3 P
print_log(server, data, 64);
3 Z: H( S9 B& y! ~5 I( h
% L. T* u. s0 l& X //7 | I# s3 M- l" z8 N" J7 M
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);% V( `+ ]; K x/ X& R1 m$ P
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. g' z+ t, C7 w6 u4 _
print_log(server, upp_buffer_b, 64);
* d; {8 ?2 }- p
0 T, K+ k8 K4 ?4 `) h2 K server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
; s \- ^. g! P, q' p server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
1 m8 j' z7 i$ s/ Y8 r) Z9 d1 ?" o9 | server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
9 v1 a" O) Q) N, h$ M7 t _ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
+ w/ o# F4 h) C% }
9 z K9 V% I- c& u- U# b$ k memset(tmp, 0, sizeof(tmp));
+ e6 ^' j/ h0 @; G5 @# i% b sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' U7 W+ B: B# x4 l4 o" ]9 s; J
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ @, c% h7 z* P* B server_msg_send(server, APP_CMD_LOG, tmp);
: Y# \# ]5 Q; U. u; c: i x( O" Y2 v) K) P, F
upp_error_count = 0;# c1 _# d6 {; y0 y2 j. e
upp_dmaq_int_cut = 0;
% X+ \" E% _3 ~' v, _, ? // fill in data
) |" _( H( x/ U9 O7 W" y- L uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 t: |$ R8 e$ }" f" m server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
% U* a6 u& E: Y( @; n9 i' u5 l
& V' `# |( T" B- P" t // wait send success
2 \, a4 _/ D! [& J4 q while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' ~, `, Z: j/ D8 u( \
7 e' b) g# b: `7 c: Z( g
// make data node in free list 6 b E$ B) \) {) L8 l1 O' J2 t- s
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
0 ^8 u5 J0 U# G( f8 v0 `$ n/ J server_msg_send(server, APP_CMD_LOG, "upp send: success");0 x$ ?; _0 D2 E# U* x
}
3 Y8 x& e& I6 S) u2 i return true;
: k& b! w. z8 Y- }, }" E$ S}
~6 w: k7 f1 D- u* v9 O1 _$ B( R
0 F6 K& b( i6 G% H. w
, N' x8 d# a& F% S& e- U0 N, W, A# j) r
! U2 h) z& P" Q5 ?' ~6 I$ ~0 Q
- n5 d& y* ~ h- N& Z5 G0 u
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|