138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5738|回复: 1
打印 上一主题 下一主题

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 N4 h: G; X/ T. {
: G# d6 z) ~# ?( q  {
问题描述:: L) O* p5 a0 O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 X: y9 M8 n( [. B) P$ `
% l2 D. {1 c% k+ K0 Y" w
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
9 V5 {& Y+ |/ b4 n* e% Z9 I# k' M/ q5 P
测试结果如下:2 P) g+ a* c: S$ p9 b
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 E+ S, H- G, @' }) {" m

+ {6 `1 h# c8 a' d- j) b: u6 L" _% X" i$ y% ?8 t& y
备注:
. u+ H$ N. \" M1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
( K/ j2 o) ^/ Q, i
2、相关代码如下:- F' ~( _7 ^7 Z6 J
//UPP DMA缓冲大小512字节) C: ^' |0 m5 o# s( L, c+ P2 A0 Z
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍* C( V$ H3 Q7 ]
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" A1 z* v" t& G' o& `8 N: i3 y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT): q/ q/ L# x' x
) j: x2 Z& r* S8 i0 o
5 V& C( W+ {/ C( ^# a) X+ r7 m
//upp接收、发送buffer: |9 c0 M* {0 Z- |) @" W, l
#pragma DATA_ALIGN(upp_buffer_a, 8)
) [6 G# t6 r5 o#pragma DATA_ALIGN(upp_buffer_b, 8)
9 ], ~( [5 F' P2 l3 q8 `
$ K# D: R* ^. r( N- Lunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ B( c9 t: |/ G
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" q( J" R' Y3 f) _2 q% o

( g6 l" h5 [& O$ k5 C5 R+ S( T) H6 B: A6 Z5 ?# i, @
static bool server_upp_data_recv(Server *server) ) X& D' l5 G' \6 e
{
$ V3 m; `. v2 d0 j: O5 ^5 A, x7 Q    if(server->upp_channel_a_recv == false) {) u, M7 |* Q- C1 ?! w  f
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& B1 R+ _4 _5 Y. ?. {) i: A5 C        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
5 l6 c& v0 {. o# l& n9 J$ N9 l% a            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");, C6 j( U. H5 A

8 ?. O3 T/ s" M3 Q3 N! s" E' [
/ y7 x7 `( B) B$ h            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' }9 l5 H9 d6 J, x& u5 C9 X' ]* \8 F8 U" T) Y1 X" P/ B; @
            server->upp_channel_a_recv = true;//* D& {% ]: _7 s& {
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);+ Y. F7 ^/ X( `- w; u3 E
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
/ V3 V% Z# V# k5 Z& ^  i. o            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
6 S: V5 c9 r9 q5 ]            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. a! |9 E# t1 ^
) a. N0 v" A) t, h) g            upp_error_count = 0;% j: w6 q" g4 R5 I! K
            upp_dmai_int_cut = 0;
: v+ e; L% m/ E
, j1 F4 o) n* E$ F0 d% [            // fill in data
- V* x2 h7 o- A/ i: R            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);* ~# j7 C! k# y/ S0 ~8 L
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: z5 |& @' |) F8 m( Z        }
2 N' L2 w- E. S& m    }+ ]; r' k6 D/ c5 D( J
    else{6 K9 e  N9 B" G
        if (upp_dmai_int_cut > 0){
& s; ^1 P/ ?; w0 @( m4 a! k            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 f' Y3 y+ g6 Y4 E            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 y: P/ c+ \' I) c' V% Q
9 `3 `6 ^2 X  Y2 u; U; P5 S! H# d, Z! A
$ Q; J. @0 `% K5 {0 i
            //copy data to upp_recv_list_busy
: a6 M6 Z0 s; F; {            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
. G$ a6 f# m9 }! H. \: D" n* @* J! @' |8 u- v) v& Q
            //
/ k- C1 P' L4 t* i2 r            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: q/ c' s+ _5 X0 _
. l) W' [* |4 h( M            //
7 i* ]$ G6 N& N/ m2 W            server->upp_channel_a_recv = false;//; ^* t3 L: `) ^3 m

, f" R2 x! a% L: c6 a( [' S" u            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& Z( |  e4 e3 I- n8 T5 l. u        }
" _* c8 M# h2 h# x! q, Y: ?    }
: ^3 i8 x+ i5 @. I" P! X+ ~4 S1 ^: u+ k  d  M; P! g7 c/ D

4 C2 i' E4 B  q: {    return true;9 j1 Y. H8 T5 c. G( b' g$ a/ l; {
}4 Y, T2 A6 d. @  Q/ n( Z
' J2 K8 U* o% u# D. L
static bool server_upp_data_send(Server *server)& D  r: @: `5 H! f
{9 R) E0 n: m* f. N1 `/ |
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){' F9 j7 `1 x' k1 d) E
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' q8 N9 a# `, Q- h( I/ @        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
- k1 p$ ?# b; C; g" G, {        char tmp[128] ={0};$ m. A/ W2 M* c. V

2 Q: ]6 c% |# }# N0 S        server_msg_send(server, APP_CMD_LOG, "upp send: start");
9 ]; F( l. }& d        print_log(server, data, 64);
/ \# o- k; L5 y! |
8 o" g" v$ G# N/ f        //
% \! @$ z! L8 Y- k- t; T: B        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);/ g, G3 S4 h# ^3 S+ X: B$ P! }" R
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);4 E( E) P; k1 s$ j* k. x; g* O; R
        print_log(server, upp_buffer_b, 64);, N$ d( O6 G, ?* |* J; K' s
1 D+ j2 }1 V8 `( e5 s6 }) c" m
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);4 M" T1 m; G! X1 C( O3 d
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; , a3 }9 D4 Y# A2 ?# y1 w: ]; s
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;- {. H( S: K8 ^, q; I
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& l- a$ d2 w- h2 X4 _

- S; {4 D3 h- J        memset(tmp, 0, sizeof(tmp));
1 Q& G  ~0 e! v; A' W        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( A2 N- ^' z! i8 c+ |: r            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 k* ^8 o, S% ^+ g" \
        server_msg_send(server, APP_CMD_LOG, tmp);
. @  w, y0 s' P& u# w7 P- B8 R3 o3 r( \* p6 i1 E3 s1 ~; c
        upp_error_count = 0;" h" _0 T! I& ]
        upp_dmaq_int_cut = 0;
: E0 {$ K0 t( F. D/ w        // fill in data
- B* F' a# @( E/ I( x, Q        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * Q0 z$ v$ E2 v# j! ]
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 O& z0 E: ^, K9 h& h3 f3 @1 V8 v/ ~" |( q' ~/ X. M
        // wait send success
5 d% V# [4 Q1 J( g. V8 ]9 ?        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 5 Y) X5 i' [& }0 q
( b( P$ p2 b' `1 Y8 i' j( H8 Y: D3 G5 |
        // make data node in free list
* x  ~& L6 o  d8 q) S        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: N; }( ]0 I  R7 b( m$ \
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
& H  u+ G, n+ Y    }( W4 n* O+ r% c/ C' z1 E6 U! ]( c5 A" k
    return true;
: q7 E( k5 K- T/ y}5 L5 d1 \" W% N  b$ h7 M

. O1 n9 x* s: a) B! W- R. a1 [

) |  Z2 i/ u, j# k' ]9 [  U  r/ b8 q  _9 B* d% v: |( w8 u
& @& L6 u* x0 ]: R; l3 ^
" `# T! p/ v! U+ x9 r) F+ W, h

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
  P- A# L$ k. o; `* t# u+ Z' L" C, q" O

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-8-3 15:24 , Processed in 0.063037 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表