McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5446|回复: 0
打印 上一主题 下一主题

McBSP时钟、同步、数据线不正常

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 P; u# @: Y" C- k6 P3 C- s+ `" X
/*
/ I' p3 V7 A$ b * Copyright (C) 2009 Texas Instruments Inc
8 O, a% v) y  u *
" l/ X( i" K2 g$ B  `5 z- y) C * This program is free software; you can redistribute it and/or modify7 \6 E$ L* ^; ~! G5 a- ^
* it under the terms of the GNU General Public License as published by# q) g; J% e8 m# a8 {2 p
* the Free Software Foundation; either version 2 of the License, or
9 F% G" R0 q, J, U! u2 w  t3 H * (at your option)any later version.
0 P+ ]! u( I7 ]5 n, I7 v2 x *# C, H6 q: ?3 |) d
* This program is distributed in the hope that it will be useful,& W2 b) R7 r  R4 ?  J
* but WITHOUT ANY WARRANTY; without even the implied warranty of  d/ S! b0 ~* D) T. a2 }* Z  {
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 S9 s9 u9 V* B- i) f% r
* GNU General Public License for more details.
' @' d2 Z4 L2 N1 R- w8 u% ? *
4 a! `8 i; G( d9 C; e# ^: g * You should have received a copy of the GNU General Public License2 H" K9 u. f: l. N: F$ b
* along with this program; if not, write to the Free Software* d. i+ d" J" b  a: ^- U* H: z1 v4 r0 V
* Foundati
" i) w) j7 n% }8 K1 v*/
0 R# g9 R7 ]" `$ m/ s; e6 O5 \8 a5 @#include <linux/module.h>
" F6 g6 x" P, P. U  R7 G#include <linux/init.h>
! Y9 w- L* U& e+ ?8 d#include <linux/errno.h>
( k8 ~' Z, l$ ], Q! \) X& l+ u#include <linux/types.h>% @5 _8 E  t0 j2 H+ \8 c
#include <linux/interrupt.h>
% z6 r8 A, [7 ^* s#include <linux/io.h>
/ P5 E- z0 K/ h6 W9 {2 ~#include <linux/sysctl.h>
  p  L5 b" u8 A3 |- S9 D% I8 @6 h#include <linux/mm.h>, |8 S; ^: I  T2 k! h' _1 {
#include <linux/delay.h>, y" y4 X; Y' Y# F5 t6 X% w7 i
#include<linux/kernel.h>/ o( g1 {1 K1 h, p* E" X3 a0 J
#include<linux/fs.h>6 M% L5 g" `8 H
#include<linux/ioctl.h>) ]; w/ |  g3 A! N6 M7 `  A
#include<linux/cdev.h>' c2 D' }% u7 q) N) O, S+ z
#include<linux/kdev_t.h>1 v- s# D+ Y2 s4 G1 ~
#include<linux/gpio.h>
& K& z& ]; D3 z7 a: s: F#include <mach/hardware.h>
8 H5 E0 [$ @) P& n- d#include <mach/irqs.h>
6 L, Z2 P1 i& e# d* z+ V$ e7 F
( C' G1 e1 G( N#include <asm/mach-types.h>' N8 z$ x* g, p: s, K' e& [
#include <asm/mach/arch.h>
4 {2 d" ]8 @5 A#include <mach/da8xx.h>
* s4 @, k3 }9 q+ C. R5 I# X#define  SYSCFG_BASE   0x01c14000
* X" B, y: a, b) h#define  PINMUX1_OFFSET   0x124 & y2 E- ~/ F' f' v: f
#define  PINMUX18_OFFSET  0x168
; S4 z. ^1 _6 |1 `/ a6 I/ |#define  PINMUX19_OFFSET  0x16c# o. @) ?4 d" m. B8 B
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
7 ]( j, I- i- x2 o# _#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
% e/ K' ~" N1 m9 W4 }; u#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
) S2 R# E2 V( @; B#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
" e4 U  p" H: a' f- S  }; w( `4 g4 e! y#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
2 @% @4 T0 _7 e  \; F2 @0 m                           
3 N" H- _! `( C+ X! ?#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
0 ?( ^2 s% i# `! w2 N0 T# C( @#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
8 K$ I! S0 N% O//PSC' q1 p; W4 t7 {/ j" S/ e) h
#define  PTCMD_ADDR   0x01E27120  
! F1 K5 E9 s' B$ T* b#define  MDCTL15_ADDR 0x01E27A3C2 u6 z4 I3 W9 ~: K0 P7 I5 I  C
#define  PDCTL1_ADDR  0x01E27304& M7 S* d0 r# e1 W2 Y
//GPIO8 direction
# P, d5 B: [" Z- S, _$ ]  s#define GPIO8_DIRECT  0x01E260B0
6 w( d' O& V1 H3 O' d8 J7 E8 d0 j#define GPIO8_OUT     0x01E260B4% d% H& I1 d  a+ G
#define GPIO8_IN     0x01E260C0
$ A6 S+ k* l. ~; H9 w3 d0 O. M$ K$ T! l, q! T3 @
//#define MCBSP1_RINT    99              ) I! [+ K1 g& \9 _  t  f
//#define MCBSP1_XINT    100  
' M' q1 \2 b+ ?static int MCBSP_MAJOR=239;
/ e1 C/ x/ V& L9 g4 Pstatic int MCBSP_MINOR=0;
$ X$ |5 v9 b5 l% E$ r& Astatic int count =1;
2 C5 x* U- i* r8 S% I8 V4 ?( L7 m' B5 b% |3 p9 u3 d" o+ b& o7 E
#define MCBSP_NAME  "MCBSP-device"
3 Z0 I* P( n" @; w3 c' v, ^4 e+ x) B% d: e- y8 m4 q: A
static struct cdev *mcbsp_cdev;
* ?6 i. ]4 B' F* P- S8 g8 cstatic struct class *mcbsp_class;7 t- O4 R+ h9 M8 X- s
static dev_t mcbsp_dev;
3 F. u- s) J% @& {( uunsigned int DRR_data;4 x& A- e. {- |6 @7 {" g
unsigned int DXR_data;6 ?( j0 B; @' a; X: ]' s% h
static int mcbsp_open(struct inode *inode,struct file *file): M$ O! T9 x4 i9 B
{
/ F% U) u' Q7 x9 S; r   
# z7 Y* o2 k3 {$ ~   //interrupt enable,initialized
1 Y5 _5 N: m2 Q   unsigned int temp;
" l$ _2 k) \5 {% S8 Z' `9 s   //SLEEP_EN(GPIO8[10])---0
& p6 C9 e, F' [/ t' {8 P% J   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- J, N8 f/ K7 O( ^. r% s, Y
   temp=temp&(~0x00000400);3 ~. ]1 V/ M$ W* K6 D. N. x- U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]" [( U/ G' r; T* H
  //RESETn(GPIO8[8])----0----1
8 q) i, N% ^/ g3 @7 z1 w   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 j) M6 T. Z" L' }  H  n" b   temp=temp&(~0x00000100);# w6 k" j. _. _) E
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---05 {0 j) K) d& c# m
   udelay(100);
9 B2 [, W: E  t/ G6 ~   temp=temp| 0x00000100;
5 R, e" G2 ]# Y) B& }! p0 M   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1/ Y1 d/ O+ t/ \
   udelay(100);- t" r0 z: D5 u2 u$ g8 @9 W& E
   printk("open success!\n");
  Y: _% O% q3 }: i$ Q   return 0;
' @2 D8 z; r5 k' Z}( p  `: X, m3 T2 J/ [
/ a$ _' J+ ]3 r5 E$ o
static int mcbsp_release(struct inode *inode,struct file *file)
) @9 n) a+ y# g* m+ Y8 O/ D{  X$ {( C, }+ B! w- z
   printk("release success!\n");
+ J9 q/ p8 n5 t( l- I   return 0;1 S  ]; V9 }2 ^( u
}
0 _- D" _" g* ?: J1 B2 ^+ H% @. x2 ~2 o. \7 q/ V9 ^  a1 e7 r1 `+ N
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
" l: _6 M5 w8 s2 E{0 g' L0 R& V- t9 a/ [
    copy_from_user(&DXR_data,buf,len);7 G) \+ s6 f/ D, E
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
) G0 A% h6 q; }/ X: Z3 m    return 0;9 w8 J6 J1 H* ^4 G) X

4 L* G6 n& z+ M  l' Z}: B( c% P" ~, {  M8 ~) k) S3 l

+ n2 V1 P6 {. v3 Zstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)) x: G$ U9 `3 E: V8 ~% N+ d) v
{
0 Q1 Q9 b' q, \, u   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* `2 R& l# V( q- r8 ^3 q   copy_to_user(buf,&DRR_data,len); ( `$ X" x, d3 q2 n  P, i/ }" v1 Q7 C# P
   return 0;- d% B9 l$ P0 A- g7 l/ b3 Z
}( f! ]" F1 }9 r# p

+ c+ |" H  O& P' N; n
1 @  \5 s$ X& F" f/ Ystatic struct  file_operations mcbsp_fops=
* J& S4 [' j3 R, |/ g{
% E. x" C- b0 W  H7 ^# J   .owner=THIS_MODULE,
) N+ J1 I' j. W0 I) Z* h   .open=mcbsp_open,
- Y' z' L1 K' m, i: _4 B   .release=mcbsp_release,
. j$ ]) s1 f& o   .write=mcbsp_write,
# B/ [; {4 h7 f( O9 |' Q7 b   .read=mcbsp_read,
. g* H! U3 F) l  ~( x8 d: z+ S};
! x8 `' S4 `2 Istatic int __init MCBSP_init(void)
: p3 j1 P9 I+ ?* _, X7 U7 \{
. J6 x5 p8 Z6 m   int ret;
/ C. V; C5 S# Y: q- X   unsigned  int   PINMUX1_REG_old;+ n; z5 _# F! ?4 T
   unsigned  int   PINMUX18_REG_old;0 ?( \2 Q, E: x, O) @  P0 {% H
   unsigned  int   PINMUX19_REG_old;  q) D$ ?: j8 A% Y
   unsigned  int   temp;  $ B0 t0 _! ~* i
   if(MCBSP_MAJOR): x2 s0 w/ c4 W4 ^2 X
   {' V! M: ~, L9 h  ?! l5 U1 J$ L
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
7 f: l/ l: r7 Z$ g      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
! Q3 J- X9 U. X   }
# p. d$ w$ L" L: k   else8 s4 _4 A; S- _3 J2 i9 H
   {5 p* }( H  m5 D* V. q  X- Z
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
0 Y. K2 c  d% k) p$ V4 ~      MCBSP_MAJOR=MAJOR(mcbsp_dev);* t* T+ h: L  p: [2 v
   }
" \# R! f5 ?- ^5 v, w   ) T0 K! b+ _  P/ C3 }! Z* M
   if(ret<0)( f$ }; I1 x" R# C/ r8 p3 K
   {4 M3 D! u$ d) X0 q: Z
      printk(KERN_ERR "register chrdev fail!");
9 u6 D: K* S. M5 E) E0 m      return -1;
$ z# h- z8 G) ]   }' _: _- R0 U5 H! O
   + C; s. k! F- m
   mcbsp_cdev=cdev_alloc();' D/ ]6 v) q/ N) J
   
