|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
0 s4 F4 v; q+ c+ r3 X s8 ^3 w$ ?6 ~ Z1 m
问题描述:6 L4 g" {% D* @0 C
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ [& j& ^: E! g% x
# H# y5 Y1 [# p& M# h4 b$ n( j
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* s. U$ v3 \/ `0 R2 l2 N
- w) _' D# K2 `
测试结果如下:
1 l! H7 w9 [9 Z4 z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?; A: X# C% [% u; `. q) Y: \8 O
% Z* c0 o; K, a5 [! r0 O* R
& I) { g- f, m/ w- o备注:6 G3 k5 V6 B2 p
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
4 l4 T4 }, k: X, J( Y2、相关代码如下:
. k4 H- q) B$ ?; D//UPP DMA缓冲大小512字节
* t; W1 o& Y4 @#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 m8 g9 H7 P& i( O" u9 u, i
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ U9 _2 N# V/ Z3 E: m- X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 V, \9 |2 n. n$ g3 P1 \* q6 w1 U" c
: V b& j( t! m# L, H r2 P8 ]
4 T( ~1 W/ p9 [& L//upp接收、发送buffer
" G2 y9 g! t$ p7 _. C#pragma DATA_ALIGN(upp_buffer_a, 8)
( o' T0 C( n) i% {#pragma DATA_ALIGN(upp_buffer_b, 8)+ t. k7 m) D1 G; ]# o) B! \
" ~& K4 w. c5 x( s" [( o3 o% R9 z
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ J6 h# @1 C3 x/ C. \
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, {9 d, Q6 U& W' H- _1 d
: x! ^( `5 y0 e# T/ z6 b5 L* d( w! ]/ F5 g B* I; J# i1 v
static bool server_upp_data_recv(Server *server) * {$ J2 K5 o4 M( c( o5 x, l4 T0 v
{
" {1 v- X9 n. `/ e: ~% g5 p% q if(server->upp_channel_a_recv == false) {
5 G2 M8 e# |3 O% ] server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% @' v9 h; }% n1 \ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 o. _6 p: T6 x# W$ O* S: e
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");" W2 }8 ]$ W# ^# C. y) Y
) `6 }0 {! [+ H7 S) V# k! j/ L" _* T6 n" V+ E; a
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" K& _+ d) R7 s* k' Z u1 ], D$ M2 y# @, z% d
server->upp_channel_a_recv = true;//
- ?) Q2 T" f, a0 Q server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
. m/ ^- b( S' Q( c0 A7 o server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;$ N/ R, m. c5 `* A! V
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ S ^% G& _* |$ D9 k& i9 D server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: k- f- @3 k$ V( }: O7 C
; s9 w; G$ {, p: D2 E# {
upp_error_count = 0;
3 z* o% I$ o, y& \. k7 H5 e, ` upp_dmai_int_cut = 0;
$ }$ _- L2 D3 G* p' t& F
1 j% l( H0 n/ @- | // fill in data 4 h) o2 _( l0 e
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- D: f! q' k9 q/ e& W
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
) F1 Y0 M3 a2 N& d2 |' x& U! M/ n }. t8 O. C3 W" i# _- p* |
}
5 X% e6 \! e; Q+ f% w else{
Q0 e8 B+ p6 U: E if (upp_dmai_int_cut > 0){
1 @0 E% U% G+ p! @ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) ?, r8 i+ g2 b1 e" _ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);0 z- v0 v% W5 O0 ]& E6 p0 V
\0 q6 ^' p4 B: {1 P
& C& }4 g# m3 G# c/ Y6 { //copy data to upp_recv_list_busy$ K+ b* z- X7 | L
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
# z: O3 f2 o( M$ I% `# ~4 {# R( ]6 n0 N" b: n
//- X0 |9 h. O) t0 ~6 `: r5 P
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);! q: ?$ ~& B U
4 ?' u7 W. u' Y5 B
//# S) @, P8 @0 ?& P' ^
server->upp_channel_a_recv = false;//0 U8 Z3 G1 r5 S3 ]8 F+ @) `; {
$ a. G" T4 v/ c server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ f9 A# B8 L: i' `. ~. K
}
. M; |9 E9 K1 @- p }8 _% r$ ]2 F+ ?. W" |
) [: w% l* u2 r: S, ]( M) z' g J
2 h d: S# \) R( [2 D4 W k4 l
return true;
* A( F; l6 ?/ C, N+ c) p+ I}
8 X4 i5 D6 m( ?4 l$ c8 J7 j: J; i3 @, X7 \8 W; e
static bool server_upp_data_send(Server *server)( U3 K! U2 x+ V. L% n
{$ ]6 h: a9 b* P! [) S3 X$ N
if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 P( c' t4 ]. i- I$ T8 p
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 C; p9 p4 c! b& m6 ~* y [0 l+ ]/ p
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# Q+ a7 U, Q: N/ ~ Y
char tmp[128] ={0};: O1 Q$ K" N9 J! A% W
8 L/ v& {6 b# y! R$ M
server_msg_send(server, APP_CMD_LOG, "upp send: start");
: K! U5 p5 C! z) C5 u# R) q print_log(server, data, 64);' b& U# p A2 L& I
& ^# V2 {: r, w+ j. r1 X //
" g' ~; _% f7 o% y* z0 l8 { j memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
4 n! p1 G7 X7 \1 U) u2 A memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
: ^ ]3 l3 C4 Q print_log(server, upp_buffer_b, 64);
% u$ l- B _5 F0 H+ g! V; m; w
0 g" E; G2 \4 N% D% n server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
( v2 U. `% E: l3 x3 b9 Q+ d$ W/ W server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
( j* _' {0 \( v" g& h& Z, ]* o server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;% `9 g3 o1 k9 v5 v4 Z1 B' l8 b
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 r$ X. U& r4 V6 t3 s* V# d n1 l
memset(tmp, 0, sizeof(tmp));9 i% Q8 u1 X, C; w6 a+ R
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 2 |( w/ a2 \* u# B' O
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# X: }' ~5 E" ]
server_msg_send(server, APP_CMD_LOG, tmp);# w( F4 C8 z. E. J$ Z
O0 v6 ]9 e5 Z2 c# w6 v
upp_error_count = 0;- g' r9 z! L- M* b
upp_dmaq_int_cut = 0;, A2 n- _; \& W' j* P4 J' C2 `1 ^4 ^
// fill in data - U' r6 B9 q9 x
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
2 p* c2 @$ F3 H5 Q8 P server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
: B+ |, |. D; c. r( n. D+ |9 k( _9 q* w5 Z2 [; c% ~# v
// wait send success2 K5 I) {( T# m5 A O
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 [6 F, J. `) b9 ]) @
8 h2 a7 B! e6 ~7 C: x0 ?! Y // make data node in free list
0 }6 j" f( v" p) F7 {9 V5 s2 K ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 ]0 @& I, H0 x3 E$ l4 k6 `6 h6 e
server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 _% B2 T8 S% `+ T, F5 J7 N }
/ F2 ~7 P# u" l4 g return true;1 w- ]' @# C: K, S
}, E% t7 [& R! t. d3 _6 W: S
' g3 d5 L1 p r" W& _2 N# \( n. @( \0 G, t b/ {. [" A3 u
$ U8 {: f; ]1 _
- B5 l0 N* C8 u" g' g! z
/ ~5 W$ h% f+ F
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|