|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 G/ W) C" }: _7 e
; f6 F9 T6 t4 l/ e
问题描述:- n; L7 _8 I$ @: V7 m) g5 E
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:' H7 Y/ S$ T) r! ^( \: v6 l
8 k, U& O T: ]9 I' H- R6 k
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。% f1 M0 o1 r k# d
2 i0 y3 e T0 V( B( m测试结果如下:
2 Z$ ]. H) ^" p- v' r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- ^ i9 j& z. U' N/ }" ]
6 Q) U2 }. S/ `! ~3 z$ Q( ]( P( |) u2 k9 d9 D
备注:
: t# @( t- D' L# E8 ^* u2 b1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 v4 {, T9 g3 {6 [% e
2、相关代码如下:
" k& f" @* z' z& W2 L//UPP DMA缓冲大小512字节
6 B0 o" S0 G) z- Z' Y#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ K" r- m. @$ F5 A* t& B6 Y/ B" {#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# K4 s% I( D' c# c8 E#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 G# Z3 |8 M6 g6 V
/ u G4 e3 Q$ n) B! t/ O z' Q" I
: l& j, P, N3 ?2 a0 B//upp接收、发送buffer# u9 [/ K J* N/ G3 o3 V; v
#pragma DATA_ALIGN(upp_buffer_a, 8)
8 ^ ~5 u( X4 k0 r#pragma DATA_ALIGN(upp_buffer_b, 8)
8 L5 b# p5 M4 ^- J0 o& y- N7 f% J
' z2 J; v/ f! m% ?unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' C. E4 k7 Y3 h; c5 iunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, U8 B# Z+ Z) ]; _) O" f6 C
: y& a( k' ]7 b: g
" E, `2 g/ A2 v+ f: I( ~static bool server_upp_data_recv(Server *server) 7 S# Q Z& ~* q, C- O1 @
{
% [, h# q7 `, F9 r) n, }3 G# ~ if(server->upp_channel_a_recv == false) {) O( K5 t6 v" @* x3 m
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
{( h9 S. D7 X; G9 }4 S& T( l if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! G( `( O( Y" H$ p0 d, Q server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 m: F/ P0 Q: R' n6 W
4 B0 t% b& q. u; ?- k' |4 f& S9 E7 p! a2 D3 G% a- K
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 ^6 y% e6 F" N
3 _$ ~4 r) i" d# p9 f( M# I server->upp_channel_a_recv = true;//
; Q& H% e8 Q- q6 f# H* ~# t$ t& ^ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);3 W$ m3 u; _$ y
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;5 O7 D2 C; m0 ?. v9 ~ ^" B
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ u+ @- r/ |( d server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//, A: C' y3 R# v+ o9 V( x
# }6 |% v6 l. v9 w- ~$ ?1 s9 D upp_error_count = 0;& Z2 h& A, J. \7 c( A) }3 b
upp_dmai_int_cut = 0;) a; ~" Y7 O& _ T0 y: {. W
2 R: K) Z }' l" S4 W
// fill in data
( z2 y5 O+ {/ Q' |' S @7 W uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' l+ k& K) x" R server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% K& Y# {0 B8 Y. P }
# q3 l3 [# N- {0 j/ Z1 d8 O1 D) t }
3 d k0 B R4 ^: u' k) ]$ ` else{; ]* r8 X4 C& l+ R- V/ { |8 x1 h& c2 f
if (upp_dmai_int_cut > 0){
2 [, t# x: b3 }2 y DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);7 @" a9 j9 P0 [" `- ^& U, F
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);: w4 \, B& }0 u/ H$ C3 L1 _
6 g* f/ O- B& I
1 l7 S/ ^& k* g i2 l //copy data to upp_recv_list_busy
0 |: X) n& E. E# ~ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);+ J# r9 [. o: |1 o y
4 S. W! ?; }& b //
* s6 I- j, ?& D' W; F* w$ Z ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);0 H" z3 I& o' Y7 _* Q
0 W8 u6 p+ `7 l
//6 g6 K& M# b8 a1 U: q
server->upp_channel_a_recv = false;//( P( x+ }* e8 Z% h/ `
9 s \: P9 k' `' X2 L6 a8 c, R server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* @4 f& Q+ c8 Z% v. i8 u }7 [7 H7 A/ Y/ j& a% ?/ |: h( F1 e
}
/ T$ G# K% u7 ^. N1 T: ^
+ w4 ^4 ]5 J0 b% E. N9 L3 r1 x5 Y& @+ O5 K1 j) }6 H: O
return true;* D6 Y% i. u4 }! c6 b
}
. t: x/ j9 A7 T& G; f+ l4 p1 r Q- i, ?8 e
static bool server_upp_data_send(Server *server) O" w! v2 R! J) m" G# r
{' L @3 I u8 J0 x
if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 |, o, T" @" w
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
9 |- W E d! q6 D unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);: U" V3 K5 _8 G1 B" l8 i- ?% b0 g
char tmp[128] ={0};8 o! Q4 G5 p- D' m7 i7 Q
) d0 y& W8 m8 [8 ?% N& ?) j Y+ w4 y
server_msg_send(server, APP_CMD_LOG, "upp send: start");
' Q2 c3 F. _7 L7 }8 e print_log(server, data, 64);
/ j& c7 u6 q4 w& S2 O6 n U
0 G6 [2 z7 H4 `8 h. k: p //
" o% Z ^, S H" @1 c memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% ?9 _$ Z: ?5 e9 G, v memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);& V* L& I, W9 Z0 Q$ t) U5 a9 F: `
print_log(server, upp_buffer_b, 64);
6 ]) z. \- m( ]" ^
% V( b |& Z, |& N) X1 n server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
. o% k, ]3 I$ ` server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
u& }$ M; O8 T0 U" b4 [/ A server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;$ e8 w" n) g" r- v- Z6 K+ k
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;1 V! p- h Z* G: W, y- Q4 \/ C
% x0 z7 B8 u+ |2 N' P4 A
memset(tmp, 0, sizeof(tmp));
* g7 g! [9 }* t- e @1 q, _7 c sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 H* H# [9 h F, L( {1 |' W sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
S) Y* K" M* S3 ?% A' Q server_msg_send(server, APP_CMD_LOG, tmp);; u, }4 F) A r7 Y, L+ |
, t5 d- t$ ~7 |6 R2 r
upp_error_count = 0;
- m0 Y) B7 }+ \+ ~ upp_dmaq_int_cut = 0;! x( T9 M& J. c m; N1 H; r. \( i. q
// fill in data ! W& Q% w. W- p1 R+ {' L% z
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 9 y* `* i4 v+ S7 j/ |7 W0 O
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 P2 y+ K( d& P6 w
d, Y, Q$ M8 } // wait send success ?( ]/ x; Z& J$ ^& `# x
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); + R. a6 g! l F# p4 V W& {
0 I, s/ B& `* d0 |% @/ _6 t
// make data node in free list ' L+ ^2 y' R" p G T
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 h( R& E: ~/ a% K/ o$ l; n
server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ B. u! @5 t' f4 k }
+ |" a7 R1 |; [- z return true;
- w8 a- [) A& _3 F! Y}# Q, D: g* N% x# r) r/ n- o- u
% V: Y7 u: ]; u* t: c1 M- [/ h0 J- R) m0 F* t5 }2 g% s4 A
: m$ `% G9 @0 n" }& `5 @
+ Y0 A! A% I! E
4 [4 P( a$ Q8 i( ?( K4 J |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|