138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : b  H( P( m7 |% W; F7 m
$ c+ W$ ~. P" E: t  f, P$ j% e6 H
问题描述:0 d* K/ ?. x. _6 \* X9 k8 c0 u  m
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
& Y& Y# j& i( d8 h) [% G7 E# n6 H8 l
. r* |% A" P9 d2 `+ J7 G图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
; _% ~. E8 b; ~- A' h% @8 T+ f/ M2 L0 S* b0 p
测试结果如下:2 Z6 H4 m+ i# l/ t; \4 |0 p
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# k7 @0 n% E& t7 L  d3 ]/ N; o  f/ n) I# I

0 y6 R) y! W* N* }& n9 m  P$ z2 `8 ?) B备注:
. q. A# y9 \- x! J+ j1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 B, b' B; H8 G% M. x
2、相关代码如下:3 U/ d8 p4 X& V$ U
//UPP DMA缓冲大小512字节9 }8 x. d5 e  a2 I; o: D
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; S- j% x5 R& k6 X3 R/ d4 f6 d3 D( B
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT& ]6 @1 e0 k. g
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT): D9 O! Z) A7 f! L) ?4 V' V4 m4 M

; `4 j9 e' A) h: T/ ~/ C6 l$ G+ g3 J- E1 S* |' y( g
//upp接收、发送buffer
* H6 [8 r0 ~- M' C% {#pragma DATA_ALIGN(upp_buffer_a, 8)  ?: E) Q0 `$ d0 o- o
#pragma DATA_ALIGN(upp_buffer_b, 8)
! n( @# `6 H  N( m8 U
7 e1 e! m0 x- M* {8 L( junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% F+ b# s1 f/ x  dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& D! y, b; l3 u5 A* k" w# e

1 C7 p* O6 {4 j$ |- @8 D- [6 _- D9 j
/ C3 Q8 ^& `* {5 pstatic bool server_upp_data_recv(Server *server) # }; c1 H, f, Q+ o' d9 C
{
- F4 B1 M% |' |    if(server->upp_channel_a_recv == false) {
  O5 r% i4 L" I% k8 v0 I( H! V( \        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' ]" i0 C; ]* R! {: K' [        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {* h0 {; F- t9 `. D  ?: x. [
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 [  H- g! [8 T! z! Q( `+ |* \
( d  b9 H1 ?; {- l! x  p2 n
9 f1 J* X9 _/ h! d) v: i& }
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  e! a* V. n* s# p$ U+ Q, e. ?% k6 B

) c8 i6 ?5 U2 x# V" l& S1 l            server->upp_channel_a_recv = true;//
4 t# W" _. B+ ^% ?  j# ?            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
: V( J$ C" U) j5 ]* m            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
1 Z3 o: |* {# H$ `& y1 _- U8 ^! A            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;2 E: f% Y! U6 F& _) a  C
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ @; K( |  W, @- @) W, J2 u6 \" t- y

, X' z: J2 ]9 s; D5 ?            upp_error_count = 0;# C& w: P1 U5 e, T" X; E
            upp_dmai_int_cut = 0;' N6 D2 K$ y4 o1 V5 x+ D

. Y7 B6 X7 \! ~6 ^, _  u, H' h            // fill in data . z" P9 O2 r% h/ h. V
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# t  ]- _- ], v* M1 s6 M
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: w( {& H+ z: p) m( G& {- J
        }
6 D+ D. X' w) O0 Z. Y0 h% B    }! D1 k1 \3 y1 ^$ U7 J
    else{, N' }9 V" {9 B
        if (upp_dmai_int_cut > 0){
/ Q* y, }/ P6 U6 v9 M1 @. S            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);/ E9 Z" d. R0 q$ T( q. L# K
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 m3 ], n  l; m. a5 H
( j& B. C9 W6 q% c" p) `' e* f! c% L, |! Y) X- H( i
            //copy data to upp_recv_list_busy8 M7 t4 b- ]/ i: D
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
  B/ C) W9 o( F4 a6 i/ i: |! [$ T1 V! e0 o" ^; F; I
            //
9 }1 H$ o/ P* E0 o  N1 ?! W5 ~9 Y2 [            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ B# ?2 T/ s& s7 x' H5 s' Y
$ d0 |( k: ~6 w
            //
) P! k6 K7 k1 C8 s1 L4 B: `& Q            server->upp_channel_a_recv = false;//
1 v/ v  d5 g. n9 Q7 C7 |+ }
4 c; c$ L1 l1 \% b2 K: h            server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 a4 i4 T3 l* i! `% {
        }5 J5 r! b: f$ C0 T4 |& g
    }
8 d- s" v/ P' z& |% {* w
5 ~  @; `3 j3 L8 C7 M' T2 Q' m2 Y
1 ~8 r- V  ~& y, O8 q5 N! {    return true;
* w) J5 y2 m' u/ L0 O' ]" G# |- I4 a}
1 D% t$ X) w$ L* Q" n  n4 U1 R+ E! x! r
static bool server_upp_data_send(Server *server)8 d# q' H8 b, j# I
{
) ?0 X1 y4 k# S$ Z% _- X4 {. j    if(ListMP_empty(server->upp_send_list_busy) == FALSE){3 K+ z9 X% p4 ?" @/ ^
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 r* ]/ O# V) c' c# ?
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! b) M* \  j. F+ ]3 R( D        char tmp[128] ={0};
4 l6 G/ m# G$ Y9 d, k8 C6 g/ A# c) o
        server_msg_send(server, APP_CMD_LOG, "upp send: start");$ U: J( v2 C0 P4 I4 J* i& R$ Z! ^
        print_log(server, data, 64);
! a; Y: l4 L# u$ [0 L- d2 E  L* v( [9 ]1 U4 _
        //' h/ Y7 G2 `9 I9 ?+ K7 ~, }, g
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 o, B$ W) L! Y        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);' r! u. p4 L8 ~( O& S+ p+ V
        print_log(server, upp_buffer_b, 64);
! u3 J+ N% G% r! `) x8 w/ P: b" Y3 L! B3 e
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);: O/ K. N2 |8 m' b( D
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ' P. q7 Q: B. A  I8 o/ V
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;  |$ _( `6 J! {, y
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# ~5 m$ P4 F7 p

: U: E& M# d  N# {: X6 T        memset(tmp, 0, sizeof(tmp));
* k0 f% d) I, I0 @7 I( p        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", , A& G) R! x( `1 ~3 |
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);& T7 g6 O/ n% T+ J& ~. r  C& p7 z, Y
        server_msg_send(server, APP_CMD_LOG, tmp);
3 \! T6 J2 _: C- ~2 G) ^; |+ ?
; Y$ W4 P5 t6 A1 n, ^, P. y  m        upp_error_count = 0;2 y$ n7 D. h' V0 J- g' ~2 ]
        upp_dmaq_int_cut = 0;7 r1 a6 B7 W: U7 B# L5 t
        // fill in data   M4 L: N( E& o% `% g
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
$ M/ H, ?: F) U& P        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
- ?$ Z7 L9 X. \! m/ s1 P/ @4 B3 w' x  E6 p1 N) |
        // wait send success
: v; O! S/ I9 M( R( H        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& U' p; L6 [+ J/ S4 ^& U$ b" e" \; S8 `& |1 w" L2 J
        // make data node in free list # s6 ^  G7 A! w
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. F# K/ t& p8 v& @" ?# ^% ~        server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 S+ H$ r! G' a* I; ^! m    }4 h5 I5 g8 A, T4 q
    return true;
% P! _. ?7 Z- r# U  r5 _1 @}$ @- D  V: x- T& l2 O$ \* z2 o# W1 i5 U7 S$ l
, i/ X) p: x: I

) ?3 R$ v9 }7 y( R3 O* m# Z& F5 p/ V/ B2 L

2 [' z9 D8 \  M* k" _7 [/ I" \( H
- q' V/ U: t* I: s8 R

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
0 `6 B/ l9 H3 B# `4 H4 k! {" p/ u: `

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-24 16:07 , Processed in 0.043090 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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