|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , `, Z6 c" o8 p0 h
& J1 _3 @; L: ~问题描述:9 f; Q4 l# n$ w, O5 e8 c t( w6 |
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下: J$ Z7 }3 m" j l
. m, G' j4 G% b! ~" I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。 G2 R) n6 f0 w$ s& e
" H' T5 d4 {- Q测试结果如下:
/ Q4 ^4 i" O( n* N* s A% f138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?! \: t. d% @% _) Y
! {- U- h1 ^2 s( }! |
P' U: g7 O2 H
备注:
* ^! O( p9 y& S# \! Y8 @5 A) W1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. z: `2 c( |: ^, x7 h
2、相关代码如下:: a. w4 @9 O# Z) j
//UPP DMA缓冲大小512字节0 \1 x W3 D; x* U
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 c2 K- w3 m; B* u9 c1 D#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
; L4 M) r( e3 C& Q* x#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT). u, v! S& j6 E* C ]
% `) `5 P; l4 `
9 @2 G# g0 G% b) x& h/ W//upp接收、发送buffer
/ B7 S( u5 d7 |5 h. W#pragma DATA_ALIGN(upp_buffer_a, 8)
4 b/ Y8 b/ X- D& [& T7 ?#pragma DATA_ALIGN(upp_buffer_b, 8)
) t, E" X" F6 h
4 j! N9 v4 _: Y6 ~* ounsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- K0 A5 M+ w! m& d/ o& `/ Dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];# }, E9 \ J* K
, q2 s4 H& q# }) x9 }
8 L8 P& f0 ^* T4 W
static bool server_upp_data_recv(Server *server) ' M# O$ Q1 T5 R2 Z# M" ?$ O
{- }5 `( R1 c' G+ y
if(server->upp_channel_a_recv == false) {
- v- B9 ~: A" i server_msg_send(server, APP_CMD_LOG, "upp recv: start");* m9 U0 {) [" V! ~
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {! @) Y6 E: A9 i9 b. q
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ V. f" q, D8 i4 Q0 ?6 _
$ w9 i5 M( V! X: m- f% L/ T' w, h4 x7 ]
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% B! B: t! M. }: u- u4 h3 ?% k% R1 K
4 u' b$ l1 T7 m$ m1 L/ i" V' I" J server->upp_channel_a_recv = true;// ]+ \8 L- R! X
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
& _1 |; _: U9 y4 r; a* c server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
% F3 A8 G5 J( r( H3 v' s server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;& q6 J; ]% m6 M- ^& G9 X
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//. E, d. T3 @, J/ S' y
! W( \3 C* ]0 E/ [
upp_error_count = 0;
" d) @% o+ \4 B, H upp_dmai_int_cut = 0;. Z: w: F% F, c6 \' {
* o% G' \7 m, Y7 |& s7 X: T" T // fill in data
9 x# B/ ]1 q( u8 `& a& c. N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, y, k5 Q" ]: K
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ f, `- p9 s2 S* V) I3 v% J C: V
}5 L' u: q2 h8 x4 b
}
: S1 H9 E9 c2 o* T( o8 R7 W9 g else{
( c1 r4 H4 w" ]5 n: Q if (upp_dmai_int_cut > 0){
0 J7 }9 `. j/ h9 B4 C$ O% B. G DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 G, S |: n$ F5 U7 U" S: W/ x; D8 h Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! Q' y) v/ {6 E! `. x1 n! ^
0 Z, D, u* r( ?# N- _
2 ~- ^2 U& E) G2 `, u5 g //copy data to upp_recv_list_busy, e: T! u6 x* C, y( a
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ g- D. o3 w# G4 S6 C
5 u. \2 x; V8 o5 a. \7 S4 N
//' t8 x1 r- X4 k2 C" n
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
8 C' z2 ~) s& G
5 u3 R7 C+ ^* i. c- N //
, i ^5 v @4 ?0 w; D% v! S server->upp_channel_a_recv = false;//
$ y+ v3 ~) I- d+ N' s2 `7 L3 t- f
" H3 |4 c( q# c; D! h0 K% j: o server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 i4 ^8 D3 ~8 ]# Z8 j T }
0 a0 _0 P! S2 L }: L, V; P8 ?0 {* E8 w
U3 S- n3 Q p( k1 z6 Z. m- r# z$ t; h. j7 p7 C3 e: _: R- w- v$ A
return true;- @/ l |; l& {3 R" V; X
}
5 a$ y7 O6 P% _% e7 u6 t% q2 D+ k/ t# c# } b, H2 |$ B( E" U2 s2 F+ _
static bool server_upp_data_send(Server *server)
3 I/ T! M3 m' ]{
$ _& T$ @5 l0 {5 ` if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, W7 T& N0 x. M1 g! z0 F DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 f x. E4 a+ |$ K
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% S/ [# Y; G! b: o char tmp[128] ={0};0 m1 z6 T+ y8 o$ D5 t
$ g" |3 B4 X. t& p; \ server_msg_send(server, APP_CMD_LOG, "upp send: start");4 r+ U4 K6 v: z' w
print_log(server, data, 64);) ^0 N$ v+ O5 Y5 ~+ N, d& p
4 p" {. |9 p# O# i6 ~ //% y0 q/ C. i3 ]# |* [
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
" u8 E' l' q3 X; W# ` memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 `& _$ C( T- F- s! l f# ^ print_log(server, upp_buffer_b, 64);& B0 [8 v+ | c
9 Z Z0 m S2 N/ }- V, B server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
2 F2 m0 J6 n4 ^5 a3 q2 P, t server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; . v0 U" F; \4 a# F* s6 H" p$ I
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;" l! E- ~6 B7 E
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 h2 ?) P' r! L" u8 B
5 a. Z/ j8 J4 |: o memset(tmp, 0, sizeof(tmp));
N G6 q2 R2 m0 f8 G sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' |. `) p! f: u% L
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ U r3 N4 S1 Q0 K5 x' O: F; Q server_msg_send(server, APP_CMD_LOG, tmp);
# {$ e6 H; ^! Y! E+ N# H* \+ R% t; c2 g8 K g6 v; q9 P d
upp_error_count = 0;
& c5 `- U+ h% s2 \5 F upp_dmaq_int_cut = 0;
) o8 s, ~# ?# S p // fill in data ( m; Z+ O/ }* E5 A! @( O% u; z5 @
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); " R6 a) @, q$ \* ]( F$ B
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ G# A& L" |9 E! n& n! P
* x' {0 A- K( R$ {! @ // wait send success
! h& P& u$ X4 Y* ~9 h5 `7 s while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * m$ {. E+ T0 @: L% _, d+ W
3 k. m! ]3 H) q+ A- z9 G: P& F // make data node in free list
?1 ~( m, { g- c; b ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) Z1 a' x4 P, ]% u server_msg_send(server, APP_CMD_LOG, "upp send: success");- k+ v ]7 D* H+ k
}- p4 f3 q/ C1 p v r) i1 D0 a) ~
return true;0 P6 f( @+ s3 n6 v( y' q1 S
}: g' H; a: \3 L; l& C
6 d9 w. z% H" q
' f3 s T2 t& e( f8 {
. X" y( \7 N9 `0 i# [5 y& Q* F" B5 U0 r
9 G0 c) W+ E/ w7 n [& ^8 U+ Z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|