- m$ R  i0 p: W7 _/ w$ [: w" ]1 F   if(mcbsp_cdev!=NULL); n2 A' d* }7 ?3 |, `$ S. `$ D4 X
   {5 L* h9 V: ?$ ~: {* M3 _' e
      cdev_init(mcbsp_cdev,&mcbsp_fops);
5 l9 |* Q% n# V& N      mcbsp_cdev->ops=&mcbsp_fops;  V+ l+ l0 g( X* _; D( q$ \2 Y
      mcbsp_cdev->owner=THIS_MODULE;
- I" e1 ?# G* ~5 ^1 w      $ l6 e- V$ Y# G
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
: F0 B/ t, G& ?( w8 Z$ Z6 b; O* Q          printk(KERN_ERR "register cdev fail!");, n: {6 y; s+ e- |( z) r
      else$ H- ?% _4 s1 u1 i4 [# t# d
          printk(KERN_ERR "register success!\n");
3 x0 ]8 o8 e( a- [   }
: E" s, f$ c/ F3 e5 i9 E   else8 g+ \) W/ A/ O7 s
   {
( w3 `* ^/ l5 B7 }) X* ^      printk(KERN_ERR "register cdev err!");  C: Y- a+ p+ i6 |/ O* }( W
      return -1;6 m9 H) v; R# c0 Y
   }5 T7 K8 K, T" P2 C; q, t+ G
   9 ^9 Q' D! O' K/ \! Z: M% ?. A
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);7 v6 I" |$ h; R8 N7 b" j" z. Q
   if(IS_ERR(mcbsp_class)), K2 |( D. x3 v0 X5 D
   {( |$ }/ e0 J& O( H3 P
      printk(KERN_ERR "register class err!");0 f! d4 _1 B. \) I8 q( o
   return -1;2 O# c* j/ K' p4 F4 t; O
   }
0 d: C4 c6 a% M   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
0 b) Z7 A3 P' ~* o. Y9 R. g/ I1 `
! U3 \# O& Q0 J( m: N' Q0 f  _   //PSC
  D/ Y. {, g2 A6 y: Q  n+ I   //add Enable MCBSP
' e' g% d% i! @1 w! B3 {5 n1 i   //test
# @5 F7 J% V* [$ H; o   temp = 0x80000003;/ Q" H" E: c1 X) [/ M
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));" r% r* V% L7 g
   temp = 0x00000003;
5 H# T5 x2 T6 N! p   writel(temp, IO_ADDRESS(PTCMD_ADDR));
* g! l, o: W4 H% O0 S5 k   }' n! h# ]9 K1 T
   temp = 0x001FF201;
  I! c! H6 c" [: N' C   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
4 l5 H+ P3 G7 x4 I* ^8 _   
! O5 P2 V3 v! r' K& K   //PINMUX  3 f' e+ L% ]8 S' X  f
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
( h/ @0 P0 ?5 }   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
4 ^4 U- O8 C; ]0 s   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   * Y3 a1 S7 O+ J; c/ {8 G
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);$ c9 z: N; Z" P9 U% l
   
& o$ o- z5 L" t, R( A; ?9 V   //SLEEP_EN,EPR,L138_SHK1,L138_RC; `6 G+ l6 G+ N8 {; u% i# t
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
! |7 H/ H! l, }4 L5 c$ C5 x   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   0 N- L" G2 Z* O) a# D. N. H7 ~
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);1 s6 }: g* v! l+ F) J: T/ B7 L

9 w1 K4 N8 P1 F  K% S6 P, D   //RESETn,L138_SHK22 r% x* e' @: A+ }3 b( K
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  * G% V  d* @* \" Y1 F0 v9 a2 p
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   % H0 W% Z8 ^1 s$ P3 e
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" `( B- k! h; Y& p/ }

) Y* t) X% h& |, w
! O9 A- J. ^8 g" U  //SPCR Register2 z5 N* z" t. ]2 |
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset. I* y5 x; ]) S6 i3 j% A
  temp = 0x03000000;//(DLB=0)
