|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 $ E7 N7 R0 @5 g i; k6 C) i! ]
5 {, ]! }" W$ A1 c/ k9 a! y
问题描述:
7 n1 p( n9 q" T在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 }: `4 |9 n0 [
3 K6 q( O1 U; \7 ` b- x7 V% H: O图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 }8 F3 C1 X: p' b: g( U
1 G2 V1 u* V" l. A3 j0 o
测试结果如下:0 z& S6 I3 M5 w5 w' a
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?8 x- Y8 A* X0 d) D" {3 M- [
3 v. t7 T+ } A5 H# K( u
" }5 J: F: J {3 ` N6 P( o& Q备注:* P+ Y8 b: O2 ?
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) ]8 d1 f5 p' D# h) B
2、相关代码如下:
8 z4 @& C7 W W) y/ X: k//UPP DMA缓冲大小512字节8 X( P, ]$ ~( g( v* A6 ^! ]% _3 R* G
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 f0 n# Z% u7 P: ^4 ^+ X5 N- p#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
+ c5 ~5 W& m; l" @5 n#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" o0 T0 t% v g
. a+ ~# G. }- B( p! M; b2 z( N6 @/ f& D9 ?9 e7 ^0 @
//upp接收、发送buffer* t. |$ h" l l/ u
#pragma DATA_ALIGN(upp_buffer_a, 8)
, V2 Z( Q0 N% f$ X* Q2 d#pragma DATA_ALIGN(upp_buffer_b, 8)/ T, k- c" V+ V9 L
6 o+ f# f1 R, I& o/ _, X
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 {# u ~* H; ~- C x; n) x+ E5 y
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ m6 z# f4 y4 p' J/ V( [
3 w: T l! O7 W7 c, j3 p7 e$ y
$ c+ F5 t0 b K( Z+ v$ [2 K# Istatic bool server_upp_data_recv(Server *server) 9 x3 y; p# Q; S% p
{
3 M2 [% U& ]2 b# ]% S! S7 b% ^0 l5 e if(server->upp_channel_a_recv == false) {
( ^5 V/ Q, S" ~8 x4 `) {0 j- ^ server_msg_send(server, APP_CMD_LOG, "upp recv: start");" W1 W- w4 X9 D2 e% k, ?6 f, V
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: `3 w7 a9 Q! T4 M
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
0 g" j- A# _; X2 f2 n7 D% d( d# G8 e% z
4 \8 k9 W, Y+ A w5 r# ~' V memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
0 H9 K2 P5 D B8 o* y% y; X, K5 E( M- X& n1 ~
server->upp_channel_a_recv = true;//7 S2 Y3 F& L. R' V) P3 x: ?# _1 D
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
) O, |) P" a1 a. y/ o C server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
* z% N; e# E, |% U7 ]) A L [ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
4 S2 u' x7 }, f5 L/ A' b$ R server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 ], w+ p) J! x6 z/ L+ P0 q0 v* P0 l! Z8 e0 M. I
upp_error_count = 0;2 i5 L z1 g- X3 }# W% r# O- s
upp_dmai_int_cut = 0;
; h1 F* o7 f3 `4 j5 N* t+ T7 z# s5 T* d
// fill in data
* a& e- i- c9 j- y6 M uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);/ X" Z9 D! a& p; K+ k2 V8 c
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 g6 {+ S7 r; }: B }! B9 `: _$ ^/ ?0 R0 S" U/ ^5 D
}; ~" V+ R7 X6 ]$ R
else{$ _! ?0 T* [0 X
if (upp_dmai_int_cut > 0){6 `0 q! K- d, ]5 ^3 U# h7 @
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% I7 j7 T+ ~. g Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% I( \; _4 `5 M2 F
; s, G( _3 l1 x% F5 V
/ k, x) m: |) E8 y% m+ k //copy data to upp_recv_list_busy! m0 _0 y5 k. y$ m( F; i
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. ^, C) Y2 x ^' h. @, g
5 l4 k8 m) z$ u
//
! q& r# [$ Z; N6 [' G ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 ]" e! a* q x/ ~1 X9 ~1 R O, ]( X" p! U( w) M
//
6 C1 T, G6 |4 Y5 z server->upp_channel_a_recv = false;//
- Q0 Y) d6 x; D. v1 l' n& u
3 s' K0 u$ Q( f8 P3 m# u server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: A) C: Y8 ], S5 Y1 b5 f }
2 R: Z v! Q2 D }
, k2 V3 {1 D L
2 C+ ]0 X3 e3 q2 J* O7 g1 j: A$ L; x0 m3 b1 y! O/ G5 \; g
return true;
C: S& m5 B4 x& B6 a}+ {: C# ^2 T* |* O, H: D
8 s/ ~8 ]) g M+ M
static bool server_upp_data_send(Server *server)7 t& t& a( C. _4 m; b: x
{- Q/ Q; ]1 D) G+ }# ^) [+ G, l1 A
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
3 F, M* g- o/ i/ q& I( ?% Z DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
: m0 V ~# U3 L* [. m: R unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 m) d) T) ^3 {6 P/ o8 z
char tmp[128] ={0};% x" g3 W+ e, h& }# g3 S2 U$ F
5 o. w3 V. l4 G% l+ W2 P server_msg_send(server, APP_CMD_LOG, "upp send: start");
/ u3 k- G6 O$ N' p. C4 ~ print_log(server, data, 64);. l; c) V5 K( H1 o* Q& }; N# M7 C
4 R- e+ p( p) C
//
R, H; `& m5 N memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- d" [! L, V& Z: T) H
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 z: Z, J2 ~6 t- |1 ?
print_log(server, upp_buffer_b, 64);) g8 H2 M, ~' y) O( u2 r+ ], P9 }
; P: N& r) P, q; U# \; v server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
% h* ]: l# k7 ^ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
6 _+ Y' e% Z; d4 S& Q server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
0 E: T T7 O$ ]) Z- c0 h server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 V8 j$ k5 K$ n6 }3 C: |
8 V1 |) [" Q( c6 ?
memset(tmp, 0, sizeof(tmp));
# a% q& }" N* j3 @3 L4 X$ Q0 D( n sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 3 W# y; ]# B+ C7 } e0 k
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ Z2 H2 n; k5 D! A7 [8 K" H server_msg_send(server, APP_CMD_LOG, tmp);
! h1 [2 S* {( C8 i1 c, o" u" C" R" Q; i* M5 {
upp_error_count = 0;
+ @4 `9 q' ^- a3 Z+ t upp_dmaq_int_cut = 0;
! o! j# I6 f$ t) u0 W4 A // fill in data
" |0 q) I* ^, w uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 5 t2 l: A: V" i# }6 o0 h% Q
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq"); w" u: T/ ]7 a, K5 A
* E4 _) \' T# g |8 m
// wait send success
; Q" A4 Y6 w3 u! C( @6 B while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' o( d4 ~/ u2 e' B
, _: Q; d5 p7 b. P- Z2 s2 j4 L! g // make data node in free list
$ m( A1 P) W( ?' ^+ V: U. x+ e/ }/ h ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
& O6 o( L9 O8 s2 f, \ server_msg_send(server, APP_CMD_LOG, "upp send: success");
- d! E1 u# k1 A4 {+ N }- a5 ~3 s3 c9 D- q: `" g! }
return true;8 n+ s2 \, ~( N. B$ \# A8 O
}
9 {4 r6 o" d5 N- @; M0 q& b3 U$ t4 N
; o; e7 ^% Y8 a, V. [: S1 j
' b4 J) _/ S. x4 ~3 O; ^5 C5 H6 c" o+ Z: o$ `
2 N! i9 g6 {& w7 A |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|