|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ( M: r" h0 |( A6 N; k
9 c$ C+ p/ t+ J% z0 m# C4 ?
问题描述:
1 ~! n, [. ^9 H5 d7 {在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
4 [4 g0 t0 _, a* \6 h$ f4 _5 C) Z7 d3 {
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ }8 T/ l: o% _; R0 Y7 D& l; ?4 O
! s! _' Q$ L' E* S) r4 s7 c, c1 g
测试结果如下:5 Z) w6 O" ~$ j- q
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
7 R& a- L: x) w1 c( {9 b& p/ \" w
. W4 L C" p% l6 [7 A
5 V& @5 e$ p. O2 Z( q备注:- y( }! t% }+ A$ q5 E
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* P# g, j0 T! y; a5 F8 M
2、相关代码如下:) n. Y B4 v' a# i" n3 r
//UPP DMA缓冲大小512字节
8 l4 } V# s4 H0 g# ?* o#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍* q2 c, E3 t# U
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( q: l3 H( R5 |6 ?) K
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 h2 i: S3 f8 C, C
4 a4 i& n7 P& Y( D8 e+ w* K5 a- R* h- {
//upp接收、发送buffer
" ^3 C" n9 W3 E: T#pragma DATA_ALIGN(upp_buffer_a, 8)+ j3 Y1 i9 a% F/ @2 C- U3 i
#pragma DATA_ALIGN(upp_buffer_b, 8)
+ @9 M, _+ p5 w$ h" _! _ ]
U8 F5 R, m7 N, N$ p$ r/ w3 Vunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
) T1 z4 h; K* P& z& p/ r3 wunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
! y' K* D+ G1 }. E2 M; t$ t% X4 z' F) W8 L# z q
; T! Y/ _0 g4 W6 N9 ?" Q) qstatic bool server_upp_data_recv(Server *server)
6 b7 |0 F" n- N- ^( O# A" t c{8 R7 p: |! i x9 Y
if(server->upp_channel_a_recv == false) {8 Y( n2 I% R3 y) A7 z o
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 _8 I% _% W7 G8 S7 y8 P- I if(ListMP_empty(server->upp_recv_list_free) == FALSE) {# ~% M; j* ?* E1 d1 i9 U
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( P+ V. @5 M7 ^, d
- w/ j+ p$ s8 B( t$ D; l4 P# l& C9 o3 o" g! M
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% P3 I7 e! m/ _$ P5 Z2 Q7 d8 f9 \ e' W0 b4 g" u8 Z7 ~9 M, h
server->upp_channel_a_recv = true;//+ c4 D7 g$ M; _" Q" r
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);5 ^' D, \* X$ G
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;* f- Z4 G, ~! |6 i' ?0 ?) Q
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;* n7 t( N$ y% h& L
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ q! M1 M% x7 w: Y0 i n; `# y
9 p; r f8 {( J: H
upp_error_count = 0;
; g# d% l4 w! C, K upp_dmai_int_cut = 0;
8 R% n+ \0 c' Q u- w: f; B% L0 ?! ]' d4 h4 G# r
// fill in data
7 w9 O3 M0 H* l3 Q) x4 o uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);* P' b6 S" u) t: Z1 X
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ `& b* }. W% g, d/ w: ?0 j6 @& l } h$ z/ J/ f1 _& u
}8 ^. t) V) n& e! d4 P6 k L; l8 A
else{
$ k- j0 w6 I! W% O7 L! H9 H* e if (upp_dmai_int_cut > 0){
; k0 F) [+ t) {& ~ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. k- J" U! m* C1 `8 V2 Y
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);* d: k$ Z4 Y I# u1 S- y2 _% r l
* e7 @( f% I) X7 q
6 K4 K, G& X+ n* @4 {6 Z. K- p' L
//copy data to upp_recv_list_busy
h4 g9 t9 G1 v5 H( x& u/ P; q memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ D% O |0 t+ A
2 e9 q# F9 s& m8 {5 d" `1 e /// b0 l) x4 N7 P% Q- e5 P) {; p% K- Q
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; A* K* }) E W* ^
. Q4 a' x, s8 ?- G# r //* O8 B1 ? R( B& m. i
server->upp_channel_a_recv = false;//. S+ ^: U* S+ [% l2 k0 _! T& D) k7 g
0 H: }; ~& _$ N5 p4 D5 V1 @
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: z: \5 D1 R4 b' K( ]& t6 _ }
3 n) i1 `/ I% B5 S' _7 X o }$ W- \$ @: [8 w+ D
! e4 X* `. P3 D- h+ O
% b0 P) F* b% F; W: E% N0 k return true;1 Z6 p$ d, A& G4 P
}
# [' a) ?) E7 n2 G9 L) _
9 f! j; h" H' u/ Z% W9 jstatic bool server_upp_data_send(Server *server)
* H2 n" T0 G6 `7 j; J{
1 j( A3 m* E: h9 H. b. y9 n0 _ if(ListMP_empty(server->upp_send_list_busy) == FALSE){, G. o6 K7 J, X* y- V
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% z% h2 p# u: ]6 J9 Y7 { unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ G; r# Q7 s; v% M9 c. ]
char tmp[128] ={0};, O, K1 p/ `6 ]1 D4 ]3 l2 i
1 Y& Y; u' c Z$ @ server_msg_send(server, APP_CMD_LOG, "upp send: start");
" S: `+ p8 _+ A' P8 I/ h- z print_log(server, data, 64);
8 J+ M& Y9 ] X) @+ ]. E& |& o: L( H
//
2 B$ h1 c4 c: k \2 U memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
) a/ Q' f6 o: y7 m2 u memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);' Z6 g. D/ W& l8 U O" F8 L
print_log(server, upp_buffer_b, 64);6 w v; q# S" }* ^, @& |, s; U
( F# l, R! f4 q$ P
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
+ T5 b# U- K0 H! v) v server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 1 j; J1 r: z5 X, `& l+ S
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;/ `7 [1 z1 B& S4 S
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;$ K( }% `- A: [4 S
' I$ U% Q' n, E/ \
memset(tmp, 0, sizeof(tmp));* r0 S8 d d5 r! d$ d+ I
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 Y* o# \) j; r1 R
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);+ h' r& g; N' Y
server_msg_send(server, APP_CMD_LOG, tmp);3 c% f7 o: n5 l. @
% t/ A6 F2 M1 Q3 X8 Z) h8 J
upp_error_count = 0;) H& r, O+ M0 L7 ]: V# |' H
upp_dmaq_int_cut = 0;
7 \+ y( h. ^$ j1 @( M: v. p // fill in data ! t0 ~) L/ M: B7 A
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ' b7 i8 Y2 A- u) L2 L
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");) h! Y4 |* o5 @( ]
' G- ~+ [0 V+ Z
// wait send success
& O8 x: F7 B% s/ \ ^6 ~! X while (upp_dmaq_int_cut < 1 && upp_error_count == 0); & d: E* n0 M$ P; P6 r; a
8 d, t/ \) B" H- `* h // make data node in free list
0 x9 d* d& E2 {+ K+ T2 i3 R ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ W9 Z/ c! w7 w* m/ m
server_msg_send(server, APP_CMD_LOG, "upp send: success");
! E% u2 P1 q( E5 W: J. T% J }; ], f# u+ m- o7 q0 g. g3 V
return true;! e3 Y) H* `; R! h3 n+ `
}; R) f3 {5 d9 F# i, O
5 I% H4 K% K% ]# h& p) ^& L3 [0 |
8 S- u% H' ~' `! C5 r: w* B3 [0 K
. A5 T0 i: n* Z$ j. i% n: U# _( V
/ x( A ]! [7 ~ o( H& u
: d, c8 z* O$ l @9 k1 G
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|