. B0 v" V9 X( U4 C) c+ {( O3 n // temp = 0x03008000;//(DLB=1)( a1 P" w0 y  F+ ~8 c' w
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
- Y& w5 Z7 `* e  {* V6 n9 ?  temp = readl(IO_ADDRESS(SPCR_ADDR));
* F8 @- K; w" v% \! b. y1 f9 e  printk("temp=%x\n",temp);
, t4 b7 L) z) Z1 k- C) y( [
6 E# v4 V" G/ K" y7 V9 H   //PCR Register
0 F$ P4 c4 G# D0 |4 z! F   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0. I( h6 ~- E3 P, g6 R* J* s0 X. {0 {
  // temp = 0x00000F0F;3 V5 V1 n. C( Q7 A( m
  temp = 0x00000B0F;
! H, o' I) b6 [7 n, Y$ D1 e  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
- d/ U7 ]/ ]2 k  temp = readl(IO_ADDRESS(PCR_ADDR));
0 x5 ^+ k* D: j0 c$ N: \  printk("temp=%x\n",temp);  
2 k& v$ S! j9 h# }; D- u   //SRGR Register
8 R5 E9 ]/ w8 S8 c" j   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11* R/ Y8 R& w" k3 F  D" f# C
//temp = 0x301F000B;
5 t1 ~( M7 k  l, q! }% c- J   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ' P" o* I9 k. Q/ U3 G/ p/ P# _
  temp = readl(IO_ADDRESS(SRGR_ADDR));) Z& i5 G- t( B2 E
  printk("temp=%x\n",temp);6 e1 L2 _, x  a3 s
   //RCR
% [$ y6 j5 n5 Q/ ~1 A5 e( O& T   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! |% z! V' d1 O  `7 m' E
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0) [* e) D* J+ a. O9 g8 p% o
   temp = 0x00440040;. P% i) ?3 ^, g4 r
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
6 H: `) b" z) M0 @7 M0 V   temp = readl(IO_ADDRESS(RCR_ADDR));1 b% {! k8 {& g9 f, }2 K
   printk("temp=%x\n",temp);' _% h; `: u* P6 a
   //XCR& w4 A& P6 a: E% }# y3 D5 y1 F3 G
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1$ o  @0 S5 _1 @9 u" Q: E) h# C9 k
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
' V" [: |5 f! ]2 E( r4 d# ^& }   temp = 0x00440040;) O  Y7 c+ \; s* O
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   / t3 k# c% s. g, P; i
   temp = readl(IO_ADDRESS(XCR_ADDR));
