|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
. f {% e6 L0 ^+ s$ \' z" l# b7 |: @5 b" A
问题描述:
; n0 K0 D0 C! `( N$ J; U在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
8 T& y2 @+ K, _4 ?
1 T1 W% R, m4 l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ z! k }# H& H' |7 D) E
- ]- {8 S! f: ]1 E
测试结果如下:
( ^5 Q1 ^( c& u138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 {$ V/ A' e$ q2 {! Z& w
+ S; Y- r @7 P" R+ ^/ ]+ ?0 A+ ?; I/ y. h/ ~# D5 R! W
备注:; |- r' x/ X# k& C
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
3 T ^0 F. S& s8 E$ s" Y5 I2、相关代码如下:( ?4 q: u- i7 Z5 B4 M
//UPP DMA缓冲大小512字节) g* X" Y( D' i+ K# X2 L
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
3 R' h: O9 V" b4 I# ]8 m#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' L* T& n) q8 W. n+ U& P
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
# B0 [+ F+ {+ q( x* y, c# S5 ?( D# }% j8 x; t
& O9 L7 x2 V& t# w//upp接收、发送buffer3 F- u2 ^/ {( m- F9 k1 ~. b5 N
#pragma DATA_ALIGN(upp_buffer_a, 8)" T( y% j; h4 [' @1 t1 f- M
#pragma DATA_ALIGN(upp_buffer_b, 8)3 I9 {7 o2 b1 U4 z
# R: ], f7 a) ~; d
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) C8 ]* F3 P" b" H9 k4 i/ N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];5 O5 ^2 ~! M) f9 I' J' X
7 [& E9 {" {# d! ~! B9 x4 P9 z- G; ]$ v% u9 h, c
static bool server_upp_data_recv(Server *server)
' M2 i: d$ [2 k g0 l) b{
# R: G* q7 W# U if(server->upp_channel_a_recv == false) {- i, d! M2 ~, y @/ ^5 h& w5 @$ x2 V
server_msg_send(server, APP_CMD_LOG, "upp recv: start");; F6 V6 T8 y/ f$ a
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 p0 ]% y9 M: z# i; ` server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");" C/ A/ `( `* A. m( y2 A
( Q6 p5 ]" z! O
& E5 l/ C1 [/ |, L/ S
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 d( F& A% {9 n6 v |! r" p w
7 ?9 C5 s4 j: C2 Y/ F/ w server->upp_channel_a_recv = true;//) H5 v$ O) r, R/ i6 U" W1 r! k3 X
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
0 {& K) b4 g% D) ]& G server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;4 p& O% e( J8 ?" o8 L: v1 G
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
- D7 q( ^0 H3 p$ k server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
& |2 k4 x8 n5 M+ O! O9 p* x$ A, o4 H
upp_error_count = 0;
: f$ Y+ m" h8 [4 ]' T+ [( v5 Q upp_dmai_int_cut = 0;1 {; h* w5 N5 J( r j3 y
+ e; G0 M/ w) _# j" s+ {4 u" [, \ // fill in data 5 j; x$ `4 o; X8 X5 A8 }
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" Z3 q; T* P, }. @5 Z& l0 |) n server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi"); O# F0 `, M: w* f
}
" d( a2 q* B5 W7 J3 m8 T" i }
2 _/ J4 @/ f# F' L4 q5 ^ else{. p; Y* y' {# ?+ [4 I7 f
if (upp_dmai_int_cut > 0){
1 x {0 K( P- E4 f9 s DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ ?5 g! H% N7 h% @
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
. P) j" w/ N% Y U! W
" V9 _2 @. i- j
5 z7 ^" R$ M& w/ w1 R8 B1 \ //copy data to upp_recv_list_busy
( o( v X$ ^0 U0 b1 S; b memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
7 L6 p1 R; @/ W0 J( W
7 x& I7 w* P6 U, X. m5 J" y, ~6 ` //! K3 }' z* F0 [0 H1 d$ U! C1 P
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ D1 ^/ r9 |+ E" P6 U: L# Q# b, y0 ~5 n' U$ k! b0 K
//
. q' }+ k0 D* U$ @& Q, {5 s server->upp_channel_a_recv = false;//
7 @. E5 M ]& w: S( c6 |* H3 s3 K$ G
# t$ [9 v5 h# r0 }0 B3 |5 i/ o$ c' v server_msg_send(server, APP_CMD_LOG, "upp recv: success");# L0 ^3 k) w7 c2 X( q& I( y; G
}, `5 u8 f6 A- k! i
}
( _% C0 P1 F G) K5 J
8 Y& d# _! q m% @ U/ ^
5 c+ }7 r# ?2 b; [ E" E, y$ D9 h: O return true;
' {. L. X' c; f" s i}
+ ~# z7 @' H8 g
1 A. f1 M( t: l6 ostatic bool server_upp_data_send(Server *server)
( }! y& i; ^5 a! r: m+ ]{
+ [$ o6 o. S }- {8 c8 C' u3 l" X if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 ^( L8 U# M/ y) ^
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ [ y+ b d% O; U$ l5 {
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 J4 P: j( b: O, t3 s6 ~& q7 G
char tmp[128] ={0};5 L% i% @* A8 g, k, _ O
p9 u( T7 T% |* [* a server_msg_send(server, APP_CMD_LOG, "upp send: start");
: M. G8 o$ Q7 I print_log(server, data, 64);7 p6 ?) n1 S: [% d
) h2 r: |1 j- x- I) o9 k) ~- S4 h //, f6 j4 @ O7 n8 m2 X8 l% o' h3 L
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ Y! x* Y) B' g9 Y6 H4 M
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! X$ g/ M' f" v% W' P( O, c: P print_log(server, upp_buffer_b, 64); o" d& G% C: E; l9 ]
' i) r/ l+ Z4 j# f) C3 e server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
7 c, v4 w9 [5 c3 ` server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
5 g. m K. [! { h! g server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
! Z/ J2 Y: ^( \1 A: K: `- s server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# v1 q: w0 A; t( P- f7 c7 c
1 B, T$ l& g2 h7 `( v4 K% j0 F
memset(tmp, 0, sizeof(tmp));
# u! ^5 Y- Q6 {$ `$ { i sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
% |: q; r- `% Z3 x' u# b0 C sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; d) M2 z, n6 K) K0 j9 C2 N+ g8 B
server_msg_send(server, APP_CMD_LOG, tmp);
" L/ E: V$ P' F$ A- L q5 i& h5 j- l' s. \2 m/ W0 @" T8 n
upp_error_count = 0;
1 G2 k J D0 |$ R8 g7 ? upp_dmaq_int_cut = 0;
- [$ N5 a- @7 A4 s2 S" h) f1 { // fill in data
2 Z; {% H! e, V' C uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 7 L5 H7 i: v7 ~* p2 J2 Y4 x# ~
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# [2 D4 K$ B) L1 E* a9 G* [/ Q, S+ L; H
// wait send success
6 A: x& l% J7 q2 U1 Y while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( J8 C, `% y! S c8 X x% D/ [7 `4 R$ T. y' @
// make data node in free list
7 L! o- w+ `1 t" a ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
* L) X7 Z$ Q8 m i server_msg_send(server, APP_CMD_LOG, "upp send: success");- l# y5 \: L& G. i5 |6 \" O8 _
}& c/ C4 z9 Q( z# \2 I" J
return true;
3 @4 L( B. p8 B4 f- y}2 L$ E. M/ U" J3 `) t/ G
! }5 W" L& Q, O; w: D; y
! m( v3 g z0 b% L/ x, p3 S( c3 Y9 u/ ]. s' j- }
# o2 R* p- z( E" B* {# a5 W
- D% F3 s! O. m7 G2 d
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|