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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: # h5 D9 X' u# ?/ t6 b* A
/*7 j( W0 n5 v5 b* P  j, z7 a
* Copyright (C) 2009 Texas Instruments Inc
5 X3 G& {: Q9 ?4 C: l, ] *: A& k, w( Y$ B- z
* This program is free software; you can redistribute it and/or modify
- u1 i0 C) _" W5 T' {) i2 { * it under the terms of the GNU General Public License as published by
8 ~+ y( N6 [6 E" C * the Free Software Foundation; either version 2 of the License, or4 G% b$ C6 s) \# J# l
* (at your option)any later version.
; U* P7 V( d4 R8 W9 s *( s# y( x) z6 C. \6 Y% ?( g) C7 Y
* This program is distributed in the hope that it will be useful,3 U+ T: [2 R5 M7 g! E7 J- q
* but WITHOUT ANY WARRANTY; without even the implied warranty of9 Q3 u. R- K+ u
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the, V. r: P; [5 z( [/ G
* GNU General Public License for more details.
5 j) Y- Y4 x* r( `6 N5 v- W% F: s *
3 z7 k: a0 U* s3 _. r * You should have received a copy of the GNU General Public License
: i! O) H6 A9 C- L" l/ w! B * along with this program; if not, write to the Free Software; x4 q8 M9 q2 N
* Foundati+ S% g/ b. d- C6 c
*/2 C, @( O* z3 Z
#include <linux/module.h>
) m5 w) W$ `; u#include <linux/init.h>
; J5 X* _' r6 N4 S#include <linux/errno.h>) G* ^3 q- s; U- @: K0 x
#include <linux/types.h>/ X% P; ]8 G1 S/ W9 B) v
#include <linux/interrupt.h>/ l5 K% a6 ]3 ]1 ~, q; f
#include <linux/io.h>
! d7 \6 u2 B6 ]9 r5 y$ h+ t( z2 ^#include <linux/sysctl.h>
5 p9 Z8 `5 F& h3 O% k. i#include <linux/mm.h>
( o5 t8 q; U. r* X+ ~) d#include <linux/delay.h>
( @- G# i  C: d8 K% {4 {4 T- T+ r#include<linux/kernel.h>
/ B8 a1 ^' o0 e#include<linux/fs.h>1 u3 ?7 u0 c4 ~- {. Q, e
#include<linux/ioctl.h>" W; |5 \) U$ T% p) U( k
#include<linux/cdev.h>* I# X- n  Q3 ~" f0 i7 O: K
#include<linux/kdev_t.h>
7 g% h) E. X/ K4 X#include<linux/gpio.h>
# K  ~3 q" Z" W5 }0 c#include <mach/hardware.h>
/ a9 M# k: A. L9 u2 c! `#include <mach/irqs.h>
% g- c/ s* m; K+ a. V7 K& S
! v+ Q, q/ R% P#include <asm/mach-types.h>
# h$ j# w, e. {3 p$ S#include <asm/mach/arch.h>! {7 m; _8 \( }, u& l
#include <mach/da8xx.h>' ]+ g+ S- u, e: G$ X! I" G+ t- ]. |
#define  SYSCFG_BASE   0x01c14000
  G* }) Q; D' |) _9 G#define  PINMUX1_OFFSET   0x124 ) v6 W* e/ M, ^& M5 ?3 H; T# I+ J
