|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : b H( P( m7 |% W; F7 m
$ c+ W$ ~. P" E: t f, P$ j% e6 H
问题描述:0 d* K/ ?. x. _6 \* X9 k8 c0 u m
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
& Y& Y# j& i( d8 h) [% G7 E# n6 H8 l
. r* |% A" P9 d2 `+ J7 G图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
; _% ~. E8 b; ~- A' h% @8 T+ f/ M2 L0 S* b0 p
测试结果如下:2 Z6 H4 m+ i# l/ t; \4 |0 p
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# k7 @0 n% E& t7 L d3 ]/ N; o f/ n) I# I
0 y6 R) y! W* N* }& n9 m P$ z2 `8 ?) B备注:
. q. A# y9 \- x! J+ j1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 B, b' B; H8 G% M. x2、相关代码如下:3 U/ d8 p4 X& V$ U
//UPP DMA缓冲大小512字节9 }8 x. d5 e a2 I; o: D
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; S- j% x5 R& k6 X3 R/ d4 f6 d3 D( B
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT& ]6 @1 e0 k. g
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT): D9 O! Z) A7 f! L) ?4 V' V4 m4 M
; `4 j9 e' A) h: T/ ~/ C6 l$ G+ g3 J- E1 S* |' y( g
//upp接收、发送buffer
* H6 [8 r0 ~- M' C% {#pragma DATA_ALIGN(upp_buffer_a, 8) ?: E) Q0 `$ d0 o- o
#pragma DATA_ALIGN(upp_buffer_b, 8)
! n( @# `6 H N( m8 U
7 e1 e! m0 x- M* {8 L( junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% F+ b# s1 f/ x dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& D! y, b; l3 u5 A* k" w# e
1 C7 p* O6 {4 j$ |- @8 D- [6 _- D9 j
/ C3 Q8 ^& `* {5 pstatic bool server_upp_data_recv(Server *server) # }; c1 H, f, Q+ o' d9 C
{
- F4 B1 M% |' | if(server->upp_channel_a_recv == false) {
O5 r% i4 L" I% k8 v0 I( H! V( \ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' ]" i0 C; ]* R! {: K' [ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {* h0 {; F- t9 `. D ?: x. [
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 [ H- g! [8 T! z! Q( `+ |* \
( d b9 H1 ?; {- l! x p2 n
9 f1 J* X9 _/ h! d) v: i& }
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); e! a* V. n* s# p$ U+ Q, e. ?% k6 B
) c8 i6 ?5 U2 x# V" l& S1 l server->upp_channel_a_recv = true;//
4 t# W" _. B+ ^% ? j# ? server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
: V( J$ C" U) j5 ]* m server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
1 Z3 o: |* {# H$ `& y1 _- U8 ^! A server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;2 E: f% Y! U6 F& _) a C
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ @; K( | W, @- @) W, J2 u6 \" t- y
, X' z: J2 ]9 s; D5 ? upp_error_count = 0;# C& w: P1 U5 e, T" X; E
upp_dmai_int_cut = 0;' N6 D2 K$ y4 o1 V5 x+ D
. Y7 B6 X7 \! ~6 ^, _ u, H' h // fill in data . z" P9 O2 r% h/ h. V
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# t ]- _- ], v* M1 s6 M
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: w( {& H+ z: p) m( G& {- J
}
6 D+ D. X' w) O0 Z. Y0 h% B }! D1 k1 \3 y1 ^$ U7 J
else{, N' }9 V" {9 B
if (upp_dmai_int_cut > 0){
/ Q* y, }/ P6 U6 v9 M1 @. S DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);/ E9 Z" d. R0 q$ T( q. L# K
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 m3 ], n l; m. a5 H
( j& B. C9 W6 q% c" p) `' e* f! c% L, |! Y) X- H( i
//copy data to upp_recv_list_busy8 M7 t4 b- ]/ i: D
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
B/ C) W9 o( F4 a6 i/ i: |! [$ T1 V! e0 o" ^; F; I
//
9 }1 H$ o/ P* E0 o N1 ?! W5 ~9 Y2 [ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ B# ?2 T/ s& s7 x' H5 s' Y
$ d0 |( k: ~6 w
//
) P! k6 K7 k1 C8 s1 L4 B: `& Q server->upp_channel_a_recv = false;//
1 v/ v d5 g. n9 Q7 C7 |+ }
4 c; c$ L1 l1 \% b2 K: h server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 a4 i4 T3 l* i! `% {
}5 J5 r! b: f$ C0 T4 |& g
}
8 d- s" v/ P' z& |% {* w
5 ~ @; `3 j3 L8 C7 M' T2 Q' m2 Y
1 ~8 r- V ~& y, O8 q5 N! { return true;
* w) J5 y2 m' u/ L0 O' ]" G# |- I4 a}
1 D% t$ X) w$ L* Q" n n4 U1 R+ E! x! r
static bool server_upp_data_send(Server *server)8 d# q' H8 b, j# I
{
) ?0 X1 y4 k# S$ Z% _- X4 {. j if(ListMP_empty(server->upp_send_list_busy) == FALSE){3 K+ z9 X% p4 ?" @/ ^
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 r* ]/ O# V) c' c# ?
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! b) M* \ j. F+ ]3 R( D char tmp[128] ={0};
4 l6 G/ m# G$ Y9 d, k8 C6 g/ A# c) o
server_msg_send(server, APP_CMD_LOG, "upp send: start");$ U: J( v2 C0 P4 I4 J* i& R$ Z! ^
print_log(server, data, 64);
! a; Y: l4 L# u$ [0 L- d2 E L* v( [9 ]1 U4 _
//' h/ Y7 G2 `9 I9 ?+ K7 ~, }, g
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 o, B$ W) L! Y memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);' r! u. p4 L8 ~( O& S+ p+ V
print_log(server, upp_buffer_b, 64);
! u3 J+ N% G% r! `) x8 w/ P: b" Y3 L! B3 e
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);: O/ K. N2 |8 m' b( D
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ' P. q7 Q: B. A I8 o/ V
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT; |$ _( `6 J! {, y
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# ~5 m$ P4 F7 p
: U: E& M# d N# {: X6 T memset(tmp, 0, sizeof(tmp));
* k0 f% d) I, I0 @7 I( p sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", , A& G) R! x( `1 ~3 |
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);& T7 g6 O/ n% T+ J& ~. r C& p7 z, Y
server_msg_send(server, APP_CMD_LOG, tmp);
3 \! T6 J2 _: C- ~2 G) ^; |+ ?
; Y$ W4 P5 t6 A1 n, ^, P. y m upp_error_count = 0;2 y$ n7 D. h' V0 J- g' ~2 ]
upp_dmaq_int_cut = 0;7 r1 a6 B7 W: U7 B# L5 t
// fill in data M4 L: N( E& o% `% g
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
$ M/ H, ?: F) U& P server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
- ?$ Z7 L9 X. \! m/ s1 P/ @4 B3 w' x E6 p1 N) |
// wait send success
: v; O! S/ I9 M( R( H while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& U' p; L6 [+ J/ S4 ^& U$ b" e" \; S8 `& |1 w" L2 J
// make data node in free list # s6 ^ G7 A! w
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. F# K/ t& p8 v& @" ?# ^% ~ server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 S+ H$ r! G' a* I; ^! m }4 h5 I5 g8 A, T4 q
return true;
% P! _. ?7 Z- r# U r5 _1 @}$ @- D V: x- T& l2 O$ \* z2 o# W1 i5 U7 S$ l
, i/ X) p: x: I
) ?3 R$ v9 }7 y( R3 O* m# Z& F5 p/ V/ B2 L
2 [' z9 D8 \ M* k" _7 [/ I" \( H
- q' V/ U: t* I: s8 R |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|