|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
G- ? k" p$ p5 Z- w2 r5 @% T4 y; R+ x8 a8 V4 a* u
问题描述:3 U6 W+ P6 y b+ d3 \
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& k7 g) G. N, ]2 |7 n5 M
) l; F( L" c! R( A
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 p$ Q. b& J: j7 ~# [
- m4 T- n; ~( [3 U- X
测试结果如下:( z8 Y, P0 J) G7 y# ?5 [3 K
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 X6 p8 i6 x: Z% b3 D
: g( } i! b0 N( u- z& a
8 E5 W+ ^3 i- M" f备注:
5 D: J. s! I4 A; u# j! E1 x* x1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ N Z. H. W5 G% i
2、相关代码如下:9 Q6 k+ E' x7 G3 r8 J9 N3 p
//UPP DMA缓冲大小512字节& m4 `" b6 C9 L* T; d7 x
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- p; F& H+ Q( F- q- L#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 A1 E7 A& p1 S W" A7 Y8 i: K#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)/ [+ \% V& T8 {7 ~) F
, ?1 s9 i* S6 j+ j* b
9 v% ]: _6 k% g) u# w//upp接收、发送buffer. S# S$ d* s) ^2 E
#pragma DATA_ALIGN(upp_buffer_a, 8)6 G. J; @" M5 N7 `; n6 E
#pragma DATA_ALIGN(upp_buffer_b, 8)* p4 b9 p, p' {2 Y; T" X2 c3 X" b0 b
6 O, |# m3 q( I( ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
9 o/ y5 i# M P# G3 j. F- gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
1 F, H; m. e) S% N
/ f! U& x) n7 g" e; G( G( {: ?5 O* A7 [
static bool server_upp_data_recv(Server *server) + s+ }$ |" W9 w7 T9 N t) D) X+ W
{
) j3 @2 j/ ]8 a# y( U1 q5 [/ t if(server->upp_channel_a_recv == false) {
$ r" U! w) Y x0 V server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 @8 B) y0 i, |* z' z f/ [/ {& k if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
. E+ w" l: N5 F/ q, W6 M/ @ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 B* g- B! i" g% \$ F) W# P. p! L8 Z
, S9 f( m. W F: r% p! H; M& i3 q! e# r+ j# Z4 ^! `( i
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 T7 K6 `1 ~3 L: a% w9 i* _( M; }2 }7 N" T# l
server->upp_channel_a_recv = true;//6 |3 C5 i& e ]+ l1 l
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
: M* `: \4 { C. l Q, s7 t server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( W/ a+ f3 ~6 T A# o. r server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
& B% b) s( F# B8 m" n server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
8 r7 W2 X% n( l g3 n) C
1 X+ ^4 f! {4 I( ] upp_error_count = 0;+ [" g" j: A8 u2 |
upp_dmai_int_cut = 0;
+ g2 ?6 B- d. {) \
8 g; m8 \ ~* l; A // fill in data
, g0 r- ]/ P$ ]0 p* g1 ` uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);% F0 L7 t1 F K7 K% |
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");! D) G1 g! G( @
}
' ?$ C9 M& v! g o6 {7 D, L6 D }2 @/ r- C6 n% N. m E
else{, W! q! y: v) }# q/ @
if (upp_dmai_int_cut > 0){
1 I; V6 o K$ ?4 @3 A* x DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 h3 Y# _, J- W Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
0 h# y# x B8 ^8 r t, u# p% R
8 T4 e N+ x' _
: v9 v, s* R5 h% s" e6 A //copy data to upp_recv_list_busy% m4 [- K" h8 k+ P' l- w- [, F, M% C Q
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
) I c7 z [+ k
$ I7 M' B! L% N0 n; |0 P: ^ //
9 {% u+ U' l, ~0 y6 ` ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node); ~5 \" Q1 e) m1 `1 P' e/ ^
' l+ E. b; B0 ?
//
/ v% N& F+ w+ W- ?( ?& L server->upp_channel_a_recv = false;//
7 g5 q) x& z K5 U$ r) Q2 C
1 d% o% t0 a }1 S+ e2 y5 j server_msg_send(server, APP_CMD_LOG, "upp recv: success");
4 ^& W3 Y/ h0 }8 t) E! } }
' _# A3 D8 }3 ` }* S' ~# |" p- u) Z8 `
: l% n0 Q, o: E
* T- k$ L1 E2 i/ E return true;
5 N% f6 ]& P! I$ ~}
3 a% n+ I1 }9 C6 N- b0 |
8 [9 @2 o% D3 a0 _2 s) I( bstatic bool server_upp_data_send(Server *server). p" I* ]9 N! b5 F! p
{) U" T" K) @- y9 {9 i
if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 g) i" |+ ?7 M( c/ y! M
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
/ X( s. a" C( P! `* e3 K unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 E5 P; A3 ?+ e7 M& d5 `8 @
char tmp[128] ={0};
1 c6 }/ P. Y) q1 n& k, t
* i7 N- J' n, U, z server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 {8 o2 y" f1 e! t9 P) R! A print_log(server, data, 64);% D, k" b3 v4 B& m$ @9 C: v
3 h; H7 d C4 z. |4 F
//
' ~+ z) a9 m% J" I2 `8 d, R0 O memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 v2 m3 G$ r+ ] memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 ]2 w- g: K t. J/ N
print_log(server, upp_buffer_b, 64);. }5 m2 \$ L" N# Z# D$ h6 Y: L0 r, f7 y
/ Q3 E$ B7 G4 q' m0 H" N% S% `3 y
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);. t3 E8 N/ c. o8 O
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; - O: R e+ n: U& d
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
1 N) A* h) f% Z& [! E7 A; i server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, t/ F: I& ^2 ^" z) z3 {
m8 d5 S1 X3 P9 z: h1 [
memset(tmp, 0, sizeof(tmp));4 C8 v+ {0 s( m, }7 z8 _& L+ {
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " c6 N* q$ Z' z! S. D1 u6 F1 P0 P8 ?
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( g1 a7 `: A3 F2 O
server_msg_send(server, APP_CMD_LOG, tmp);
( w& o7 `5 H, L& I1 p
3 ~0 P* w5 R* @3 x1 }, [ upp_error_count = 0;
% c5 M! w& U$ m# m/ l upp_dmaq_int_cut = 0;
# U1 l i( O" W8 [( Y // fill in data / d7 A) y2 _2 B2 a
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ M# Z# b$ I- B! b5 v server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
, V* b3 S4 S& J7 e0 }3 C5 H4 F) z! H, A) [6 b) {' j* v/ t3 {
// wait send success5 A7 X* y( b1 i- Y$ N: e9 e2 g
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
3 S) p h, ~0 m
L6 e c- P7 N/ r9 p* |6 n // make data node in free list 3 N( s7 l% B" ~$ N5 ]4 ~* M
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# B$ `" @8 M9 P6 `
server_msg_send(server, APP_CMD_LOG, "upp send: success");7 f) ?7 E$ b( ~$ g
}) e8 p: B3 \9 I' r6 a
return true;% F. B/ q( U. `. s; q' q r1 S. G6 ?" t
}! i& o. H+ k* d3 l' {" G
Z' x7 C Q; [% \
3 f x% |$ G! L4 h
* g; @- A {, R+ M! J1 X
& }+ | l: J* w: Y5 I# S( z* h, i1 Z. ]! ^
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|