#define  PINMUX18_OFFSET  0x168
/ R% ^! g' O1 H#define  PINMUX19_OFFSET  0x16c
; X6 f" T, ~) ?" a& x#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR: ~, e& @( {* q& U; P
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR/ o; n" K" A  P% N( k
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
7 h% o0 X' ?/ z+ X: N' _% p#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR9 |. |  C& k- L: j/ \& v2 U" x7 s+ ~
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
4 @# s4 a  ?/ P7 l$ D: o6 v                           
% w1 p6 ?# v4 U) l3 G8 E9 o! J( ]#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
- L' w- E& e& t+ W#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
8 N" o5 B# H' [//PSC
, L4 C( M; u0 \5 Y#define  PTCMD_ADDR   0x01E27120    u1 J% O/ ~4 f! r, U, O
#define  MDCTL15_ADDR 0x01E27A3C
1 f2 b* e5 g- i, b4 K#define  PDCTL1_ADDR  0x01E27304
. R2 t" R& `% u( Z3 Q# B; x//GPIO8 direction& `$ ^5 c, q' p. E
#define GPIO8_DIRECT  0x01E260B0/ u/ x0 t4 @2 w( U" S5 S2 B
#define GPIO8_OUT     0x01E260B43 a% W8 `% E7 H% n6 [/ ?6 Z
#define GPIO8_IN     0x01E260C06 V- N1 i4 A- T6 q' t$ z' [
. o* {+ t0 r8 P% r. l
//#define MCBSP1_RINT    99              9 K, j' e, ^; k, H
//#define MCBSP1_XINT    100  ! }: k  M! y' L# ]
static int MCBSP_MAJOR=239;
* L6 X/ G8 F/ Qstatic int MCBSP_MINOR=0;4 F* R/ O- ?  e: v  {3 d
static int count =1;
4 G  B" Z# [& x( B9 ~1 @! _8 Q0 q3 p6 r$ E+ Z) _+ I
#define MCBSP_NAME  "MCBSP-device"" D- ^  B7 E  D6 Y; S: L" C
' u2 r- k( ~  v/ L6 D. {. }8 F( n' y
static struct cdev *mcbsp_cdev;
! w$ o9 V: B& e; A5 Estatic struct class *mcbsp_class;1 {, O6 Y; r6 B, j1 B8 ~
static dev_t mcbsp_dev;( [. f9 Q0 p+ ~' r; F
unsigned int DRR_data;
! `2 ^' m; s0 q1 c3 F1 uunsigned int DXR_data;
0 K+ A" P& g3 {: Sstatic int mcbsp_open(struct inode *inode,struct file *file)
; N" W' n, x+ Z) z7 Z+ j6 p: ^{
3 b  u9 Z2 f' z: W: ~   9 q/ y  [9 A# E8 L3 [( f
   //interrupt enable,initialized
! w" i& X* g; `9 H7 o. u   unsigned int temp;
/ u1 v( K1 ~/ [   //SLEEP_EN(GPIO8[10])---09 `. u/ k' B9 h7 o% e7 t3 Z9 J
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 ~0 m3 q2 t! |0 k# N
   temp=temp&(~0x00000400);" I' W$ f; j2 N0 v. w* Y/ U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]/ |+ R9 _5 E, K
  //RESETn(GPIO8[8])----0----1
& u, `( ~; k/ ~* l7 G   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 B+ l  a- J% ^6 r( q   temp=temp&(~0x00000100);
2 `! ~- b3 t2 P6 G& U   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
, t  A7 |, |: w2 i   udelay(100);! z  k2 q: j% I2 i9 \7 @& U, J8 [
   temp=temp| 0x00000100;
8 z. m: Z3 w$ k- F1 @3 Q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1! y% v3 Q, M3 v; W, i( T" ^
   udelay(100);
) B! U0 s& O3 c3 c8 }4 N   printk("open success!\n");4 d% `8 z+ z+ X1 a
   return 0;7 n- K5 i: F0 L- X1 W
}
7 D5 ?- \0 ^" x, w) ?8 }. S5 |8 z6 T: D- S' g
static int mcbsp_release(struct inode *inode,struct file *file)7 I2 T6 B0 M7 m) w7 s
{3 Z" V6 b+ m3 J
   printk("release success!\n");& t9 E( P( N5 q3 |
   return 0;  s. z- U9 ~5 I4 X8 E$ Y
}+ }9 }- B: [* Y" {
3 J$ Q' L$ V' D% [7 C
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
2 |/ P( r0 \4 o{
* I; n5 M* B$ @5 d' J9 w4 ^    copy_from_user(&DXR_data,buf,len);
* d% c$ e( [5 f1 h) T  }    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       , _! X6 k+ d0 F
    return 0;6 ]' [: a  o: d% P" d8 V1 e) L
! E. }6 W1 w6 \) {* w) L
}
) p; D: H; r+ B+ l7 _4 J  F& q; ]1 ~0 p$ S& {" R* J9 Y
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 _$ u* P( h- u9 N
{ % c8 A/ @3 ^/ R) n" |, Y3 [8 U  @
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));! Q! q' }& R% Y1 Z8 L' B
   copy_to_user(buf,&DRR_data,len);
9 E& n: o1 W( u9 e4 `   return 0;4 W3 q' v% [" M8 v1 Y! {
}" v* R" {  ?$ R9 c

) l" ~/ s9 F6 ^6 u
% Q- a" n% H6 t9 Z5 c0 p; Zstatic struct  file_operations mcbsp_fops=1 Z1 R/ M! q, D
{) z5 x% q, T8 w- f5 @) K
   .owner=THIS_MODULE,
5 M( l* R* ?. s2 ~, G& X$ G; X   .open=mcbsp_open,
7 r& q: R; c% k8 o! }+ |   .release=mcbsp_release,
0 v/ J' a# s0 c$ A. Q   .write=mcbsp_write,* c7 A  j) T. v6 L/ e4 J' c' o) Q
   .read=mcbsp_read,
+ o' b* S9 X+ ~! c};
/ x$ g' h; m! T# ostatic int __init MCBSP_init(void)
# n, L8 J: H* ]; \! Z, z{8 E" ^: n  ]8 L+ m0 t. J) E
   int ret;5 s; ^' i2 k' k) J% y- {5 ~8 E
   unsigned  int   PINMUX1_REG_old;
  H# \& w0 k  l* ]; [2 k   unsigned  int   PINMUX18_REG_old;
* R& c+ O- ^  ~   unsigned  int   PINMUX19_REG_old;5 y4 {3 W- p4 Z3 ?# }
   unsigned  int   temp;  & `. w3 o( P3 m4 [' ^
   if(MCBSP_MAJOR)/ a& k% _8 E) x
   {
: i0 C- d+ `' G  }      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);7 d! y7 s1 m. q
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);/ V4 ?, a7 U2 I8 m. I
   }
- |; q+ A" G- t! ^/ B: h. |   else
6 C7 N1 {7 M2 X7 b# r   {
$ |1 o; e! C$ `3 s8 [6 k- r      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- \/ Z5 n. [) j( X  v  J* u2 E      MCBSP_MAJOR=MAJOR(mcbsp_dev);7 g; B& I9 d% k; P5 ~' S
   }3 w9 n# S/ W; t5 S. g, `& h; }  O
   
$ i3 C0 y2 t( m1 G7 [   if(ret<0)
* g+ C$ q# ?- B& y, J   {
3 C7 D- j8 a5 A% D( z7 R      printk(KERN_ERR "register chrdev fail!");- V% V/ L5 n" Z* R7 I7 _7 U
      return -1;1 _+ A; V, T8 z) H4 J' k" z
   }3 U, ?2 |( z) s
   ' k& j: I0 w: V/ _1 m8 e
   mcbsp_cdev=cdev_alloc();
2 m7 W! ^3 c; G$ M% h) L   6 j$ E8 `; B; I9 b" t7 n1 ?
   if(mcbsp_cdev!=NULL)
+ m. X; N- p0 C   {
% L! n$ l2 n" S+ f" Q8 R- g      cdev_init(mcbsp_cdev,&mcbsp_fops);, f* P4 f* D/ Q: w& r- U9 `
      mcbsp_cdev->ops=&mcbsp_fops;
% p2 S# ^' V" m1 S) g/ l1 |- N      mcbsp_cdev->owner=THIS_MODULE;
% j- y( A; z1 S* N6 x; x2 t: @5 ]: i      7 h( c, X% |& P2 E, Q
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)). ^% ~: d# T) P- I& V. ^
          printk(KERN_ERR "register cdev fail!");' N% Z% O$ `& Q1 a
      else
; j  }  o0 q; c" y% ^. A          printk(KERN_ERR "register success!\n");! G7 Y  Z( |$ ?1 a7 |
   }! D* Q% S7 h+ V. t0 E
   else- N" H7 v  g' s6 u
   {& y1 O) v( N5 I1 r7 B$ C1 x
      printk(KERN_ERR "register cdev err!");
/ n. T5 n( L) |( x# h  I      return -1;6 J2 a  A- d; [* h7 f# c
   }
, m4 x, j  a; w9 B" u7 h; s. C1 f   2 P, u7 _5 x4 [( w& @
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
. y, G' h6 }) W   if(IS_ERR(mcbsp_class))0 V5 J8 v1 w4 ~3 _% ^" i2 p
   {
) N* F- D3 I0 \7 y. E1 j/ I( p6 }! h      printk(KERN_ERR "register class err!");
) A! d9 ?) w2 k- l+ {   return -1;
4 d" c# u8 a. g& E$ _, e1 |; ^+ W   }
( X( s  W. ^9 q3 l( J+ d! ~" m   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 @! q9 l- o. b: [# g5 M$ T! r4 b& S/ N" e( D. r# O) D
   //PSC" y. t. u! w1 W
   //add Enable MCBSP
1 J' b; q$ g( F9 c2 L/ I   //test
) e* f$ e1 p' M3 L   temp = 0x80000003;
. R3 `4 P5 u+ m. V( T   writel(temp, IO_ADDRESS(MDCTL15_ADDR));* K: Q  ~7 z+ j& B( P/ X8 Z* i5 Y
   temp = 0x00000003;; [! [& M) m% q! k+ B" U: i1 z
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
5 m& x" y( P" z% D# K; F  ?4 K
. j: I$ d& l0 K  ^   temp = 0x001FF201;
8 P& ^+ n) O8 a" U   writel(temp, IO_ADDRESS(PDCTL1_ADDR));# B" }. i: Z2 F. J
   
2 T7 K& u! |  t- n) T   //PINMUX  
. C2 ]- t2 I; W: G, r9 j   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,7 v7 M3 q; b1 Z8 {! B+ k7 X
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
* D/ _1 G; w' Y1 j& M/ h8 Z   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
1 H( a2 J7 b# _; x! k) f  p# y   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);+ \$ C. |4 |' @: I
   
$ z& o+ i" e9 o/ W   //SLEEP_EN,EPR,L138_SHK1,L138_RC5 b5 J. _' T( c$ u$ a- ?
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
) I' f8 f4 F+ U8 ?! U# E6 f3 d& i- d   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   $ e" L6 v( l3 e' H1 ~
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);# x4 K; Y* g8 B1 u) q& x
5 b8 k( w: @/ R0 y* l
   //RESETn,L138_SHK2
6 z* u2 R5 a* w% W  V, Z* c4 j   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  * B! }3 c) g- T: p3 _3 ?: r0 t
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
% x5 g. r3 e+ h3 ^   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);+ Y* p* A- t, u9 K6 F
6 d6 }8 k5 j) r+ Y( J0 B% S
' Y( F$ ]# E$ ?# Z. X0 \% v+ u) U
  //SPCR Register
0 \, e, R5 w3 D" @$ Z  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
  ~6 A- f2 h8 Y! y; x8 d5 B  temp = 0x03000000;//(DLB=0)2 I$ L  O' S( r3 R
// temp = 0x03008000;//(DLB=1)
, \* x! k5 U5 @5 p+ G% Y7 W  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
. d/ C, x+ _" x. t. r  temp = readl(IO_ADDRESS(SPCR_ADDR));4 g1 O+ {" K- P2 {% S
  printk("temp=%x\n",temp);; O7 M+ `8 ~& S/ H
( n7 x' f4 T  R1 P* {
   //PCR Register* S+ I* ~/ K$ Y" K- Q+ `
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* @+ L' t, |2 ]  // temp = 0x00000F0F;* S1 e; F1 y% r+ D
  temp = 0x00000B0F;
. u9 K% `; C% A$ Y& W  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
: I( ]" B1 B: g' |  temp = readl(IO_ADDRESS(PCR_ADDR));
7 _/ L: g9 {$ K, u# O4 V5 I# W3 q  printk("temp=%x\n",temp);  
* B, r- W* |( V  U0 P* Q4 d" e   //SRGR Register
) `3 Q4 y7 D6 J2 `/ D   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. U/ g, k" j' p( E- m5 L* C! Y6 k //temp = 0x301F000B;" R1 q5 g: m0 F( ^0 k7 J1 l9 y
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized * g3 b5 J/ C+ C* A: `( s; c8 a
  temp = readl(IO_ADDRESS(SRGR_ADDR));
  K- |, s. x  h  b  printk("temp=%x\n",temp);$ Q$ Q! M6 Z' _* x# y# U4 T) ^
   //RCR5 p. s  _# U2 d; W
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
( l4 Y6 S* ^* Y; C/ S) Q, G) l' \   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
$ h/ Z5 n1 _/ J& U& P   temp = 0x00440040;
# k4 X; Q* k8 r   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
( u0 I6 n" U: X2 C7 A   temp = readl(IO_ADDRESS(RCR_ADDR));8 c0 M0 ^- s6 e2 G: Y
   printk("temp=%x\n",temp);) R+ c3 }/ X0 ]1 o
   //XCR  J3 G7 I+ U9 I* M  W; Q5 m
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
% ?" Z9 ]" o3 `8 p   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
2 w6 u$ J7 e. v2 ~3 Q   temp = 0x00440040;1 T) o" L2 g4 [* G- p5 r' o
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   & C. Z6 J0 T( v4 b3 E& f1 f
   temp = readl(IO_ADDRESS(XCR_ADDR));% X  c( ^9 i% U0 Y+ l( L4 _$ }( C
   printk("temp=%x\n",temp);
9 ]0 l* {4 ]& l8 ~% ^0 [* T  udelay(100);
  e9 s( Z! g+ V9 f  //SPCR Register: f: I3 _4 P+ y9 A' z
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
) B3 Z' s6 x8 T! e/ b  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
" a9 r' I# s& X  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
+ P8 {4 I* s# r  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 D" Q- v( ~8 E) @$ E. X  printk("temp=%x\n",temp);6 \" n) W5 {/ C- \. d
  udelay(100);. x# T; }+ ^. A& Y4 T6 A" b( L
/ E* \; Y# |* c9 s! A) \! W
  //set GPIO direction
! h$ {0 K5 g; r& q   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
5 H3 e6 N. X( @   temp = temp | 0x00000100;//EPR----input
8 o0 {6 R3 n. b  t   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output# y8 x3 j; Y2 q: u* f5 r6 [
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
$ z" n: e# _% k  w2 c* Q  J* ?& H# S
% N8 R/ E+ G' K: }/ p1 I  Y   return 0;( P; ~# S  r! r% I/ _, [! M. r
}* O0 H  O# V  I
static void __exit MCBSP_exit(void)0 e" U1 s% y7 v2 t
{
+ z6 f7 n( ]1 e4 m   printk("mcbsp chrdev exit!\n");
2 t- Q' m) s$ G( R5 J2 z   cdev_del(mcbsp_cdev);0 a' r" W$ J1 l' I$ U) a
   unregister_chrdev_region(mcbsp_dev,count);
+ a2 p5 ^' g6 u! ?   device_destroy(mcbsp_class,mcbsp_dev);
4 c. \4 P  J2 F- m   class_destroy(mcbsp_class);
. b" z1 W* q) G' v- ~& @8 x}
6 j1 O" B) X$ `$ u, D; smodule_init(MCBSP_init);
" n2 ?, b/ t) E+ Amodule_exit(MCBSP_exit);' W- m( p( }& p

. L# Y. `3 f- f8 G( L$ qMODULE_LICENSE("GPL");. d, d/ j/ j2 K. `# i& K3 @: {
+ E( b! O3 e/ A6 t, \' f' G6 H+ ~
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
/ ]& ?  Z% \- x  D/ Z+ m6 t# N我的应用层的测试程序如下
" v: L3 [. X" K: \6 ]5 e#include <stdio.h>
4 }7 ~9 {5 H3 a7 [#include <string.h>! o4 b* s  d3 }# l8 E3 Z' w
#include <fcntl.h>
7 c/ x% |/ j) t' Z) k3 C& E#include <unistd.h>
" I) o  S( F$ f#include <signal.h>- G1 b& ?8 k# s9 R" Q0 e' B
#include <pthread.h>       //线程& ]! ^# T; U! J
#include <stdlib.h>5 m# a3 H* Z3 E/ q: Y* d
#include <pcap.h>          //捕获网口数据1 W# l2 H2 A1 k8 N' P
#include <semaphore.h>     //信号8 D$ H  g& Z/ n) J
#include <sys/types.h>     //消息对列
5 @  `( R3 |/ Q, D8 O3 _  X! o#include <sys/ipc.h>       //消息队列4 p3 C0 a- i4 h5 k, y' Z% U
#include <sys/msg.h>       //消息队列8 _, o  Q7 Q' Q2 L4 q* P
#include <sys/select.h>* k) f5 d3 L" W% E, t! s/ J% V+ [0 m
#include <sys/syscall.h>
% d7 \8 ?. U: A3 S. N9 C) |#include <sys/stat.h>+ C/ k" @% {6 G; R' _' a9 {$ y
#include <sys/mman.h>1 Q+ c) M! L- N6 a7 _
#define msleep(x) usleep(1000*x)
4 G- m% `7 J+ Z: K. A( h  q) E% |9 d$ p' T
int main()
$ {  w) d# Z0 Y% s7 J" a" X7 \{ ( `/ g/ u' q6 k# d; t, f
    //MCBSP,ARM与AMBE2000交互设备
! ]# Y/ ^& h" @: z$ P! {4 i* ~, U# T int fd;
0 ?: B3 }& K# b, X unsigned short data_write = 0x5555;3 @+ l7 _; X8 t5 W0 D
unsigned short data_read = 0x00;* c: P1 p; w9 \& f7 i
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);# o7 o, i5 r7 I4 Z
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);7 }4 w+ X" y5 K" i* {. @$ O
    6 S9 M! p5 S: v3 h& N
  if(fd < 0)' c9 L% C4 V4 d$ l- a( N, q
  {
6 \" ]% B+ b, P, H8 d0 o     perror("open failed\n");
9 W0 D( V- F( ]# t4 b     return -1;1 u8 |$ [6 h* B1 A4 L
  }
5 f3 I. V' a5 ?* t7 M  & t5 T" N# k- r' y1 E1 Z7 B$ N/ D5 r
  while(1)
' }- j, O! n1 I7 Z  {
$ R% i' n8 ~: n: H! L8 `   
' U1 e! L$ [* h3 }' L8 t   //AMBE2000每次读写是24个字为一帧
% A9 O2 x; C- @4 A+ B   //写数据时将数据在底层存储起来,等到中断的时候再发送
* j# g; y4 y9 H, _8 B# C   //AMBE2000输入数据是以0x13EC开头的
/ i: x2 i5 Q5 W  j) i   write(fd,&data_write,sizeof(unsigned short));
' |- M2 h% x2 d* n   3 Z0 p( c# I9 Q' i# C0 Z
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
9 [- y% _% y: v   read(fd,&data_read,sizeof(unsigned short));1 m+ O7 t1 s$ f# i9 K- [+ k
   - E3 X7 [6 b$ `& i8 k$ M
   if(data_read == 0x13Ec)4 S# a5 M0 \  ^- ?( R
   {
$ L: A# O0 m: W- D0 T( a5 K   / q# c3 z% @. k
    printf("data_read = %x\n",data_read);
. @; F9 R( L( O' I) p1 K   }0 C  H+ b. Z0 y& u
   5 h6 F  E0 ]9 F# z2 R, p- r, A6 a) I
   msleep(10);
9 P, v! L: E$ w# z. T* A  
9 f. d2 ]: P* C% N/ T! A' t5 u; o  /*
: Q& Y+ U3 Z% S   ioctl(fd,1);   8 ]1 ?) O  h9 @/ |- i
sleep(1);
1 a/ }( k. k8 V* F/ u ioctl(fd,0);
, o6 h5 f  H8 M7 u2 O3 T+ K sleep(1);$ ~& n; H5 ?" }  [: r0 c1 _  C
*/
/ U% ?; I7 C8 H) H  }   ( Y9 D; f' I5 u7 z/ x
return 0;
2 f6 x, E2 F3 c) I' t 5 I3 I0 X! V; j& a- h- P& T+ A- h. p
}
. f/ o: w* I7 g' h
, \5 T5 B$ H% v/ j多谢各位指教,谢谢! 急, C! q( t4 ~% Z$ m" [$ f  _  X
- f2 A9 N  v, R: u

: U7 x' O4 G& D4 I% j0 ]
) r. S( u' [0 w; x
9 ]. d5 H1 O: o0 [+ |# a; t4 s+ z  {3 R( e# _+ _" ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 06:30 , Processed in 0.042244 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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