9 |) m9 _2 _; w9 l   printk("temp=%x\n",temp);
: s  H3 `3 P  K" B2 r) Y* \  udelay(100);% ?) N) R6 V& P- W( Q; x
  //SPCR Register
! B! M4 n" y& b* m% B' \- r- Z  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
. b- g; x( [! x& @  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
8 j3 f; Y' r$ p  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled# ?- W0 p. d' v; ^, q. T. u" a0 Z
  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 M4 T/ F6 x7 D- F& z  printk("temp=%x\n",temp);6 N9 ^. {1 z% @7 d
  udelay(100);/ b( K! G" o# e* B, T1 h

/ a, T, S' U' m! r8 l3 F9 `6 S  //set GPIO direction. U9 F  v# `) T, a
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));) z, P7 S9 P- o3 |( c, S$ ~
   temp = temp | 0x00000100;//EPR----input
9 o6 q1 w, V3 b3 \6 ]   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" r% p8 I4 @2 w
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
, w: J4 B8 z4 Q( c
) y. N9 e7 W7 v! ?   return 0;! L# m) \' _! W3 I5 J2 M
}' W& M) g' }7 y# v
static void __exit MCBSP_exit(void)
! t: A8 t1 W# f{! ^' O) D: s/ V, e2 ~/ b
   printk("mcbsp chrdev exit!\n");
) b4 P% Z7 Y5 O9 ]; h   cdev_del(mcbsp_cdev);
! e; n6 Q. x  h/ v" _   unregister_chrdev_region(mcbsp_dev,count);1 q, d% z2 c5 i4 l( R
   device_destroy(mcbsp_class,mcbsp_dev);
