|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " m- D2 S" m3 D
) @8 ?5 ?$ Z% Q* {
问题描述:7 D* d# {* d$ F# v% V
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:' Q: |& J7 ~5 F; I/ t0 d
! z3 @2 C, m5 C. p图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ t% z5 o) Y# L
% S4 a F, x6 m k
测试结果如下:
A2 ^" p; b% m$ t6 M$ ]138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- f* \; T$ K+ D5 J+ n
- v/ n& D- v$ C* I* v' f; x# h1 G3 W6 h* ^$ ]1 L
备注:
+ T2 Y8 {( \9 b- E* G, [1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 h8 w& [1 d# P$ t1 d H* z* [
2、相关代码如下:/ A/ T2 R* [* I9 l- q
//UPP DMA缓冲大小512字节& p1 w0 I( [, v( @
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" L0 S1 T6 \3 B" N @) O- c( h6 b
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* V: S" z! r- y
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' B$ A3 x" k7 Y: Y# g
* S5 r, V/ C; W4 G# l7 m. H9 \* n F v
//upp接收、发送buffer/ N6 y: n1 R/ `( h0 w
#pragma DATA_ALIGN(upp_buffer_a, 8)9 D+ a( ~) G3 m* a3 A
#pragma DATA_ALIGN(upp_buffer_b, 8)' e {9 n, R2 Z! U9 ?. T& |0 k
5 J$ P0 i' ^7 B2 I
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! Y) `1 N F' V, t- D: d3 Tunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];0 Q" i$ N i( R" |
0 h# U) p" ~5 b1 |% s1 o2 O
9 M$ q U* L9 i6 K( e
static bool server_upp_data_recv(Server *server) ' x" r; p- g0 r3 g2 @$ m
{ ^1 @ Q6 {/ o9 f
if(server->upp_channel_a_recv == false) {+ J8 ?& V( h p( q0 _5 q: _: C8 W9 J
server_msg_send(server, APP_CMD_LOG, "upp recv: start");4 `& |3 R8 N$ ]7 Y: f# x
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
3 T3 K8 ?$ |) f1 L# ` server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");! d7 f* d9 t3 z% H6 }
9 Z, X% l6 Y5 Z( o) K0 T0 Y( U
4 P; q& g, [. f5 j0 W+ |
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: v8 U! l% s$ n2 n, d! d, k
4 z s4 e% e8 n+ g8 A( l0 h
server->upp_channel_a_recv = true;//
2 h( \' q7 T1 Z5 b3 u server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
; c- n5 a6 c. _! S server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;1 j& p; R- ~) J& U2 d: K
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;& U( e V c# ?. a, q+ k; s1 s
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 U9 J" ]( z/ w
" ~- c2 N! T2 [3 M upp_error_count = 0;
) Q* [ R3 I) |- e! P6 h* g- \9 s, D upp_dmai_int_cut = 0;, J, l- A! g: W2 I# o4 X
# ~8 E- \- s) L$ E) W1 W
// fill in data
: O! n9 Q; M: V/ _) W5 M uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
! L6 E( Z- T, @& A9 c server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
3 L+ [4 J6 V9 |; R }( i. g$ S3 G9 Z
}
' W0 |5 R$ T0 i9 w6 a M else{: E9 Q/ x8 W$ r0 g" z* s l+ T) R* s
if (upp_dmai_int_cut > 0){
1 j5 Q4 w) f, z4 ^! o) ~ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);: z( v- A' P9 B$ o3 u: @
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 Q, c0 ^6 V# C" I8 M
9 g% p2 c! e1 V/ Y% s
; X9 F [9 T: E- |5 Z$ W$ [; y6 r //copy data to upp_recv_list_busy/ v, [7 o( r; \% b/ w5 X9 y$ V
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
v" {$ F/ W+ O* r2 c0 T( s" I/ [) f
5 \' P3 s w. A4 i //0 ^6 s5 E3 J# y1 Y; R
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
6 t \- H! E0 q/ E6 t
4 Z* d5 Z1 V! L! T8 o //
% [% w( v6 Z6 g- ~( k4 E6 |+ A( M server->upp_channel_a_recv = false;//
. t! W- ?, z: A% @) `- h/ }: X8 V) Q4 q c) e h8 N
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
# x6 N6 {& h, I" ?2 G! z } z# F; G6 V7 E( P6 b
}
1 k1 @$ o' @- [- w/ C: f# R1 S8 Y
& n6 n1 b" D+ ] Q Q9 \2 H7 z/ T( f6 y& N
return true;
# j1 D2 h9 M# P" m' n8 x}
/ H' ^" r5 @0 }: b0 ]3 n7 R8 [# Z9 p# K& |/ |! D7 e1 ^+ o
static bool server_upp_data_send(Server *server)% x; \, Q1 r+ Y1 v& r; `- ]
{" W& C0 j2 W! i+ k3 g) r
if(ListMP_empty(server->upp_send_list_busy) == FALSE){% w3 a: z7 G% Q1 P+ s( `
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& @) U9 x' x$ _# x# j0 B4 p L unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# B; X( h9 p* Z6 k
char tmp[128] ={0};
2 x! ^" q* I: E+ X) y* m& o( B" H
. D/ {( B& |$ B0 m# Y. ]- L server_msg_send(server, APP_CMD_LOG, "upp send: start");
' @& ~* V- P* v, X print_log(server, data, 64);
$ |) ~9 t: P2 V" y1 [
4 C4 L' q+ d. l //
, X6 i" g( m( W: n6 ]" F) v memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( i0 L& h' I: u
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
. z2 T3 Z8 M. }' h. x+ t print_log(server, upp_buffer_b, 64);
/ ?& G: s6 C1 | b' Y$ A6 S& i/ P2 [2 ^1 p. J( N* G
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
! A3 d& Y) t4 C' f6 T! ~ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; & l" a6 r3 R9 J" x A' R( G
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;1 k i6 \! d4 ? {4 F1 w' G7 r8 E4 P
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& Y. Y( D1 R) q$ K- l+ a
) T. G" \& y; n0 k memset(tmp, 0, sizeof(tmp));' ~ K( W1 r- E- t' p: E& T
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 o% j; A3 H3 Q* q0 n( {; I
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);. C1 r; A, r3 M' C
server_msg_send(server, APP_CMD_LOG, tmp);
9 b: D+ O8 R, z" @" }1 q; l
! x2 X3 x9 S, v5 ~% N upp_error_count = 0;+ k. E; k. x% p
upp_dmaq_int_cut = 0;) Q5 u, Q( x F. f5 n
// fill in data & P) @. l9 c1 a* U1 F% n
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 9 P' i/ A2 F+ w- i
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% S! y. k. ]5 |) l+ m+ p
* D9 e& `) i' d2 m/ x! f; O // wait send success1 f0 s% T# T& T+ a* {
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 q% T" q$ I( H# X6 ?! `$ ^
6 X- _( k8 a$ `( M" K" g // make data node in free list
' L2 m, w4 P3 S" Z6 H ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
3 P: k8 v! w Q% ` server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 f7 M6 r, h. r! S, ~ }! B6 z/ x3 _: _. P! M2 ^* X: X
return true;" [8 V, Z# p* \2 K! s
} S, b; m6 h& F+ [9 a! w
- K8 d# r" c4 ^. }4 v$ B+ }' s, m. D+ W$ `, \" l) X
: }: w) y* T3 k# t1 S G! K: d* U" i: r8 ~
! Z4 G9 c2 Q+ Y! i3 m, O
1 d) J9 {( p+ A0 o7 F |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|