|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 J1 }" e( Y- _/ ]! O0 v! ?
( X& ], j' N4 ]7 t$ S5 G) e$ D, Y
问题描述:4 l# t" d2 Q, c! o8 D
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:4 }) @ i, _6 \. R' f* O* r5 K" a: @2 v
* d' d) w+ b3 `/ H; Q3 B
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
; H, V% t% Y/ i: L( _+ i3 J% ?% C3 s; E
测试结果如下:/ I W5 D: [$ _
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?+ r* n0 s' f/ u" }
* N) d p" S7 Z4 o6 L4 w4 s8 j
! W3 ^0 c$ c& U, P# P& G3 W# n8 e Z备注:
7 D5 Z F3 a" |$ `, U* `% f# s1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ U. ~% o" Q4 a$ v+ n! h2、相关代码如下:
: `. G8 e: j( C3 c//UPP DMA缓冲大小512字节! Z; Q/ n6 [! m
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍* _* H/ e( x6 y/ ^5 R* C0 r
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' v1 v b7 k5 q; e8 a#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ d7 `0 b8 F7 I9 ?9 P9 b( l+ ~7 E
. _# K2 z8 @" N# J: }5 A% C# b; A; H* d$ P- j! c v5 F# o. \
//upp接收、发送buffer, z; S/ o2 }3 m% I8 X' ?
#pragma DATA_ALIGN(upp_buffer_a, 8)7 \/ A; O: M; k" `* H/ G
#pragma DATA_ALIGN(upp_buffer_b, 8). L$ a; o) S. X) h3 I- ~
; O! B* A4 z0 runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];- h8 o! V" `+ [$ \ w7 A
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];7 ]- e3 B# W0 c( N( e+ n) Z
8 Z# I' C% a# O Q1 z/ M. n) v( h9 N* m) N
static bool server_upp_data_recv(Server *server)
/ f; E. k( r& i, T" H" X{
P* P& D q9 T; h1 W7 { if(server->upp_channel_a_recv == false) {' d; I" `- f( D) Y8 e( |' z: m K8 r
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% p$ t/ \' {0 |/ r6 j if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
. s& E' n8 s0 D server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ Z& u$ Y D# V. s' }# S4 ~
& m8 r% s% O# r! ]- u3 z; s* i: T c1 r
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);- \- P$ | }5 u9 ? W
4 o$ [* P( F4 @; L1 u5 [% V6 h server->upp_channel_a_recv = true;//5 x* S. [2 B$ c1 }/ [4 Y. q- l
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
- L$ e) J7 l5 `# M server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
6 G. J8 F; Y8 U) h& R% q server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;, C9 M( {5 U! K7 Y& P+ K' b2 y
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) f4 X; ~3 Z9 M2 y
; c5 E i S9 \ upp_error_count = 0;
0 b9 ^8 z- ^/ ]% X$ ]$ F upp_dmai_int_cut = 0;/ r+ c# w- L3 y3 j# J, V& `+ o/ P
0 C$ v$ T( S- c+ q$ b4 e8 D
// fill in data ) r7 G: s" }; z, e; r2 D
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); Q0 W; h% I! A. {
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, [- X4 Z( s1 | }( o+ X( L/ j0 Z! i' h2 I9 N3 ~. A
}
5 O& f" c& s' p/ B f else{
" C( O# H0 z+ k$ [ if (upp_dmai_int_cut > 0){6 l ~3 }5 f, X& O4 @! q- a& q
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
- j0 b" N# S4 `3 c Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
- p& M& w" Z5 S+ V0 j) Z5 t
, C; R0 o% A# S; j
) e r" s* n- i( Z2 k: X# I4 J5 N: B( q# c //copy data to upp_recv_list_busy3 L2 z5 `$ f6 e, N2 W f; K& e( i
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ @2 a1 l* p! N" h$ P4 T$ w
! F2 t& W$ |4 D$ E( Z
// T% S. i2 _1 B/ P) k. l
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& Y' B$ c" a7 Q6 n5 }/ Q8 n4 Z* \
! |0 C- b/ D. K+ v: L9 S //
4 ~1 G( S+ T8 Z server->upp_channel_a_recv = false;//0 k" S" v+ e! q# }# j! y
$ E+ T& j7 z7 b: r server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 c6 m3 Z# g3 ]* E; \6 R! \ }
6 z/ p6 V! H5 l/ ?. y8 ? }
' `* n1 ^1 R% n
( a v! U/ G% d0 ^, v/ r0 Q) ~ f& _
! n+ [* F# b% H/ l return true;
- j- \/ G w- T}- ~7 C @$ |2 \5 y W/ ~* Y
& C4 t8 j! n" a _) P
static bool server_upp_data_send(Server *server)$ d% R9 L# f5 y; y& i$ ~
{
; r9 d1 L8 Q! \ if(ListMP_empty(server->upp_send_list_busy) == FALSE){
. C; D% R7 _: S% W' U! M DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ w) X$ y% g1 `" {$ A) U0 o7 J unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) s$ Z3 e( n/ K
char tmp[128] ={0};
: q4 x; ]* I4 [# N4 r+ Q% W2 x( | f' c0 m" }( a" L& @
server_msg_send(server, APP_CMD_LOG, "upp send: start");
6 ]% u3 k0 z: h: B8 { [: y0 } print_log(server, data, 64);
3 |4 }8 Q2 [$ O3 i& l7 M% E- F$ e5 a3 [# X, n; N
//
, x& q, r4 e2 M/ h D memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ d1 W$ w# s2 D. _% i7 M% H
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);& M- O1 _2 q& _) Y0 m
print_log(server, upp_buffer_b, 64);
. R+ h1 [6 [- X/ g# A& h
, T' W- `- A" T+ N server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
; n1 G1 T7 y; C, k- {( { server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
, E1 h6 Y" D% R) r5 g2 X server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;5 z4 f/ P4 M+ [- r4 V% ~' ]
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
; B, b: G; Y5 |: T8 o7 q) N& M) r! A+ M/ T
memset(tmp, 0, sizeof(tmp));
3 A4 h B, j- R4 {% W* O/ l$ q sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; N! s! P4 b) O! }+ H4 l* U
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
, _: e! O% A6 O# i: h( V server_msg_send(server, APP_CMD_LOG, tmp);
9 v, T! ^ e x
' Z8 h) S5 Z6 j- K8 f: G$ _8 o upp_error_count = 0;9 W5 h/ k$ B3 }# B. E, \
upp_dmaq_int_cut = 0;
2 C7 q- @4 ?! ` // fill in data 7 n7 d8 A4 m: ~) l
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 D; f6 G6 B& E server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");0 e4 Y* d) Z: G' W# k+ z1 d
" C R7 Q- T6 I
// wait send success
5 H$ h) Z4 p5 e8 t; _' b) v while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : I, e) {1 D7 C8 p) w G
& y# q1 l3 x8 @) g4 m
// make data node in free list : M. ]! c3 O4 b0 O- l# f- W
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. t. `9 b/ B; R8 v* M% s, { server_msg_send(server, APP_CMD_LOG, "upp send: success");, A4 `/ j- [: Z) E! R
}
n6 Q9 a0 a9 J/ E, B \5 n return true;3 R; E! o; l: B: O& I
}' m$ D3 U8 r a3 `
7 }! B: c* @3 A2 S, j( f3 q
( r/ O) g9 N9 _) r* c' N& B
" W9 b! _( K1 }! D
7 A6 e' m* K/ K: _
, M0 ~+ q" d+ k5 N |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|