# A6 y9 A0 q. b   class_destroy(mcbsp_class);# `$ p! R- s7 A: J5 x" l2 m8 G# N
}) o' A& }; R/ O8 B
module_init(MCBSP_init);1 J3 T* N8 E8 U, _
module_exit(MCBSP_exit);6 w0 D6 i" r$ k3 Z  V  [* u
3 L- t0 S, [# s1 f
MODULE_LICENSE("GPL");% Y) m8 t, G+ y% ^$ D  I

$ }% u* Z) |" o1 j# ?我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
, v& J6 O- \3 M5 k4 ?我的应用层的测试程序如下
9 ?" y$ I. R' m$ i3 i8 q" T- ~#include <stdio.h>* q, z" X2 K  }! y. s: l
#include <string.h>, p3 f$ U- n: Q* F/ `+ l1 w5 `
#include <fcntl.h>/ |3 K( O, j/ S% C5 C1 ~* Q/ d
#include <unistd.h>
5 T  o# x4 @9 V! V: i0 G' E9 D4 z#include <signal.h>
  L% W2 K2 {- S$ A1 g0 P) J; B+ w#include <pthread.h>       //线程; q! w. @- S) z, b0 C
#include <stdlib.h>
  S! |  j2 F! u# ~2 h% I  t#include <pcap.h>          //捕获网口数据3 h2 D% b1 O  q: ~. u2 K
