FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这... - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6966|回复: 9
打印 上一主题 下一主题

[未解决] FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这...

[复制链接]

9

主题

35

帖子

155

积分

注册会员

Rank: 2

积分
155
跳转到指定楼层
楼主
发表于 2017-6-26 14:26:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?3 r: H0 @& Y$ E2 m' Z8 R! R/ R" d
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:. W& V1 Z! B9 @) Y, f& w, t
u32 UPP_Isr()
+ u& P  r, p" Z( f) u{/ n  ~( ^8 |' X- d- o: D
    Uint32 intr_status = upp_reg_hdl->UPIER;$ e: \' n8 O7 `
    upp_reg_hdl->UPIER = intr_status;//clear
" U/ ]* X- c6 L" T1 L- O//    Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");; b; Y+ S$ g. ]& |8 F* r
    u32 ret=0;
$ _) U3 Q' G: C: X% r" w; g; L% e* j! |' p: j  ]# S# |  @
    // inline functions
& u6 T: |5 }! Z( e" y# \5 P    while (intr_status != 0)
5 o5 w5 h( x( y/ w: L& _  h/ y& o    {" R+ [2 d3 A4 m. F! w
        if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件& ]3 `6 b3 m1 r& N
        {
, _2 B& S, s. K# ]7 y3 B7 N6 j# j//            Log_print0(Diags_INFO,"eoli.\n");
( `8 h# Z" o+ P4 [            upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
7 J/ z7 D& N+ w2 h8 a, }8 {        }3 B5 e7 Q/ r, I

) @% F7 t7 {; g2 ?        if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件( A" K1 d0 P  C# C- u
        {
+ ^: M6 R% N- x  C1 t5 x! v* F% }            Log_print0(Diags_INFO,"eowi.\n");( S% b; R9 N7 h' L3 w3 s% D: |
            upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);5 l% D4 Z% Q. F- r) B# i7 z
            upp_interrupt_count++;
+ A. X' a2 o  }# T, t! u* B% J            upp_interrupt_eowi_count++;
' L" k% I% T' C1 {$ c7 b4 {, y  A  |8 P, e# _5 L+ X& O0 p
#if UPP_DIR_QI==0& c% J5 b3 ?  Q9 y0 [- M
            upp_dma_receivestart();
3 h) h$ F1 n( f+ V4 e! ^2 q            ret=1;2 E$ W' S- e% B0 a$ g# c
#endif
# @: g4 X9 e% k: E5 Z        }* s$ @6 J* [3 X& x) g# `3 q: z

+ F9 m1 E: q8 |% g% @2 m. n        if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件1 b  P5 d* e. c5 N5 k+ W4 C- {$ [
        {% X" E# o, s/ t8 C2 p6 o6 I7 U: w6 v# E% h
            Log_print0(Diags_INFO,"erri.\n");
0 H: ^( N! Q/ C9 V5 _3 I            upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);# R! G' B7 L  p0 _& P6 S
            upp_error_count++;
$ c7 {( C8 M$ Y! \# I5 R1 y8 X* S        }
+ j; N! {% |3 H' @4 a& X, @+ ~7 e. w, a) j3 w! K1 Q5 M5 B1 J
        if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件6 q) Z$ P) t9 L+ S+ a9 a& [) w
        {4 W4 J) G( O, m
            Log_print0(Diags_INFO,"uori.\n");
' Z1 H4 o4 l* R+ s3 y6 z( a7 o0 [            upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
% V/ X( q2 O' r' s8 {- h            upp_error_count++;
9 o& X% @: W. T( o1 C2 U* U        }
4 O7 @4 Q7 a9 ^" r5 _; B3 p) k. x6 c6 q3 a7 N% w% O- S
        if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
3 c5 j. g% P6 ]; K( l- R- t; K" L        {
+ @0 V1 j5 b: I% ?0 U            Log_print0(Diags_INFO,"dpei.\n");
9 Y! H% h3 g# h$ t2 w) X            upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);9 i8 M; a: ~( E0 P" g, [* j
            upp_error_count++;6 [) E( ^* a% w
        }
3 H3 [6 x7 K: m. r7 t  o3 m
% p, \; r# I% q& Z1 l0 i& m" n        if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)/ p* I1 {, @6 V5 A* ?
        {" L# U3 b  s/ d+ b8 Y8 ~
//            Log_print0(Diags_INFO,"eolq.\n");
0 ]; S- V$ b2 _2 {1 x: u            upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
- J$ H0 P% j; t5 ~# b# ?% D, v' g9 }        }
  w3 J" y+ v2 s4 O/ t' ~1 M' C1 `7 t+ h3 h* N& P' F+ m+ q
        if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)5 T  G$ L# Q. V: q$ `# \
        {
8 e. V% z: {, g$ p+ ^//            Log_print0(Diags_INFO,"eowq.\n");
2 y5 n( ~2 x- a            upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
: u" v/ G0 q8 N, U' o$ ]0 A% \            upp_interrupt_count++;
1 @' i! t5 \# ^  ^' m#if UPP_DIR_QI==1
  z4 Y# z7 }  ~, T: e! y* t4 l# y            upp_dma_receivestart();" G- g- `* h7 C+ ?* Z7 t$ G0 C5 A
            ret=1;
: d( F6 e& d- q: f1 f#endif% O  }* w% Y) l: A
        }
# N! _8 n( M3 L1 R
0 ?! o: `# V' V4 d8 K; X        if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
5 |* e' f+ q" ]: g  e6 Q; m        {
2 V, u) D8 V4 F, D4 `3 _, P2 `            Log_print0(Diags_INFO,"errq.\n");
, r  {8 v' u0 R8 T1 ^7 q+ n            upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);& W% O3 d" l" c- s6 D  l, X6 ~* o7 u
            upp_error_count++;# ~" t! Y5 W8 J% @+ q3 k7 V" f' ]. D7 A
        }
. _/ ~2 x5 W+ k4 K" W2 k8 z& A* B
+ c3 M- _) g3 Z  v- n  X2 E! H        if (intr_status & CSL_UPP_UPISR_UORQ_MASK)2 N8 R- g4 o" d: V& a
        {
* L5 m& G, H7 G# \2 r) d: H# E            Log_print0(Diags_INFO,"uorq.\n");; N$ g( f1 K4 {8 a
            upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);$ L' L. P6 G5 b: s
            upp_error_count++;
& i9 q5 `1 m1 w  G1 ?        }
) A- ?4 S# S  {$ p& v0 C- f" m1 u( x" a/ u9 X; T+ P
        if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
- y+ O* A7 X# q4 b* ?        {
" K$ A" F/ p+ T+ h            Log_print0(Diags_INFO,"dpeq.\n");
6 r: d7 H  ]9 z9 i/ s            upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
. h  z9 S; G! M            upp_error_count++;
9 |/ J0 a( ]" T2 ~; n        }
2 E  `$ N6 F; K4 d- p7 t* r4 ?- V7 i  G7 E8 G5 N
        // make sure all interrupts are handled: `0 a+ V" x' O0 K
        intr_status = upp_reg_hdl->UPIER;2 D0 H; [& s8 [: i3 H
    }0 @2 h  R8 b- v" s" v
1 k$ {8 M$ n: p( y, ^$ c: ^) Y
    // finally: write 0 to EOI register
' W# J" h9 l$ F- _$ ^* p2 l& {9 o    upp_reg_hdl->UPEOI = 0;
3 m* U6 T- R' s    return ret;$ I: r( `- I& Y' T
}
1 A0 P# q8 i* z0 D; T5 J" Ndsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
+ K. g$ P: E6 X: }7 O/ b#define upp_dma_sendstartQI(x)     {\
" Y. T0 S/ G, M# `# Q% v    Wait_upp_SendReadyQI(x);    \) E5 w1 V# _& w5 p; u
    upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend;      \
# s! C; b4 T* A, o6 r; o& Q* w    upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32);   \! m8 k: G% h" ]  f( W
    upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
1 E" R/ H1 C/ K/ i! N    }
; L* z; g5 O4 A7 h5 i' A* ^) \' W
' w% ?4 c1 q/ A
% P9 t3 W/ l! D#define upp_dma_sendstart()     upp_dma_sendstartQI(I)9 h( N, X" [8 n4 R3 i. H! s

7 e2 \. `7 f# K7 H8 e5 H

, }6 C3 {! v, \" C' W  u9 s) ^- h想知道uori错误是在什么情况下面出现的,好做出修改。
  h+ s& p6 ?6 k8 N( `& d

5 M8 V$ `- O& ]3 z% v  k* U
( Z; ^9 [% E$ [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-6-26 21:47:42 | 只看该作者
明天发你例程参考一下。
回复 支持 反对

使用道具 举报

9

主题

35

帖子

155

积分

注册会员

Rank: 2

积分
155
板凳
 楼主| 发表于 2017-6-30 15:14:51 | 只看该作者
不好意思,我没看出有什么区别,或者哪里设置错误了。不知道您的这个工程有没有试过dsp端40us周期性发送512字节数据给fpga,fpga不定时发送128字节给dsp,会不会出现uor这个错误。
回复 支持 反对

使用道具 举报

9

主题

35

帖子

155

积分

注册会员

Rank: 2

积分
155
地板
 楼主| 发表于 2017-7-28 12:00:14 | 只看该作者
1、dsp初始化upp设备后,在没有发送数据的情况下,dsp使用的upp的发送端start、enable信号一直是高电平,这是不正常的,应该是低电平才对。0 }! K) I2 N9 z9 u2 u7 r# \- ~( W

, o) f' ?+ }' w% q) J# F& B2、在启动uppdma输出后,start信号的高电平有点长(如发间隔为50us,start的高电平达到45us,低电平才5us;start信号不应该是比较短的吗?看手册画的start信号是一个很短的高电平),而且enable信号一直是高从来没低过(数据传输完成,不应该降为低电平吗?),这是什么原因?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
5#
发表于 2017-7-28 16:38:03 | 只看该作者
出现uor错误,操作UPP过于频繁或者系统负载过大,可以尝试降低upp速率,或者加大upp的数据缓冲,降低upp操作频率
回复 支持 反对

使用道具 举报

9

主题

35

帖子

155

积分

注册会员

Rank: 2

积分
155
6#
 楼主| 发表于 2017-8-1 17:36:17 | 只看该作者
重新对着例程重新初始化upp设备,目前start、enable信号是正常的。目前是:发送数据有1*512Byte字节,每40us传输一次,接收为1*128Byte不定时FPGA检测硬件状态后上传。想问一下,TXSIZEA(B),RDSIZEI(Q),要怎样设置。试了各种组合,甚至将单速率传输由37.5Mhz降到25Mhz,upp的uori(q)错误一直都有发生(发送端)

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

9

主题

35

帖子

155

积分

注册会员

Rank: 2

积分
155
7#
 楼主| 发表于 2017-8-23 09:10:04 | 只看该作者
在网上找到关于uor错误的说明:https://support.criticallink.com ... sign_Considerations
回复 支持 反对

使用道具 举报

9

主题

35

帖子

155

积分

注册会员

Rank: 2

积分
155
8#
 楼主| 发表于 2017-8-23 09:28:20 | 只看该作者
当我们按照这个文档修改了uPP的发送时钟(syscfg0.syschip3修改为0,0使用pll0_sysclk2),这时uPP就不会有uor错误;但是由此又产生了其他错误,因为使用async3_clksrc时钟源的设备都出错了,如图:,影响了timer2/3、uart1/2等设备。我们整个系统里面使用到了uart1/2、spi1,其他设备除了timer2/3都用做普通IO脚或其他设备去了。
; O' m. |1 n6 d8 n# |1 \) h7 R; H) y
/ f/ h6 q' j4 m. j. h
+ M" Q1 t* c9 G" t- V( Z2 N! e  [

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

9

主题

35

帖子

155

积分

注册会员

Rank: 2

积分
155
9#
 楼主| 发表于 2017-8-23 09:50:12 | 只看该作者
然后我们就想自己软件层面根据SYS_CLK_CALC_OMAP-L138_C674X_AM18X_v1p3.xls,把我们系统的时钟计算了一遍之后,根据我们实际使用的时钟,在设置upp的发送时钟源时同时设置uart1/2(修改DLH、DLL)、spi1(修改spi_fmt4的prescale)设备的寄存器,这时这些设备都表现好像是正常的。修改代码在dsp端执行:" ~7 }* S* O' W* P
6 E1 U" w7 R" V% Q7 {7 J1 V
1、如果在程序启动前使用SecureCRT.exe这个连接了系统的uart2,这时候输入是乱码的,需要断开重新连接才表现正常。0 Q( B" @2 @$ K! P8 A0 q' z# p6 \
2、如果此时重新初始化uart1、spi1等设备时,这时候uart1的DLL/DLH寄存器就会按之前的时钟源重设了,spi1的prescale也被重设。
: H  l1 t" _3 m; J2 h9 O. e7 Z. J" B: v
所以,软件层面修改是不行的。现在希望就是linux系统启动的时候,自动将upp的发送时钟源设置(async3_clksrc)为pll0_sysclk2,同时将跟async3_clksrc相关设备使用的时钟源的频率值修正为与选择的一致,这样避免重新初始化这些外设时由于使用错误的频率值造成系统初始化对应寄存器为错误值。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

9

主题

35

帖子

155

积分

注册会员

Rank: 2

积分
155
10#
 楼主| 发表于 2017-8-23 10:00:32 | 只看该作者
dsp端修改时钟代码:5 Y, G/ ^9 ^! L
6 c4 C1 Y. j: d# w% y0 x0 @
    //设置upp外设时钟源 pll0_clock2
& c  M4 s) l. e) A: z8 w    u32 temp_reg  = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_CFGCHIP3);
* @8 J9 m) k4 A) G- _' W    //uPP时钟源不对' P" j* m/ |# c9 [2 _2 q
//    if(temp_reg &(SYSCFG_CFGCHIP3_UPP_TX_CLKSRC | SYSCFG_CFGCHIP3_ASYNC3_CLKSRC))- l# V+ a) B! E' E
    {- v( @7 S4 l8 [3 j' Z: O
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_CFGCHIP3) = (temp_reg & ~(SYSCFG_CFGCHIP3_UPP_TX_CLKSRC | SYSCFG_CFGCHIP3_ASYNC3_CLKSRC));: ]  K7 ?+ }) x7 f
        //影响spi1,uart1/2,timer1/2等设备,重新配置/ T# W3 S9 Z% S
        //uart1,TS211的通信接口,使用38400,重设分频寄存器
- T. A# A+ v4 C% o" N! P2 U) r: Y" D        HWREG(SOC_UART_1_REGS + UART_DLH) = 0x01;
; \1 B. [+ f/ M4 f        HWREG(SOC_UART_1_REGS + UART_DLL) = 0x73+1;
) P2 Z2 g1 w* ?( Z8 t( C& Q, n5 U6 |        //uart2,linux的通信接口,使用115200,重设分频寄存器4 h7 B4 p# [' }: M8 x$ O
        HWREG(SOC_UART_2_REGS + UART_DLL) = (0x7B+1);! x: Q4 i" C4 D* ]% \8 |
        //spi1,arm与fpga通信使用6 Z3 d. i4 I) [
        temp_reg  = HWREG(SOC_SPI_1_REGS + SPI_SPIFMT(0)) & ~SPI_SPIFMT_PRESCALE;
. X7 J0 p8 T/ n5 X" a. s        HWREG(SOC_SPI_1_REGS + SPI_SPIFMT(0)) = (temp_reg | (SPI_SPIFMT_PRESCALE & ((27)<<SPI_SPIFMT_PRESCALE_SHIFT)));3 @+ |5 m) r6 w( J( |# e
    }' v1 M7 f# \2 X7 y4 g  T! [
0 i1 X+ @5 O+ @# B
uart1/2时钟图(分频值需要+1之后分高低字节填入DLL/DLH):
; J5 Q3 L9 F* i/ N" b% A0 I& q, f4 |
spi图:
& T& n3 v& s8 s, w& t
6 d, F  \3 U9 i: k9 W

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 19:49 , Processed in 0.045456 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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