|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 Z: T- w* X% g0 j. |9 R- B7 J+ s
4 A- v& t$ }, N9 q ^
问题描述:8 P1 N3 [" S: @
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& ^7 T/ b6 Z0 l0 ~
. `& |5 Y: [* L8 R图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 Q5 h$ \5 `& Z0 g9 ]9 H d& W7 w
0 \; [3 z$ m5 {6 k& x4 l测试结果如下: `' W( L- {0 b$ R4 W
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
, ]* |% w8 c1 d
1 Z1 k5 M' z7 E; }# x
6 L4 {& a6 M/ _2 u2 V; H9 L备注:0 b9 E3 P5 q( Q# | R: c$ Z# r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% Z7 ^2 B; Q W9 @
2、相关代码如下:
$ P/ Z* U' D3 t6 _//UPP DMA缓冲大小512字节
) z( ?# l; ~/ X- z* o3 C' v9 \#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- h0 q- W- z3 T0 X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT7 E$ ~) y7 K, v" \" E
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 D9 B6 y; u M' E1 A! Z2 Y
, l7 {5 e2 E- l" Z1 K* x) h
0 x/ d8 E, q# ^) F//upp接收、发送buffer6 ~ [0 ?* e3 \4 } G
#pragma DATA_ALIGN(upp_buffer_a, 8): f. ~! G p% N' }! R5 a
#pragma DATA_ALIGN(upp_buffer_b, 8)
& I( f: j! w) Z% b8 }) g5 s. X& ?' _" m
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! c7 V, y* \; B% x- l+ \6 U" z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
) P4 l9 \& ?; c ? p! y5 } r+ n+ ?2 @
1 D# A0 Z$ N7 y0 h% E' xstatic bool server_upp_data_recv(Server *server) : X. l0 C: f. p, ?& ~* {
{( x' d- F& f# `: W# g
if(server->upp_channel_a_recv == false) {# I' h9 t5 E% U/ i
server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 Y1 B K6 |6 X5 n
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ q8 q" s: `3 m5 `4 J& D
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
9 |* K3 B2 R% i/ w) r' c# A/ }1 t+ b+ E9 p' t
, ~) H4 \7 A* V memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
0 f7 G4 f# ]4 c7 ?" q [
% o9 `- b5 d$ Q$ v3 k server->upp_channel_a_recv = true;//
. e, c2 t3 z* V- l& }& j k server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);* e' k2 y; ]7 W3 M5 b& [6 b0 W% _
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
: o; R2 {, d& ~( K# S: n9 i6 t server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;! {& F: p' c4 ~" B' |0 G
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 q* P* {/ t1 C# ~ I3 |7 n2 ~2 d7 L
upp_error_count = 0;
9 Q& o& v% t9 G% z0 h2 [1 h3 r upp_dmai_int_cut = 0;9 q1 v& q9 h% \% p7 v- F" _
' R3 G. E C7 s. W5 Q. ?7 o // fill in data + R" S" _: }* L" t; |: K9 K% m4 ]
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); v0 |; e6 S0 F" |0 r2 s, e" T
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* A5 i( Q5 |6 m: I0 ~$ Q% @
}
* E) s3 P# `9 k# e }
3 C% Z) |( V2 m9 e$ f( h0 X4 ?1 ~5 h else{, ]6 K8 m6 l/ l" L) X
if (upp_dmai_int_cut > 0){ {* h, m% w/ i/ F
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
* X: P; \8 ?& C( ~ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);* q( ~. D: H" |( B6 O
1 W9 {- M6 Z# J- X+ X
% Q& i3 W, ?3 w' J# O) ~& Z$ k //copy data to upp_recv_list_busy
: G, b6 t& K+ n" { memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
5 n- Q9 P# j5 L% x+ ?1 T. Y
) z' E0 r$ w4 C& c //
: n. E [$ u H+ R# ]+ a ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
( j1 q( p" X) i5 K9 E/ x! y, i6 D$ q W/ \ C5 r
//8 `. u% C- C& w; p2 ]3 m, U
server->upp_channel_a_recv = false;//
) d8 l! k8 V8 L' q+ U4 j
+ r2 f) E! Z: l' [ W* y7 ~& G server_msg_send(server, APP_CMD_LOG, "upp recv: success");
X: u5 }1 y* ]; k' z } c: @* a- U( r$ H
}9 I* H7 _) t- k, t% k
+ Y' h3 y4 Y) f* a) p7 D( ?" f' j2 [! z; W+ G2 p1 a v% E9 S0 Z! M; M
return true;
/ ~( I1 Z) J8 V! r, h0 a}" T5 c5 n' A* d* h1 _
& m) y0 E. }+ o e# J3 Istatic bool server_upp_data_send(Server *server)
4 q2 E( p1 H! a( T0 D: T{
9 A* R3 u; E- h7 X if(ListMP_empty(server->upp_send_list_busy) == FALSE){
8 A3 H: X+ e- l/ V3 `0 } DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);$ I# e$ M( w* t: D, p* J; I
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) f) r1 H! G0 U7 v& B
char tmp[128] ={0};/ o* Y8 L4 d# O ^: |( o$ Q
7 z4 j7 H* x, Y2 @& a; Z server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 v+ S) C* V [% n# E S print_log(server, data, 64);
8 Z! `4 {' z1 q# H( g$ t; _" Z' {$ }+ }+ P" S& l( l
//
# w( \# @- {" n$ ^ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);/ [. J0 B+ q- m
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);# m2 \- u6 g4 E8 I: N
print_log(server, upp_buffer_b, 64);2 |' I7 ^. E) ?
# F! K7 g% ^% \; i+ B- H5 _
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
& Q% h3 t/ L/ _; ~& C; l. z6 H- q Z server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
9 ]5 J n! R0 P# X7 o+ n server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;" k% z- N. d |+ [: }8 W/ o* s5 ~7 z
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
( z# x( A0 Z9 L6 s4 z0 w
5 u$ R- L9 ~8 E0 P$ Q. f memset(tmp, 0, sizeof(tmp));; |) j4 t! v' A1 K: Q0 X) V
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 L8 |( Y7 ]# K9 N0 m% i
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 ]+ ^8 A, {. p0 p1 b7 k3 ^8 Z8 p
server_msg_send(server, APP_CMD_LOG, tmp);* b _6 h8 ?/ t" [
; D+ W# k& W! Q upp_error_count = 0;: d3 Y1 {" X9 Q; U! W; S1 ]. M
upp_dmaq_int_cut = 0;
2 \( D) r) V d! a. F8 {" X // fill in data % W7 S9 p6 a. b- K( |% c
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
- n2 L) ?" k: \. B server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- w- t$ c# u% @8 Y+ m' G- H
7 Q4 p, o9 x, S5 o- m
// wait send success
' ]/ u" q& a. W while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
# A$ W# L" [9 @
. {5 @4 O* y, Q, I9 ]1 ?- J8 z0 @ // make data node in free list g" Z/ @% ~2 W! n+ N
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);0 |& B# E9 @+ ~* C: ^! i4 N
server_msg_send(server, APP_CMD_LOG, "upp send: success");
* x# ?9 [; z9 P( e w }
) V" {- S) ?; P9 P: K5 { return true;
5 r( O$ b# ~6 ~; J}4 l* d3 A, ]1 t0 q% w
; C6 A3 P2 [5 j% u/ g, L
% N# b. T1 q) \- P' z U+ h* G
6 p0 z1 n6 E/ h6 b( y7 R! H
% g, p( _& n# ^5 S7 i( S, X. c- M/ _$ l" W6 |+ Y2 a8 A) g4 m) u
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|