#include <semaphore.h>     //信号& V/ Q0 D. {/ K6 e% T
#include <sys/types.h>     //消息对列
+ u6 n6 Z/ ~9 d#include <sys/ipc.h>       //消息队列
. D/ Q9 s" {; t% }! W7 ~7 W/ h#include <sys/msg.h>       //消息队列
* F- h0 B0 i. r" d#include <sys/select.h>9 `2 w" I% H2 J4 _
#include <sys/syscall.h>
. |- c& I- ]* Y1 o& O5 S#include <sys/stat.h>3 A$ g' b1 N) Y0 ]& p5 _
#include <sys/mman.h>- z5 m- N& g( C( ~! R
#define msleep(x) usleep(1000*x)
* i3 v' D4 t9 L3 r( E+ ]: E
9 V+ T& C' ?$ v  w# y! oint main()' {; B' ]5 [. L# P" ^
{ ) Y' M0 \- D# y& S$ [0 n3 U
    //MCBSP,ARM与AMBE2000交互设备
/ @. \, ^$ ]/ c$ ? int fd;
& i) [& F" x& U. Z unsigned short data_write = 0x5555;* Y! m/ ^! }. X
unsigned short data_read = 0x00;
: A7 ?- c: Z6 l% }) g. |  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 E4 ~( B" x* r* W3 G6 c5 ?+ D //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);% k  e7 s* {3 p# y$ p3 D! u
   
: d6 ]; l2 J4 [8 C7 b2 _  if(fd < 0)
: T& ^5 e! Q+ Q7 j9 {) Z  {
7 k0 h7 J# t/ M& k6 u8 n( |8 I& x     perror("open failed\n");+ N4 r) V. j* ?3 B; b
     return -1;7 E, Q  e& `. V* H* J
  }( ?+ S1 X0 ?6 b
  1 k7 x" ^. ?! T
  while(1)# z6 i9 j3 ?& s/ w
  {# k2 y( F6 n5 J
   
5 d' c1 o7 z! a$ F   //AMBE2000每次读写是24个字为一帧- K) \7 C5 G4 u' p8 N
   //写数据时将数据在底层存储起来,等到中断的时候再发送3 B/ V$ T( u" ]
   //AMBE2000输入数据是以0x13EC开头的7 M/ o/ c; f# f! w
   write(fd,&data_write,sizeof(unsigned short));
) X1 [8 X: M8 a  _; h9 L   & A% n6 S5 j6 [
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
& f0 P  Y$ V9 K, Z+ E   read(fd,&data_read,sizeof(unsigned short));
  ~! C+ r1 N* H: v0 O2 T( Z/ s   ' ?) ~! ?9 Y5 W% i4 K+ Y  t
   if(data_read == 0x13Ec)
- l+ H( n( [. k3 I7 s- N: s   {
1 x8 w/ T* B% t( X& y  r" T   
3 ^: j0 e: e$ e1 `! G- L    printf("data_read = %x\n",data_read);" H4 T- P% Q% d0 b7 J- W! i
   }5 T3 o; D7 I# V7 o4 V, W8 x' e) v8 p
   
% @6 P* t' v" B3 @# q) i- ?, Y0 W& m5 a   msleep(10);; {2 o! U) ^1 d6 n' W8 ~
  
3 a. K' t( h: }9 ~) A* [& e, F  /*
* ^$ z8 |3 c$ Z* _" C   ioctl(fd,1);   
( m6 h6 R" h* g! \! Q& o sleep(1);  v4 Q) @4 A: y  M
ioctl(fd,0);" G( p' Q* e* f) Y0 r+ R
sleep(1);  ]# s8 F/ P5 B' J+ k2 s
*/
# Z0 T4 ]; i# M# B  }   / w% H6 B' O, k9 ~7 M# g
return 0;
8 h+ J0 \% d% {' n; C, [  q 8 B- T% A( _! R0 h/ A& b1 ^
}& M% ^0 B' f) k! p1 F

" ^) \! S7 W8 C, o4 s( S% T  r4 L2 x多谢各位指教,谢谢! 急
! Q' a' S% z- f, X/ |5 z) t- M( f; _& L6 k/ R2 |7 h' |9 o
1 v) R" V- V' Z6 K) h
9 |4 ?, w+ ~: u$ ~

# c* J- s& q4 B! ?# ^3 S% r6 q, V0 v& s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 09:47 , Processed in 0.044384 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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