|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 + T8 D- i% L( Q( x, k7 r
3 |( m4 c' ~4 ^问题描述:
' h, @3 B, I% _6 D1 X: `5 n在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. J9 b1 y* _: N5 W) z) c/ a* q
/ K% f4 h4 Q, k' |; x" Z' p图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% x9 m' ]! q; C# a
) ?- f1 ]1 j! G- n测试结果如下:( }5 s4 ]( H2 N) N( K1 `
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) K; I* m+ f5 t4 @4 I
" f; Q! o$ x6 ~) @7 E" }# |: k% y" w! p
备注:
- C6 G$ U' f/ x) ~) F& T9 V1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?/ ?* O' y: i! `
2、相关代码如下:0 ~. q( N$ f( S4 h" _3 }
//UPP DMA缓冲大小512字节
1 k4 B$ M. j- ?' d#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ R+ _( Q8 A P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' P" a+ t$ D1 N, ]1 A#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 \: s2 X) L! W5 s
( p" v; u) B8 P& p% }9 o" e
5 X- h1 Q' E% k# ^/ n$ K//upp接收、发送buffer: `8 q4 ^- l" a7 E! Q4 B
#pragma DATA_ALIGN(upp_buffer_a, 8)
& }3 ^8 G6 M( f8 f#pragma DATA_ALIGN(upp_buffer_b, 8)5 F8 g2 Q. P. f! V- J0 G
. o% i# c" o C5 o) I$ q1 Q9 sunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! P# ^- V- N, z$ Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% H- V9 C7 ]2 p$ |( @7 M
/ ~' G; R0 _" n0 `2 A l
9 ?9 G/ @% Q7 E' |% Xstatic bool server_upp_data_recv(Server *server) ) b6 }8 {+ t& b. C6 p
{% _' ?. n1 e/ y4 U. p
if(server->upp_channel_a_recv == false) {
. s! ?$ }+ e# h/ N server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 v2 N! V/ X6 p R; a if(ListMP_empty(server->upp_recv_list_free) == FALSE) {% C' J" }6 E9 ]* s8 \5 ^0 _: ^
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 {7 [. }1 S- p8 S# I4 J9 P" M# [ z% [* O1 m1 C
- H" K# s7 a# V# V. b
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* o3 U3 m: h b# h1 }
3 w& I- y0 @* M M! P! z
server->upp_channel_a_recv = true;//
* F ?7 R' ?) {% ^) q/ N" n5 P server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
3 n! p' B2 J- O: S server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;. j) ~- x3 X+ U- o1 x8 L+ R* x8 G
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ t3 v! \5 s5 x! _" w4 z% ~) [ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% y! c5 n) p) X/ U* M: @# }$ H5 k( p$ E
upp_error_count = 0;- e4 o5 w4 I5 H4 \( s
upp_dmai_int_cut = 0;' R% H# K. G( k6 I# `
! X6 m8 W! S% J- [
// fill in data 1 i4 U! S2 L/ w0 s' E0 o) C
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 ]1 y8 b, A+ |7 t1 @5 m server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");) P& M" V s# g3 Q/ N
}2 q$ Q* d# @7 J/ {5 G2 I. }8 S8 V
}
- x, d9 h) \1 }$ M1 y else{
p) D7 E3 z, E' }% j! G if (upp_dmai_int_cut > 0){
1 a9 q3 b8 t* D, y# F$ W4 k DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" W5 z. H# h8 n, c+ m5 `, j. u; {- { Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: Q, U- F3 @- I$ B
# R. ^/ f& H1 h% d
* j2 j y. t5 z" C- I- m //copy data to upp_recv_list_busy
5 ?% e; i" U3 {. z5 @3 C memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' w. w1 ]6 c8 l$ W
[, ]& b* ?( y //
9 l; i- P: ]7 U" g& j# e ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);, A2 {5 Y Q2 t- P6 u( [# R
+ }0 m- g- V2 X9 {9 N /// l$ l, Y. X6 R" x- ?, k
server->upp_channel_a_recv = false;//
h) U, O* w$ t( P- a3 y3 s% L1 U$ S' s6 M4 Q7 Z" V8 @
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& M4 l% g; d' g* H }6 G- g& W5 Q2 M1 G+ V, s* _
}
6 a6 G, C3 q2 O& Q' C( B: |. e" {
& ^* ]5 ]1 f( Y% z8 L: T$ @
6 U$ b9 V% R! X3 k- k1 h return true;
7 _: s5 W$ \+ C( p R9 w* O}
- F) u6 e0 ~( x
; P, Z; R8 T5 Lstatic bool server_upp_data_send(Server *server)6 R Y/ b, t, \+ y+ c. f
{* L& g4 u, y; |5 f; Y8 L/ W5 g
if(ListMP_empty(server->upp_send_list_busy) == FALSE){8 l3 P8 w6 E/ Y+ f0 y/ ?
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 t6 y8 O$ j4 ^* k/ J! _; G
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( B8 L9 L9 X# b$ H" F8 m
char tmp[128] ={0};
! {$ B. Z% F6 k! B) b9 r* Y0 Y0 n4 P3 i4 j" i7 E
server_msg_send(server, APP_CMD_LOG, "upp send: start");* @( x3 Y' I( I2 g6 h: S
print_log(server, data, 64);/ a9 X8 d+ Z" p: r4 K
( W0 B# I1 V3 [# N
//! A: ]% t& C- O7 L( V$ X
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& G) t* q2 N2 z, e5 X9 w/ g memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); K, {$ ^/ O/ T4 ~) F( J: p
print_log(server, upp_buffer_b, 64);4 ?2 ~- ~% c; {7 w( d; i" _
j+ l5 L( o& g* V E9 m- f server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
) s( M' _6 C5 ~4 z( E" w! l server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
% Q' j( C+ K3 q server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
3 t6 r, t2 C& `( K7 Z6 g server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/ i. c/ t$ Z& S* w5 [9 ^2 G
8 a6 Z" f4 ^5 E) Z4 I# b8 j0 v7 r
memset(tmp, 0, sizeof(tmp));4 F5 z3 k7 g9 y1 K6 A0 B3 H; M5 ~
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + x/ T0 ~) k) G1 z, E
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 M: W" Z g& B/ l server_msg_send(server, APP_CMD_LOG, tmp);
1 i9 X# H5 A. u0 V3 y @5 |0 u$ l9 _+ O7 U' N
upp_error_count = 0;: \, M; N# l" y$ p/ Y) i
upp_dmaq_int_cut = 0;
1 V2 `: E0 f4 O+ r5 { // fill in data 7 g3 @0 X" H5 u+ T
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * L" v/ P6 M, T9 ]. f7 e* \ j+ z
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ }4 A. M( N. t. ^# |8 i z9 b
# r7 I' N5 C* R- Y( |; w // wait send success
; y2 r# Y7 W& D+ M4 W8 e while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
1 |! R0 s Q9 U$ _, R" p5 m+ S6 \) g2 T/ t9 B3 }: d) U5 e
// make data node in free list
1 c( J% v8 s8 M ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- }1 B0 K( Q3 [9 H o6 }
server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 s; F# i/ x* A" B- d: w }
, \* S1 @1 `7 l$ u( } return true;; d; A. }3 ?7 S5 ~
}9 M; _+ S2 G- S4 O3 l
6 K! [& f9 E, o5 i+ h$ ^ \3 r: R2 \3 v% D8 l5 g! e. u
* r |! [# y# k8 ^- c% \: x
4 g' s4 l) o* M
2 J+ k( Y# d3 d; y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|