|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / j4 J/ u- F( y* S: I7 P8 y
; ^2 q8 J" {# ^: n) b7 X9 T! n问题描述:* B% l3 J0 f4 w% [1 l, ^9 g
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( E" O1 v& w; U4 r
$ n5 `3 H! J4 E+ H9 l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。# \* P4 |$ K7 A n e! p7 e. r/ s
) R! f* y" C" k- T3 u! p0 x
测试结果如下:
" O) {/ Y& M# I8 @138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?" X5 m4 _# m& M2 v
) z6 O" P. r5 c! J
% \1 f# p; M; U' ^' z+ C
备注:
' _2 K, I. D2 J, g) l7 k1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. J5 t/ J7 @0 C- M' J* T
2、相关代码如下:
' h6 j9 e1 U9 [- |$ w. f1 F% k//UPP DMA缓冲大小512字节
0 ^) J+ I" M$ t+ A- ]7 G#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
5 ~0 }1 w! A& w3 y9 E! k, C% b#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT- B* u; V- G& }/ z, \) [) U* A
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 |- D. a" `( `. e! T
s/ y; q8 h7 Z* j9 i1 T
( Z! {) u4 H" K; d0 P2 O" ~" y& O//upp接收、发送buffer& a. O* O/ `4 B7 }9 {
#pragma DATA_ALIGN(upp_buffer_a, 8)
" X4 z5 P; u8 `! w6 ^0 K#pragma DATA_ALIGN(upp_buffer_b, 8)
1 j% E. j0 b4 _& Q k
V3 M( A' Q4 J z/ I# {1 }unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ U8 Q) e( v- S6 k! J% H( W0 {* Aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 k& q" S5 [9 k T+ v9 V
# z: s$ C# ~. {& f# O
1 b( c! S% I( e% fstatic bool server_upp_data_recv(Server *server)
+ D5 F: a# [, |9 s8 J; k{
; E7 T: {5 s9 T/ ~) k" L) H9 X if(server->upp_channel_a_recv == false) {$ y) [# w5 q2 u' a" I4 l
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
$ H. t9 j; ?7 H, S if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
; ~- c" _) `2 I3 f* p" p; _ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 U5 F n2 ?6 c1 U" V; d
8 f @( [' m* S0 x& c y
; P* r+ U# N# R0 D memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
; h( b: W' x+ o; n) L4 y4 B! }* ]
/ U8 X% p1 C% F4 e* h server->upp_channel_a_recv = true;//# Y2 k3 g4 J+ _! f; n" o
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);& X1 q0 K% g! V' E9 W6 G
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;0 y ]5 ~. m$ L/ v1 n
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;: Q4 {. `: z; I) N d7 v+ T# t+ G
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
9 o! p) Y3 M1 }! u+ m* F) ]8 ?7 D
& s4 o; [$ [ g5 G# M upp_error_count = 0;6 I" F6 w0 k5 T* F! L& Z" Z+ z+ B0 ]
upp_dmai_int_cut = 0;, L3 S) u! h$ [2 s
* R; t V k, K6 C6 p) k
// fill in data 5 o+ L4 a' @+ x7 B: f$ e
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. M4 x& O7 M# J$ |- n
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ I3 @! K4 _' g }
* I T% n1 }, A$ Q }( A7 R# |/ s6 |( M7 U. t6 T
else{8 w. q7 t1 K7 x: L6 |
if (upp_dmai_int_cut > 0){" X- T d3 P; r
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 ~9 U4 u& c; \7 x! g/ L( u8 i) Y Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
- @. {8 c6 X I" R: |& P. R# e" U3 i: X/ p. ?
( R6 V( u( _: x! \
//copy data to upp_recv_list_busy3 R% }* l. D$ Y+ \
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" r2 G3 D3 p* r; _
! G% {0 s, v$ b# B8 X3 a
//
$ X. p2 h/ `3 R/ m3 _ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 H" ^$ _/ o9 B! W- ~: b
) w/ Z* O' {0 w1 d S- ` //6 V5 u. I+ L# n6 v' l, D
server->upp_channel_a_recv = false;//- t# q: ~1 K' [
5 B% l' w2 r3 D. A8 D4 J server_msg_send(server, APP_CMD_LOG, "upp recv: success");4 {, q" R4 Z. b) r
}# D# D+ w6 Z: ^( ~ e
}
% j% F5 |7 ^' i3 o' m2 [) i6 s2 V V) e3 b# j4 z0 a3 n
$ I" Y( C) t* h" f
return true;
0 H) M$ j" P3 K1 q}
# h3 ]3 C9 R' F/ w6 w% T
" R, R& }- J) @static bool server_upp_data_send(Server *server)" D9 h3 U: V! ]# [
{
1 `# ], V4 M- Z6 { if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ @/ o6 u6 e1 @( t; o. { DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);$ q* I9 |% j8 b9 R
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 E0 H5 O r+ o8 n2 d
char tmp[128] ={0};6 S8 R* j4 O/ U1 \& s$ x0 a3 Y
( q: U9 N8 w5 x E, c! \$ F server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 d2 [& b+ j ]1 B; e( n print_log(server, data, 64);( ]9 M$ b7 ]9 J) A! y; {( ^
E7 \2 T8 R: r6 m' b) h //, [8 B( b. |+ N+ e5 m1 o
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);% _, \' z3 `5 t* `- u5 X
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);8 `5 d2 I! {4 C8 u3 S
print_log(server, upp_buffer_b, 64);5 X( [: j" j% T# [
: B1 Q: ]% [9 t0 q8 E% n
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);) O4 R1 Y9 j3 z; {! ?1 G
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
7 d+ M1 S1 L, R5 @- m) @% U3 { server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
; M$ k9 u- A3 K$ l server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
$ @+ F+ k) _1 R& s: `1 f; X3 \
2 s/ T% y( g' a" M memset(tmp, 0, sizeof(tmp));% x. d/ t1 a* t8 [5 S( q" R' m
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
* {% K( H/ B3 _ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 m' a: [% w7 V
server_msg_send(server, APP_CMD_LOG, tmp);
6 d+ t, J- J4 z
' Y- A, O* r& G& F, p' ~ upp_error_count = 0;
1 V" T9 C- t( s6 \7 e upp_dmaq_int_cut = 0;7 w( _* F+ W5 l1 a7 K4 \7 d
// fill in data ' D* \( q" [/ b) N
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 4 a2 F7 f, U( W* q
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. T/ D1 R! G3 W4 S0 y& K6 C! M2 ~
& O6 n. T1 L3 f8 Z6 Q
// wait send success
4 _ g2 T$ Q0 }$ P8 |3 w while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
- B4 B0 s8 W9 k9 }* f7 V2 o, K9 e! J8 A4 {5 j# d0 {: X: u% z
// make data node in free list
/ y3 s, j( B$ }! `/ `- r# j; J _) U ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: `& j$ g8 n6 E4 n server_msg_send(server, APP_CMD_LOG, "upp send: success");
& W0 J7 y+ R$ O9 {- X( l }
2 s/ m H+ a0 H2 H4 T$ X return true;3 }2 s I# d! \; S5 g
}
" O0 V9 _9 s3 C1 M9 p) F6 M$ O# a$ K* u. T! Z3 y4 w( s6 x8 Y% u$ Y
2 O2 _. l7 y0 L# A) I5 U: L% z6 q, ^8 i1 n
+ |0 ]- p+ ~% U# ^2 b; o
! r0 c, q4 a0 L5 E |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|