|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 ~! \$ P, T- L) E
" P$ X. w; r K1 M4 Y问题描述:
+ o8 l: O q" ]- B在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ {. j9 ~0 I. [" f/ i0 L. U
5 e4 B+ c+ Q6 V; Z9 [图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 y* M( z. y/ n3 R4 k6 s
, x$ m- W5 R* A% D测试结果如下:; d; d- s# m ^$ ^# R6 ~% y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' h' c( |4 V4 g" i4 V
" ]8 O! S; p, G# f8 z2 W
! h. P9 A' M7 ^% a" @
备注:
+ N! F: \3 W, l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# g- j0 N* C& `1 Z3 a, d0 T( ?, r; ?
2、相关代码如下:
' ]: }# L: `" U2 h//UPP DMA缓冲大小512字节' C% e7 R# t0 `6 {8 n7 N
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: w( W% [: J7 V#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 g7 R2 V9 _; u#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, f& ^. m- i2 {% d; G
# S. U: }6 e' q0 g5 |8 q/ ]& `
- T. u( O9 H) n, x3 {//upp接收、发送buffer* G0 k5 j* L: K. n& r* n1 y
#pragma DATA_ALIGN(upp_buffer_a, 8)
% P5 e2 I: a/ c7 s; T; N9 Z#pragma DATA_ALIGN(upp_buffer_b, 8)
# }% ^! ^: \6 r0 @- S7 n
3 M' |; M$ J( a7 Cunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];$ t, z. x6 G; f0 X/ ]
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
4 Q% v V- A, M) v9 j0 L
, H+ N' c+ @. s1 C2 H$ g7 s& M! L. D3 K! V$ @
static bool server_upp_data_recv(Server *server) : O. e0 p* ~9 D( s
{/ O: v' g5 X: |0 }6 ^
if(server->upp_channel_a_recv == false) {& n1 n. V' I- p) }# l% V, o
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) h* M G: ~5 R" O k6 I/ r if(ListMP_empty(server->upp_recv_list_free) == FALSE) {* c6 `7 H, B/ X
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 P7 W% i7 E1 d1 f7 n* v4 O1 T$ D9 k# f. E
. ?8 z/ c' ?, \8 J memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 a9 W* N. n% U$ C7 \' _- E# E
+ e" j# j: y8 c2 o" z, T* D
server->upp_channel_a_recv = true;//" f8 i% q* }- V B, r- Q; }( h
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
% }, [( Y$ A ]1 p* [/ v server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;2 T7 F! I% E5 E6 r1 `) ]( j
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
, T8 V$ r* w: i server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" V8 n6 o ?8 R$ l5 h- _
! a" P }$ ]: O8 |1 E; m; P
upp_error_count = 0;1 I) O2 n% `6 x1 X; S! b
upp_dmai_int_cut = 0;4 X: g# r0 W' I2 r" D( A0 T
! D# L6 S: E. Q2 v' P: _, E // fill in data
7 i* m! T5 I3 V% s: H5 b uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);: [8 a: @8 H3 I7 k
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
5 W3 x, ~ P( {+ U9 a }
6 r$ m/ D4 ^& ?# A8 E! y }
/ z0 p) [4 b3 [ else{
* x a- N, n* r- R$ ~, b if (upp_dmai_int_cut > 0){
E4 K- u+ Q9 h: e: v DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) k4 f' D5 T/ [/ B1 Q D Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);8 z/ i: q# x: j1 t
: E' m3 R9 B8 W2 ~) o/ S2 M. J% n L; Y2 M9 p7 Z
//copy data to upp_recv_list_busy
: w( I- M0 j0 d* n. L( y memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);; c$ f% e5 s# }
6 }1 {; u8 ?9 D7 K7 r
//5 w: c2 O; {) \! N) o6 E$ k
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
( N7 I4 k/ h1 m% @! x) @4 l5 r2 m1 N7 A' K8 s- F* r
//( p' Y" S4 r% U: W
server->upp_channel_a_recv = false;//' f! W' h4 V: j% o$ [
2 e: H( p- W: \ server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ y6 N7 [( A f/ H) l- N/ N }
5 }& W2 o$ J6 x Q1 p8 q }9 u$ }; v9 f, [4 L. k4 y* @
6 [4 _8 u- R' d5 R! {7 [' M
* M# T+ C% M+ Q1 ?& S4 C* B return true;5 U$ E; x* m1 Y' O0 X' ?
}
; ^4 \0 a) ^2 O6 k
4 N8 M+ D( Q' G* H& V; Kstatic bool server_upp_data_send(Server *server)( i5 i0 N3 \2 x( g2 y: R
{
7 q! i3 R: @& N" ? if(ListMP_empty(server->upp_send_list_busy) == FALSE){, e4 p& C5 M8 p0 W9 m/ @( V: r
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 o( g+ g; h8 s1 I- m
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( ?) M8 w" ?9 j. e
char tmp[128] ={0};
3 p% a/ l/ j2 ?& s
& f# C Y4 z- X* A7 z+ O server_msg_send(server, APP_CMD_LOG, "upp send: start");5 N4 k2 |. C# ?, [, k" L8 y
print_log(server, data, 64);
- X+ ^6 F' ^1 z5 O3 \/ v3 F Q V) d: R/ \; E( y- n
//
" F* e7 y; V; P3 j. V- H4 f m memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
* Z2 y' O% A6 U: S6 s" R memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 R+ ~& B& d+ O! M* O8 d9 U: c
print_log(server, upp_buffer_b, 64);; b) v8 |' e8 z$ g. L3 R
4 {* J9 G+ K$ C2 p2 K* I3 Y
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
7 m2 D6 u0 S4 q6 b0 o% I' P8 \ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
9 E; A3 U, F/ G server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
' V, @, V; M6 S% k server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 v$ c7 Q2 |# A. Z3 `* {0 R' P3 z
! A& [3 x \5 ]% X, E
memset(tmp, 0, sizeof(tmp));
. s6 h- A. V2 v0 M1 n* ^9 ^8 T: r sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + F* m3 M9 B" F% Q
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 b( z5 A' }( `8 R3 _4 T' D
server_msg_send(server, APP_CMD_LOG, tmp);; Q4 p+ g* `& w) k" {# S$ Z9 i
% U- I: V9 c3 F6 _+ Z X upp_error_count = 0;& g5 d* x& N1 Y, t& t1 `2 E; }8 e
upp_dmaq_int_cut = 0;& T3 P2 Z! Y* V3 }
// fill in data & u- `6 G) K6 C1 K. g( Q' D3 N
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 l5 f: G, W( `& S0 s. H0 L- n
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& V) | b; z/ T2 D: f
! ~8 w# v% D0 N5 V3 N
// wait send success7 [1 a( n, |: ]
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
* \4 M$ i, N6 H5 `7 s
: }3 X8 i: @& R: J F* D // make data node in free list
9 ]) k9 D# b" N1 ^( ~! L4 ]# G ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 k. N8 ^+ @0 `3 e
server_msg_send(server, APP_CMD_LOG, "upp send: success");: c8 I7 X" S& b6 x2 E
}4 J/ |- Y/ U2 @ b3 o! ^1 ^$ q
return true;- ^+ `, I8 I c! X7 i$ {! _$ ?8 s! k7 L
}, B2 I0 u2 L0 y4 u. T" a6 j
# M9 P3 M' p/ C4 v
$ f- g# F: R+ h, L2 X
: A4 R& X. O. s9 M# j; h; y n7 `' y! \; a
0 X/ J1 K- n- M% f5 q8 [
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|