|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
( x3 y6 J0 _5 R; E& I# q. \( }' n! P2 l
问题描述:
; c) b2 m( G1 a, `在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 y0 c1 A1 n+ C6 r" O! l" _* k P" O+ K0 A* u
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" c; _$ w. Q$ f7 w7 T- S
4 Z6 H0 O* q2 \9 S" Y% W* w
测试结果如下:
9 X' e/ y+ }1 x138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' Z( [ N8 E; E3 l+ g
, ` ^* z1 Y. h2 j# ]9 f
& e3 L8 i4 _8 ?8 g备注:
2 `/ y0 |9 ?9 u* a1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ P0 d# c( `8 \* K2、相关代码如下:- A: W9 C( d: V! I6 p' M+ v
//UPP DMA缓冲大小512字节2 q6 T3 q* i3 Y4 V8 g( V
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 s7 @! f1 `0 v2 { W#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
- ^, q; ^: N3 \# @. y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)' d! O/ }6 P z1 z4 [' [9 L) t3 i
9 e/ U5 m2 A8 U
P9 G; ^) ]7 c; T, U7 w//upp接收、发送buffer
2 j1 Z( M9 c$ h( ~#pragma DATA_ALIGN(upp_buffer_a, 8)
5 p& i/ T3 t/ g: |! ] _5 z3 N#pragma DATA_ALIGN(upp_buffer_b, 8)( D4 g2 [ D7 {. C* k
' X: @/ f4 V5 s w0 Z y) C2 K
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];$ a# V$ W/ R' L) m2 q# i
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& f% J j* q; b' T* b, b J+ S
* x! q; V! M/ D. o# h% i
+ v; k& U; X( k7 i1 S/ e
static bool server_upp_data_recv(Server *server)
; p' c0 `2 M' x! } f V1 ~{
3 }5 s" |+ `* d1 p) z& h& z! q if(server->upp_channel_a_recv == false) {' a% q6 d; c0 L* c& |
server_msg_send(server, APP_CMD_LOG, "upp recv: start");; u% M1 U4 R) m4 W
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- H# e& I- F# S" J- w
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# |! {0 R. I1 \0 T
; b9 u B) @8 m
9 P+ E' {# c2 |0 ^ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 ~ `$ U7 b% c S
. Z& a* L5 Q& L& |( G( k: H server->upp_channel_a_recv = true;//
: h3 D9 Z/ q( C' f server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( y. c ^; Z: S' L
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
* u# U% ~5 \9 k% i3 U server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
9 F* i) u2 H7 t: G' s J% M5 b' H6 b Y g server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
, X$ R; t+ J) }. g# ~& ?4 s. c4 H9 d
5 f: X/ w ~7 [6 g9 O upp_error_count = 0;5 J8 v8 v; ]9 {) w
upp_dmai_int_cut = 0;3 V% Y% t( ]$ q! }( J4 {0 s& @
# O+ b5 i( n5 u& h3 G
// fill in data 4 h8 x$ c6 H% P- `: E
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 q- S* e! v: I5 {2 j1 S+ o: x
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");$ r8 d! e# @$ f* P3 O, B: v
}
1 }+ O) R( z N# j- a; r }1 k' x- r I. N# `
else{- \! E" e# @, b% d& Q
if (upp_dmai_int_cut > 0){9 N$ r9 ~/ G G" D/ v, @4 ]
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);( B( A$ a( Q4 j! U
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);0 m; {( B1 U: ~( O, s. I$ G3 d
9 Q/ M2 t o% T
( U9 d" X: W7 ~! j- [( R2 P
//copy data to upp_recv_list_busy
3 X7 h, D+ y1 g! I8 g4 ]$ T* _* L8 q: x memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* e7 W+ b) Q1 u! c7 U! E9 j! e
. A. ?' h0 r0 Z2 f* z
//
, U; c6 ?6 U9 D6 [, a( H- m9 v7 U; B ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
4 F* M/ I& u8 B
( T- k, K4 J& j% \ //* u$ M! N; o! G$ z
server->upp_channel_a_recv = false;//$ I2 Z- P$ E8 O& ?: K, ~
2 g& m/ t/ O( C0 ~& k server_msg_send(server, APP_CMD_LOG, "upp recv: success");9 h$ C! i! U3 U7 u
}* k0 Z: V4 c. [3 |0 j
}
1 F5 ?; t6 P; P
4 _( X9 T2 [! V/ }/ s" d: }! _6 f ~4 O$ T9 p- q
return true;; ^$ N3 Q0 z6 g
}
' ]' U4 N* m8 W0 H, }" i2 I! {# Z. p% E1 p% j
static bool server_upp_data_send(Server *server)1 P* O- [$ l1 T
{
1 h3 P- t* N# S" A. T' Z+ F if(ListMP_empty(server->upp_send_list_busy) == FALSE){- l9 a% D. [; o, ~8 j4 n b
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( ]* D0 q" f( p0 M- H4 }5 |, t unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer); Y& m% u; t, t% U+ N
char tmp[128] ={0};1 H7 g& K3 s, o* W7 c k' z
- a+ j# n! m# s1 U3 e- z8 T server_msg_send(server, APP_CMD_LOG, "upp send: start");
: E% T) e' [) J0 v# \$ @0 `$ w- X9 W print_log(server, data, 64);$ q+ T' H3 R4 v6 Y
# X. K, B/ t& t- t" R& { //9 n* {% Z3 n( k/ T+ U
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);" I9 ?0 N" P8 T4 Q, S$ [
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( N- L! b6 ]7 w4 Q( c1 [; q( N
print_log(server, upp_buffer_b, 64);* Y0 X9 E3 c) l' B- J
: F5 e' F4 ]- V v; y* K server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);+ S% N; r& J6 F7 \6 M) Q% X/ n. E
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
! x2 w0 ~( \, c7 P server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
# ]* B& ?6 c. W. f# h7 T* B. n server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
! \0 N& {4 C* ~+ E# I- S1 O: {" }$ m6 r
memset(tmp, 0, sizeof(tmp));9 |3 P; q* u' l9 a
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 o: _5 U3 u) e J4 U sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ z7 m" B% ], M# F$ y* h
server_msg_send(server, APP_CMD_LOG, tmp);- w8 B2 d2 V( i0 l, S l
" r, x6 I8 J+ Q
upp_error_count = 0;2 m. O( j# J* p3 T+ ?. ]
upp_dmaq_int_cut = 0;. Z1 h3 y7 H' ]: ?+ {8 w" M
// fill in data
+ J( }% i0 ]6 t% e. r9 E uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# a; e: u$ ^' j3 P server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");( ~: a8 g2 k: D7 [8 J+ [' _. N
* F9 Y, H4 C2 p1 c: Q9 h6 a
// wait send success
5 q7 c: D4 f9 c7 H) [ while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * N3 k& E$ Q, x
9 I4 x# t" P1 w
// make data node in free list ; [, _2 @/ N/ c6 }$ |. y; R9 c
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 d5 e1 {7 ~) Z
server_msg_send(server, APP_CMD_LOG, "upp send: success");
) _& J7 u3 C% ^* \2 S }
* P- N) ^% o( T' @ _3 \ Q$ N( t5 r return true;
1 p: k% F- @$ W/ I- W2 s3 \}: g% w6 c2 y7 f) v/ r
. u5 Q2 \! d* f6 h' u' o0 N& T0 E$ c8 V; c! `
7 r* k# ]3 a- Z( i, p
4 \4 o( M% p% o( ?$ Z s
5 |! \1 |5 ]$ e! ]9 x" y) c) Z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|