|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) {7 h6 ?' ^1 p- h" c8 w2 y
# H" K+ K: s) ~, Q4 h6 T# A3 s$ x问题描述:. j1 D3 q$ p# r4 x
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
5 F& S7 Z* z% J" Q
) [; F7 h1 ^: h6 r% f9 s图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ y) ?/ ~7 s6 A4 N" Y
' T4 x' o' P3 R7 K# P测试结果如下:
4 Y. q' h% Q+ ]6 X" y0 B138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 l- r3 \% N% `1 Y% v6 b. U. P+ a2 e( {
& [( s6 T% o7 ~. v. B* E5 T
备注:+ a2 B( u8 c& Q" g+ t1 [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, M3 t/ W1 c; S0 H; @2、相关代码如下:3 s$ T& ?6 y; B
//UPP DMA缓冲大小512字节7 h P& ~/ b& ] Q! d \% G, e" Z
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
b/ H; ]# ~1 l6 U' P/ z! m#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 U7 r4 G0 @; {/ \' a1 t; s#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 y, c s% y; g+ c/ a' r
4 m1 t9 U5 K% q' l( L- y5 [, Q% S8 o: W
//upp接收、发送buffer
- |' ^7 F2 Z2 Z$ d6 {: m5 ~* o0 b#pragma DATA_ALIGN(upp_buffer_a, 8)
|# B( k( ^4 B+ v#pragma DATA_ALIGN(upp_buffer_b, 8)
. s+ Y2 u; `6 [+ c2 k
; d/ ~; ~- W$ o' uunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 x9 |2 X1 }1 Nunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];0 p* Q1 I4 |' N( P2 ^! d7 K9 a
7 T6 Y- O7 l9 m% V5 ~- h
7 x% P9 |4 w& z+ F1 [7 vstatic bool server_upp_data_recv(Server *server)
/ C/ }0 }! o( }# h. d) ~# v7 }0 {{1 U0 e( r2 O, v5 j$ I) K6 j) z
if(server->upp_channel_a_recv == false) {( v, y# g1 o2 D* Z( r/ Q; c" `, `' l3 \) r
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
+ e! c3 L/ Z3 {. y$ w' A) C/ i if(ListMP_empty(server->upp_recv_list_free) == FALSE) {* l8 c1 e" N3 B+ X7 ?/ {4 o
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 z: u+ m. K8 C+ \* i8 A+ a6 L Z
& S! M: Y9 h% {, I" W
% W% Y0 B a4 c2 n- _) H, S+ e memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 i4 A( O& @3 i3 B0 m! t+ i9 L1 t8 M' P9 f0 [ t9 u0 B
server->upp_channel_a_recv = true;//
0 ]% X& Z* X+ c/ u& o# z+ f server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
' u1 r: p+ R7 j; o" H ~. v( g' H server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;4 h- B( f9 h" F [+ z2 t
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
; }9 g5 m+ X, {# ]' C$ f4 X4 u server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 h: [$ L2 k( Y3 L
g! G8 F0 d' i' R% q/ [
upp_error_count = 0;
- t6 p; P5 M+ K; Q, d upp_dmai_int_cut = 0;# N3 _7 d2 y8 Y: R
2 y1 {# X: z+ s! p# H3 b0 w
// fill in data 1 c7 i+ R8 _' |
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 d8 j7 {( F- c5 d) ]7 Z) V server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");' c* z7 X2 |5 D* Z+ v& P. i" \
}
$ g* h4 D2 w, r; X5 F, M }
; X q2 S: R8 E8 l& V else{
& F2 Z* `5 }9 i, B if (upp_dmai_int_cut > 0){
5 e: a. \* m- `8 e+ C7 U1 U9 [ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' a/ l2 M8 s% b- k& I; P1 o
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 t" I8 w$ k& E/ e6 Q0 U
h4 h- N I6 T2 n
" a$ o; F8 Z8 n+ o( _; d( J( { //copy data to upp_recv_list_busy
8 _6 T* g5 e7 T5 [1 c memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' O* x3 p& s7 I4 {# a1 U6 w
) L4 a( k x7 f* }1 m* [ L // t5 H4 T" v- X, d
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; x) G) N+ f4 V
+ }* @+ J) ]# i6 e" w! p3 k //! @" E# z+ ^; ~& c
server->upp_channel_a_recv = false;// k3 [" l' O) [; T: k
9 @* B7 s5 v+ f
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 X; M6 m) k" x6 r- v3 ?! W }) l; r( n; ~7 P
}' e2 @$ Z' P& k( h
+ M7 e' ^$ ?1 B/ w' Q4 }3 g+ \* P& `1 A5 v5 @* H
return true;
; [* x- j! f v* X- u0 s$ {}
' D( D. J# G8 l$ D6 \) J+ ^8 h+ M: {
static bool server_upp_data_send(Server *server)" @9 {8 s' ^, `- _
{
- B0 j$ C8 r& G3 x6 @ if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 o# V+ `8 _6 i, H
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 r0 a* S4 e( k3 t. a! h) O( L unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);& m$ l @1 o, R
char tmp[128] ={0};3 Z/ V v8 @* q+ ]5 k. E$ n8 T
- {; G2 W7 x: ?0 e4 u server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 e7 y; u7 `1 T5 r+ R& m9 d print_log(server, data, 64);3 O, _7 k4 Q; T
9 n) Z, i7 S( q: C" f, P
//
5 g. e% i! J. s3 l& _ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* X* E M/ r/ J' e7 D
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
; j# u0 Z0 t7 Q8 y7 o print_log(server, upp_buffer_b, 64);! D8 h4 z0 I9 x1 y9 R8 Y
9 Q4 ]. G: k/ h7 R2 k( f2 ^
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);6 c4 [- {" W0 t ?
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
, X* @. C6 O; b6 |) \! d4 L9 Z server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;; ^. o9 r& H1 k
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( }4 K' O3 K4 \: ~ H4 ?1 I0 @& g
& C& j- n. Y, E0 g- q3 W# l
memset(tmp, 0, sizeof(tmp));
" P O5 a8 l# y$ N% o sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ! x0 T7 V" J$ o5 U0 H* G
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ I' a+ l5 p: B4 D. k) }7 X% B% f server_msg_send(server, APP_CMD_LOG, tmp);
/ z! w7 L) d& Z! h1 z; X( @0 c) W7 V+ \! l m
upp_error_count = 0;6 r( {9 Q5 Q0 J* G
upp_dmaq_int_cut = 0;& b8 m# D8 D( X4 ?7 ]& M
// fill in data
' R9 w6 i3 {- v- u- r uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , d% M* E1 g) @& [$ f c9 i
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
- l6 I, e+ e7 w) s/ U$ H- t; h$ x
// wait send success
* Q, U) Q$ G; ]; Y4 @: c: a while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ d0 J% @7 ^ i# Z# j+ }( h5 G: {& O" @: l9 n" c: k5 s. \
// make data node in free list
% \0 u2 _) _' k* T ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. u: _, l. _; v7 U7 z server_msg_send(server, APP_CMD_LOG, "upp send: success");) l8 s m4 @8 d( t
}; e( a! E% n5 p" l" L7 A
return true;* k# |7 C3 x( r4 B6 F4 d* E' r$ o
}
% T8 ~/ X/ `9 V1 M2 I6 h) u
" o5 |' L4 r. I2 |; Z6 P, L
# P# i6 P, H; B6 c8 {
; H l5 ]+ m6 I6 c
0 ?% s1 L( A( l9 y6 s$ E: k j) E( I" Y! J, h9 B
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|