|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ! R. f. E9 r- L. j
- c9 k0 e$ a1 ?+ w
问题描述:
- G1 ?, B: I a: T在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; M) C; D6 S0 Q1 C
& u5 A+ w5 P* H4 ?( d- l A: n图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
- n. ~! S( r" O9 R) A4 l9 a1 j2 e0 B9 j: S% Z% j+ R6 ^3 i3 q
测试结果如下:* W. g4 D9 x q6 q4 R. S% o
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 c7 b% Y' e! Y7 c/ f
+ A* E+ Z9 D$ o4 h3 I2 x+ e1 \$ |4 p: ?5 t4 I( m \
备注:
! i% u0 v: O( a2 V- G1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?; s( a. ]( I/ B2 X H5 C( k
2、相关代码如下:) f! u) U. `* }- g1 ?% O
//UPP DMA缓冲大小512字节
2 w8 F6 a7 K5 J& b1 \- o#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 _. P1 Y2 r3 P% e#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
: l3 t! Q& V+ K* u#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ E4 W! l5 i7 z, C) \) K
" g) l6 ^! ]$ C5 T% x$ I/ L# j3 _
//upp接收、发送buffer
% M# ]) t/ R8 N# P& M8 r/ x' r, \#pragma DATA_ALIGN(upp_buffer_a, 8), M3 r; a" T: U0 m
#pragma DATA_ALIGN(upp_buffer_b, 8)6 R- k. F6 {: y0 B
& o) E- @0 O) O. Tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
7 b2 l: D3 {7 |1 ?# Vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
2 D; J+ X/ k) Z0 G2 l1 l* q, S+ e9 g7 t* w; E( |, e
K2 v u8 a9 N. o
static bool server_upp_data_recv(Server *server) ( |% R0 _2 J8 y5 Q1 i
{
* I1 I9 F+ s6 g) r* j! ] if(server->upp_channel_a_recv == false) {' E4 W& F" E) E8 X
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 i! z- o1 ]0 ~6 h if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
: Q$ O, J) D7 R; `- J server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");8 [- T+ W% e5 q1 ^
5 O+ N! M" W9 O
" f$ E5 g/ c2 l; z7 `
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
4 k0 O! e! x$ o+ i' ~
8 D& {$ _, w( C& R0 B; w server->upp_channel_a_recv = true;//
8 R6 z1 d1 P+ s6 M4 q Z- ^ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( Y ?: p/ I2 l# }2 T# R
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;5 P) c3 {( u* t: Y1 T3 P
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;# J7 d7 V; S1 P
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ i, h W5 y; v5 \5 @
) V) r8 n% Y. r; B( [" t; A; k+ _4 ^
upp_error_count = 0;" x6 ] X8 v2 {6 t
upp_dmai_int_cut = 0;& H4 t% W. G t X3 U
/ Z' e4 d( w9 v9 U+ t // fill in data
, V p5 _' A$ P7 b uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
: Y0 ^" r Q7 m, F server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");1 A& q) \+ x; L4 ^3 b; @6 _: c
}
4 D" `0 K+ f3 L5 v' ] }
$ t: [6 M8 F$ I y5 ]3 u' F# @& a8 F. P else{' D7 T& x' |: J, S
if (upp_dmai_int_cut > 0){7 p9 s% n7 y& i4 V! U5 K
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
: ~/ b+ P6 ^: z) b, Z, j7 @ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);: c* r; G7 p8 e" _; `
7 l: l& ?9 ~) X3 Y% G- n [/ c& d! a6 D8 W4 z0 |9 R4 Z8 U
//copy data to upp_recv_list_busy3 q) u1 H% z& C# e3 s* [* z
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
9 c! ?0 B6 ^+ x: @
# J' x/ U+ H0 r2 N" [( b9 o4 ` //- Z/ a4 Z) i+ v& C9 w) |
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 x' k5 h$ y$ d/ D
1 U, t8 _% x% f5 o# J, l* w
//
( f/ h1 G+ F8 u% v server->upp_channel_a_recv = false;/// A& _( I5 h3 Q t' g, C! q# C
0 c# f8 m! n3 a( F+ S
server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ D5 ?) n5 D' _( d. u, I o# o
}" \0 l/ |% c. m1 v$ i: Z: b
} ^. C/ y& z; _
& h+ q2 v5 {! r0 O+ i* h$ i/ ~
6 l9 u, @0 R4 b return true;% R' _, j5 E4 l, A1 ~( l7 P R4 Z
}+ Z% E8 [0 q$ B
9 L$ I0 j8 z3 P0 R2 I
static bool server_upp_data_send(Server *server)) p) e, D) ^. w2 v& e0 F% ^ `
{
1 _/ X. W- k& B/ ^8 H if(ListMP_empty(server->upp_send_list_busy) == FALSE){& j. H b2 d0 g
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; ~2 C7 ^/ b0 S7 l1 a unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* E* R* A* [4 x3 n char tmp[128] ={0};' W, o8 t( ]; t0 M
# M# A- D6 h$ i+ ] server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 b9 O$ D6 o5 z print_log(server, data, 64);1 `/ G2 K, f9 J: B! p8 W
: D0 p. b6 |+ b9 ?6 F //2 `! l- j; k g
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% q$ C( ?4 Y% \% z memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( x0 e( D' q4 `
print_log(server, upp_buffer_b, 64);6 M2 w. x4 R$ R4 H4 l
7 @; @; \/ c5 f! d; E server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);$ O, R7 F0 u: t$ C/ V- g3 w
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 1 k8 \9 m7 D, E5 Q' r1 i2 l
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
, v4 F9 d9 j. Y' a R3 o server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; h) Y: Q# F9 w7 k! J# ~; v
8 X* b& f' ?' l5 n- }+ l1 G& `
memset(tmp, 0, sizeof(tmp));
+ h+ i! K4 b4 F# t4 [- @ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; D: J3 |9 ]7 [6 G9 ^8 T
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
0 @5 s( X" U& Z+ j server_msg_send(server, APP_CMD_LOG, tmp);
& B+ D/ n# ]3 O2 H5 |( X/ _3 Z& E
/ H3 s& ~1 ?7 _, p upp_error_count = 0;& [. t! {0 W" O% X2 N; b
upp_dmaq_int_cut = 0;
1 ~% k+ k. T0 [3 [% Z // fill in data * Z# Z1 S: `. o& _9 {
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 K# H$ o0 Q* P( ~: M2 V3 |* M server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 r3 M! w( H3 w! X7 G5 {
6 D) _( w6 s) D+ Y9 [- F
// wait send success1 l& H# q6 O2 f8 b3 n
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - X1 }8 _+ p) t' J9 Z
* h: J( Y8 ^5 O) N2 S5 l; ^7 J // make data node in free list / L( @- c$ a( w4 y% u2 ]
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 `& x+ u. \& N8 o' D
server_msg_send(server, APP_CMD_LOG, "upp send: success");
c' n9 S! S9 B8 z0 C! V }
]0 O9 h. B8 n4 v return true;2 I9 J2 B v. D7 J* u4 I
}- W0 y& k5 ^3 A9 t, U
8 z5 K* Y) c# ?! W7 Y% @+ I
% ?3 ?/ m1 {0 x0 g+ X V* s( J. S0 x* L* h2 |) m+ t$ {
0 S" l; F. a4 @* H
6 r0 t3 E- P. i
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|