|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
- A( ^5 L! \( ~% b+ u# Z+ d6 b" j
4 F+ W) u/ q+ ~问题描述:/ `9 Q4 S. g/ m
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* s" s) y1 _8 o
7 `) v9 p( Y8 z5 |3 K* Y" S' D图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。 i% V: {, Q6 ^9 o' \
; c! s8 p2 R* i6 C. Y9 F, c测试结果如下: T' C$ p0 i+ U1 `0 g8 V6 r# A! p
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?/ c3 o! U5 N3 z% W# U
. Q5 S$ w, R( |' z
- B" T* X8 e, F% Z9 S9 x8 H& H$ _备注:3 J" j4 k/ Q% s+ {
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
+ V9 c% D$ K) D6 k- e+ }6 ?2、相关代码如下: j# {) q* v8 A/ r; E" V/ e! v9 S
//UPP DMA缓冲大小512字节
3 F. B* }7 s! H; D! t/ F" B#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 g7 Q! h) F/ w2 p" ?#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' A) R) N+ n9 B2 V#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( ? c0 U V! _1 I, O4 P" f6 c
9 Q2 V, @' ^4 g" _+ |% p' U6 [ W/ f9 m2 U$ k% ]
//upp接收、发送buffer
2 Q! e% B& w! }4 m#pragma DATA_ALIGN(upp_buffer_a, 8)8 [2 v9 N$ P3 E% U& E
#pragma DATA_ALIGN(upp_buffer_b, 8)! D3 d1 t2 |0 O& R( m5 _
6 V' d) O. C# z6 C; qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];' ?. A) b$ v; y# e
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
1 ]& Q& `8 Q4 W4 @' j
7 z$ t( h- r: p$ z+ R- l
$ d' f( b6 {2 T! Dstatic bool server_upp_data_recv(Server *server)
4 [1 [3 e2 a* m( V{6 n1 u) L. D- [0 s {
if(server->upp_channel_a_recv == false) {
" ~, S) W/ u/ h) I. [ server_msg_send(server, APP_CMD_LOG, "upp recv: start");* `! b" R4 y* p5 M% Z/ A! ~( Q3 q, s
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 g1 c# Y* K/ t! |5 D3 j) J8 o! Z2 {
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 |1 w: R3 e* F% h
: T% h' g" Q/ p4 {/ T9 x& b h8 z1 q, m& x; [
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);5 i1 r" {! i$ j+ ^$ I, b
1 o" |" L2 U- A
server->upp_channel_a_recv = true;//
1 ?: Q' R1 R7 Q* p server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
7 Q8 I8 b, u5 J5 L8 Y server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;/ b' R8 N3 {2 d
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
. T! c% V" H1 y3 a. T7 A server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//7 _ ?! j. @) n1 u6 N
4 v6 G- E) G+ {+ k# a2 o
upp_error_count = 0;& C4 b/ q4 r+ o- G! T( O% g
upp_dmai_int_cut = 0;
5 x( g2 \- \* i& J% t& \& M+ R% }. F2 d& ~9 N# C# d
// fill in data 9 t, {& `9 r% B
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 U8 d" E2 q8 V \: k server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 S+ b# D) N; K4 `
}2 L3 j1 o/ I% Y
}/ ^; d/ w" e5 A1 C# n" ^4 f
else{
4 A9 a9 a# p& Q* z! w% J& z9 W3 ] if (upp_dmai_int_cut > 0){8 w" p" v; p& Y; k
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ D& t1 R9 G _5 z. f- ] Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
+ w6 [- s2 U6 e! `9 X8 G, Y0 g) b' C# j/ z) [
, r. N( @4 R. r" A' Y5 c w: Z
//copy data to upp_recv_list_busy/ z" P* C/ v0 `1 w1 T1 x
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 P( C$ D" D" g0 I8 Y3 O3 U
* y3 j& K F k8 d0 v //
( {- j- U2 o/ T' C( t5 x. i; n& D ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
o5 u5 H5 u! J* a& L) \. m H
' q! m: c1 U8 K$ O2 L, L( D //
4 O' Y8 L2 t4 N l server->upp_channel_a_recv = false;//
9 ]7 ]; t5 Q1 I# m; U8 {4 b1 J3 V, T& r- z/ y; Y2 i, [4 {8 s
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
4 n; K! I" z" z# R }
. h- L3 C$ @) X }
9 ~9 z- n; g; g' |
% w8 ]( W! ?$ c/ E; S3 i- L; s3 ^( ~( y7 U# a
return true;
v. U2 X, N, c8 f}
$ w1 R6 l3 f7 W/ [
6 U; N0 i# L- @0 \4 W8 J. a3 O+ Ostatic bool server_upp_data_send(Server *server): Y" o2 [) U7 p( G0 l0 A2 }
{: }# F3 O+ y& e& i; a2 x
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" }+ |( h/ ]) _' G' @ K DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- ]* t* E$ B. ?3 F7 _ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
# {) c# G% U! C1 q char tmp[128] ={0};
: ~6 R/ ]8 L1 r/ s4 C& A% @
* N. z4 J6 F {7 B, a server_msg_send(server, APP_CMD_LOG, "upp send: start");
" |9 ?" F8 }8 `6 P print_log(server, data, 64);
" C; v3 C/ f& Y$ w4 R! p1 X; g1 |, }' L+ Z: e- \! w r$ u
//$ `8 q$ X& s4 S) V; c$ B( Q
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);# F* a4 d7 d3 W2 B* |
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! g: {1 A9 ]# t& i7 y3 Q' g print_log(server, upp_buffer_b, 64);* r5 l5 V4 A) G- }1 z
) l2 o8 K$ I, a% D
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
1 E1 o2 m/ H) P/ }) Z" k; w; Z; D server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ) Y/ l* g4 R. `0 \3 p
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
7 J: [, N5 v! E; J2 n# d6 r5 J% w server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; A( X& p0 b% u2 q: G0 U$ u, ?
! F' l `" Z# ? memset(tmp, 0, sizeof(tmp));
) y4 K, a$ Q8 ?6 g sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
% h1 W6 j; O+ e/ Y( `0 B' W sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" h8 v$ m2 X+ r# q) l2 Z8 y server_msg_send(server, APP_CMD_LOG, tmp);. L A3 r2 X' H4 m! K- [3 L
3 q) S3 }. k4 l6 d4 ?% q" i upp_error_count = 0;
0 K8 ~( P. q6 | upp_dmaq_int_cut = 0;
& c9 d& ~% r% h- W% b! q // fill in data ( x6 y; _, E1 ^+ s8 ` u, G3 @1 _9 T
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
- E$ o/ t# e" r0 B server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ J$ w8 \# O6 C- K$ {0 I
2 ^ T/ @4 S2 I! B+ N // wait send success7 P" {4 S" _% i5 k' q/ {. j
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ b/ r1 g' J h8 y# `$ T; R" x9 p; @) B5 Y/ {+ B6 o: @8 k8 O
// make data node in free list
4 z3 _! t' o ~2 E6 D ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
+ S9 O# f+ P. P$ F9 m' i5 v server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 x- X. o; A8 y( ]4 c }* B; |; q# Z' j7 R0 ^1 V
return true;7 J( g: S: [: F1 T q+ o8 O
}
6 k8 ~7 \8 G* r) f; {. O; p* ~" W0 E0 P* Z# q( T6 U
$ Y1 o" @2 p2 b0 `( _* H4 R0 N) Z# R4 n+ k
% v: h; E. y/ s f7 I3 t9 r# n
# ^; S7 O" }/ ` |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|