|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# L; {9 U/ p" m7 y9 z" j: G% {# M% ^0 A) n% w; [) P' j
问题描述:* l' U; f% k* a0 o. C: G% k
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
& B( T5 S' c" |6 v9 }: H
# m3 ^8 J3 ]' M$ g2 ~图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ W, M6 L7 P' b+ q% [+ p, e
1 d' B" h. U9 ?% I测试结果如下:
6 H- s M9 h1 X3 f3 G2 R138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
' h! r& P' J4 y; B% r
8 U% Z9 x8 {/ N0 g! o5 D1 x% g3 c: z2 D a8 l& J0 v) [+ n
备注:
; h2 x- |' x0 {/ C. g1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( t. C% M1 H- w9 X3 l
2、相关代码如下:2 N) \. c/ y5 F$ j1 q7 h
//UPP DMA缓冲大小512字节& ^5 u8 u- I& Z5 c7 }! c3 M( g
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; T( d% _- w0 U! a; O6 }
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: N6 f2 U" g) q# N* t4 J- I
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)+ G; \5 k3 e7 l0 H d
- w. A# ?, D5 M( B& z! Q" R# {, W. k( x/ \) \, ?
//upp接收、发送buffer
& a6 i8 b" T2 @: l#pragma DATA_ALIGN(upp_buffer_a, 8): v6 w; ]& g1 q) T- \: G
#pragma DATA_ALIGN(upp_buffer_b, 8)( ]# H g" l! z/ W
1 u1 c1 u) n! f! s6 N
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
* L6 V% A6 h: xunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, y% I( @: C ]- u& w
* ?) K( M$ T3 J* W$ p' @
! i4 ^. }3 k# S( y1 w, B% T2 ?static bool server_upp_data_recv(Server *server) 8 A1 [8 t9 L2 m" N1 V7 C6 b
{8 m6 C+ @; Q1 R( g
if(server->upp_channel_a_recv == false) {. ]% v5 l# d5 U4 S
server_msg_send(server, APP_CMD_LOG, "upp recv: start");4 d( O$ b( A0 _; p
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
/ @! j. X, A0 n7 F- `4 w" M server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");! ~# K5 ^6 C0 x- o, z4 y: F
& `* y5 `8 G6 T# g
$ a9 W! o, s4 z$ g5 {# B memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); S+ U7 I! [: n: ?# v
& J/ K/ a" g4 K; }2 h. e$ I
server->upp_channel_a_recv = true;//1 o3 {- {: f5 I" @/ l
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
+ k. P% E, e+ D5 a7 {# n. |- u server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
|/ }/ x$ d0 x% Y! [: r) V server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
' @( h1 j _% ^+ d- A j server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
) e% h9 r) P4 d" y" i$ d* K# }5 f& I$ x- X" ] W6 s
upp_error_count = 0;
/ m9 E; A+ O. |9 w upp_dmai_int_cut = 0;5 n- C4 h# Y5 b Y- w
2 b# C% W6 S8 A" j6 E
// fill in data
5 r8 `; F5 O9 F% o" p. P uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 ]- Q0 R0 k } server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ d* D* d9 ?! ` e } P5 O* R O' t1 w
}- G; N/ P7 I3 O* q3 b
else{; u6 N9 B7 i; X8 }0 n1 a5 h
if (upp_dmai_int_cut > 0){
/ } [8 k7 G; }$ R4 L6 r DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
4 t& c' f! Z) E' x Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 y* a& Q. B( [7 q/ z) C$ f* l6 P; C0 X# k' |- h
3 I5 c+ N6 U- u$ i
//copy data to upp_recv_list_busy' K. J: V' y i E) S' E V
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' q( O+ H1 h* z7 |* w
4 K+ A, Y! }7 S/ R" M+ k+ U: U
//
/ ^$ _2 o5 J* }, O r( m' o. w! w ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);" U' ? E* p S M/ s; {# ~/ t" A
J1 n, u! e1 j; X
//) n# n$ d$ x7 y# X7 ?0 F
server->upp_channel_a_recv = false;//
- Z; {9 Y" z" B1 ]4 g
7 g- u' X# k: D, D server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ V q. O; v b1 x1 Z# _0 A }
# S3 A, H4 c6 H. o }
( m. G+ k6 b. T7 o% C7 O& ?+ B4 C
! Y4 p; m. A4 l& _/ [( ?5 F6 ?7 [
return true;" f2 e0 O, v* S5 C; L
}4 P V0 t( X5 g3 |1 _; `5 e$ \
6 I I' r; }+ o R4 Fstatic bool server_upp_data_send(Server *server)* L9 x! N7 J! A2 Y& {
{9 D# V# O: b9 Z$ E( Y
if(ListMP_empty(server->upp_send_list_busy) == FALSE){% u& I6 k: q# ?# ^% I7 P
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
8 s2 Y! G a' M% d9 M0 x unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! m$ k# e% I- `9 q7 _7 g char tmp[128] ={0};
9 G) F8 c' }1 u f1 Z8 J- V8 R8 l9 R. f! @
server_msg_send(server, APP_CMD_LOG, "upp send: start");
- M1 d) `7 f6 S6 b print_log(server, data, 64);
( L \' f7 _ V2 ?5 z8 {4 N/ m! x) [# E6 O0 `1 o0 X- ?
//% w3 g& P( W* S+ H% \
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);9 D9 O: B% P' \$ Z0 `- t
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); l: C9 U1 G z7 _" w8 |9 s5 b
print_log(server, upp_buffer_b, 64);
; l* m$ U8 B) D3 p3 U4 h& q% |
$ _6 c& d) E' v; B+ f4 v server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
( b0 m7 q- e& k/ X8 X$ N& F server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 1 ?" Z% `/ i3 v/ o- H
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
& f4 U; f! K' v0 s server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT; h, A9 O7 Q# U: Y
. r. w) W( @6 O3 S& @8 Z2 T( o memset(tmp, 0, sizeof(tmp));- v- c7 A$ X+ } N3 Z# c
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" h% z" K+ H5 v7 M0 k [$ k sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ E: F" |9 J5 t# w% g' d
server_msg_send(server, APP_CMD_LOG, tmp);& Q# O2 Z) C" s0 i8 I
* w" r+ H1 c, G2 d4 C7 z7 {! w upp_error_count = 0;
4 Q, I( ?1 |3 p3 T) ]. Q upp_dmaq_int_cut = 0;
+ U3 L' c& {3 o3 K5 @7 A" h // fill in data 1 m h- c% f* ]6 ]. t
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); v* H: V( p$ P7 y
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! S g. ]5 ?) ?% H
: a; N* E3 @( d. S. ^. B0 N
// wait send success
5 w- I+ C _+ I" n while (upp_dmaq_int_cut < 1 && upp_error_count == 0); # q4 e ^9 Y4 ?$ a5 S3 a# P! ]
3 g0 k7 w& d: f: x7 J
// make data node in free list
, k- x7 X* r, R) Z& l# S; B- L9 Q ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);, E5 D9 F% q+ |% K2 p9 A
server_msg_send(server, APP_CMD_LOG, "upp send: success");
# Q5 r/ }; D$ ] }, G G. [" J3 N) E- ^& Y
return true;
8 w0 h0 o$ U/ f2 `+ ^9 t0 b4 g}
) L: r# {) @& l4 W/ o+ E- Y7 ?2 y- _ L9 X8 a
4 h- b7 Z; B2 \7 R( F3 \# ]8 J# t$ z9 i( w* J2 S. d6 K. x) q
) N' G5 B+ I2 p" v+ p+ u
9 w7 }! g( |) C- z- z7 { |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|