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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: u. Q! p! a' g' O% ^/*, x" j3 ?% k+ A  q
* Copyright (C) 2009 Texas Instruments Inc
# h+ x! s+ V; J1 B+ k& l, V *
) `/ R/ P: \% y* x( C+ E * This program is free software; you can redistribute it and/or modify6 ~4 Q; }1 `0 [8 p& z
* it under the terms of the GNU General Public License as published by; }) v' q+ S3 r  U5 v
* the Free Software Foundation; either version 2 of the License, or( M0 ?- t# R' @9 z$ p+ M  O
* (at your option)any later version.9 v7 `: n) }5 _- O/ N
*
8 u6 W/ S! l6 ?5 W, D * This program is distributed in the hope that it will be useful,
3 W( F; T/ |: ]9 ?4 d; T3 `; ~ * but WITHOUT ANY WARRANTY; without even the implied warranty of: Y% c& E' q2 i' v7 Z- z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0 M. G6 o& u$ k: K9 n' k * GNU General Public License for more details.& k. A; O$ O' h% q0 W" x' X
*  q# h, V3 `1 }) y
* You should have received a copy of the GNU General Public License1 d0 [: _; y* J3 d- G
* along with this program; if not, write to the Free Software" `# |9 h, D2 m, @7 p
* Foundati# ?  q! Z- h, ~/ E. u4 `
*/& N5 d( I4 R  ~; p! D" R# L' e. k
#include <linux/module.h>3 N) y" j% w! S7 k  `3 Y
#include <linux/init.h>) e# J8 U$ y) \# q" ?/ J% a
#include <linux/errno.h>
$ f. b' m7 R( `8 t( ^0 |#include <linux/types.h>
* c: T% N, A- F& a* }" w#include <linux/interrupt.h>
- f+ Q6 v: W, c9 C#include <linux/io.h>
" _7 |8 Y7 T3 Q" h* T) |#include <linux/sysctl.h>4 B. |- _$ x9 Y7 M. F' R; u
#include <linux/mm.h>9 {9 ?1 E2 a5 ]) d
#include <linux/delay.h>
  w5 B/ K8 N& c9 I#include<linux/kernel.h>& ?. [9 D5 x, V+ k: F
#include<linux/fs.h>
: T& N6 k" ^: h4 |#include<linux/ioctl.h>
& U* O. i6 V) X$ n#include<linux/cdev.h>! W1 b2 ^( w- C) U5 y# }
#include<linux/kdev_t.h>8 g% ]7 \& D+ r, d: V! }
#include<linux/gpio.h>
+ j" K9 M8 u; z: y% D+ t#include <mach/hardware.h>
; l5 l3 z( W" n#include <mach/irqs.h>
6 A& F" t$ v* `6 u/ T
+ z* n; M" k7 M: s- h$ x/ w, @% W#include <asm/mach-types.h>& \& q$ u( e, r) _/ j7 d0 |
#include <asm/mach/arch.h>
# e% l/ T7 v& |" |$ T# k3 [#include <mach/da8xx.h>
+ t+ z) }1 U: R1 w#define  SYSCFG_BASE   0x01c14000
; G5 l3 U, x+ p! `' R#define  PINMUX1_OFFSET   0x124 ( K) `2 Q2 Z$ \6 z
#define  PINMUX18_OFFSET  0x168 * l+ L6 |' d7 ]( s; R) J, ?$ D
#define  PINMUX19_OFFSET  0x16c1 r3 }/ i4 c3 R; ]+ v+ v5 ^0 {
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR1 R( }  Y# ~7 _- _
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
2 P8 X1 `' a; L- j#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR. i% B( R9 w9 D& W
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
" I- j$ Q7 Q! S: C7 V#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR' b# |% e7 Y% t# O8 A
                              ?; A6 |! d/ |8 }& C4 V9 B) L
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
; q  C7 ~  |: J' t#define DRR_ADDR      0x01D11000  //MCBSP1_DRR6 ]5 B& Y3 g( q7 R& M9 v8 S
//PSC" U6 o* k( z- O0 J
#define  PTCMD_ADDR   0x01E27120  
9 U4 q8 g" y2 J+ n* H#define  MDCTL15_ADDR 0x01E27A3C3 `6 D* R+ Q8 W- t+ V: ?0 H
#define  PDCTL1_ADDR  0x01E273047 B; L3 R2 ~; Y& U0 E9 O
//GPIO8 direction
& s# i. `4 \9 m9 ^# D& O; r#define GPIO8_DIRECT  0x01E260B0
1 O# K3 V% E% s0 d& K" k! t#define GPIO8_OUT     0x01E260B42 y( L0 G0 L. B1 W$ L* B' l5 I
#define GPIO8_IN     0x01E260C07 M$ |8 J$ L0 ^: \/ v
) ^7 ?# V/ M. ^' E2 V
//#define MCBSP1_RINT    99              
- H  l" t; E& q1 ^4 c, e  H7 x* D//#define MCBSP1_XINT    100  
: k' O* {% {8 ?3 mstatic int MCBSP_MAJOR=239;0 L  ^2 q+ K- @  A3 O1 P# O
static int MCBSP_MINOR=0;7 s# h; Y% U: b2 r* ^! M+ U
static int count =1;
4 [$ t7 D1 }' @6 \2 }
, S" g# v6 ~# r9 }6 P#define MCBSP_NAME  "MCBSP-device"
' a  s4 A9 F7 ^3 W, @( p0 k! g; C4 l) V; B
static struct cdev *mcbsp_cdev;: l; o8 G, h) Q0 d* `% F& e
static struct class *mcbsp_class;  ~/ `$ S' x+ ^( c; d8 F/ d% o5 g
static dev_t mcbsp_dev;- @' r4 [$ ?  g% t; e3 s  }
unsigned int DRR_data;
$ c5 N% V9 I4 N& ]/ i- v% D4 ^unsigned int DXR_data;
1 y0 V) ~1 Y! L. l# _static int mcbsp_open(struct inode *inode,struct file *file)
3 D( O; ^) }7 q# \% ~; |/ v{& X0 r8 q' u" U4 v5 l) ]1 b
   
) |1 S: E! _' D& h. A9 W$ @( t   //interrupt enable,initialized$ a6 b0 i% J: L  c& F9 {1 w6 V. h
   unsigned int temp;
# S2 a# {; J$ S; o   //SLEEP_EN(GPIO8[10])---0
) ?- P( N; v$ o" D   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: L- \' P, C7 n# H* b
   temp=temp&(~0x00000400);# ?9 y, S" m7 d( D! [+ @" ~# c$ J
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]5 q( R. A) t8 ]! ?+ [5 ], g( p: o
  //RESETn(GPIO8[8])----0----1
6 ]) }# w/ i5 C' |/ S( h   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 U& ]) L7 i) ~. ?, g* [
   temp=temp&(~0x00000100);
, ]  g8 \" D# @( ~/ @   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
# @( U* v/ J! w0 v6 Y2 Q6 Z   udelay(100);" v! C' l4 W- Y5 _  Q
   temp=temp| 0x00000100;" q0 a0 f, v. F+ b5 W
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
" }' Y: _$ o. H' `   udelay(100);& W. ]" i6 W/ D# U3 E' p
   printk("open success!\n");+ C4 h& v3 A! y  [; |  _6 |
   return 0;8 k5 ?6 L: H2 o( [/ X
}, u, h& q- ~9 {: N) X
% J. _1 ^; ?: X; r1 P
static int mcbsp_release(struct inode *inode,struct file *file)8 Z+ D1 `; Z( Z
{) ]' S- a+ ?5 q8 v
   printk("release success!\n");
2 o. c% |! }. t" P   return 0;
5 A3 D0 `" _8 I}
4 R- C( Q. {# _, ^- u* e$ V) X! j' Y9 D0 h& ~
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 y# l1 G* @' v- w
{7 s: }( r6 v" J  W' S
    copy_from_user(&DXR_data,buf,len);
8 K5 B1 l! h7 u* i    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       2 v3 _. }3 @8 O0 W  z
    return 0;
" N2 j; Y) X% I: r
" E# ?/ \8 D& w5 I3 O9 ~}" ]* Q* F, S) c3 u! O

8 E4 W3 I7 m2 J8 t/ L& v+ |static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)( \1 s2 H3 }0 Q7 U" V! x8 F
{ . b' z4 U5 a+ A; n) V. e/ N* k
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: l/ q; L. Z3 h" X0 P9 S0 ^% d4 K
   copy_to_user(buf,&DRR_data,len);
9 i+ w& ]. H  ]6 B$ U   return 0;0 o1 v( W  x6 H* q, x7 E
}
# a9 y! ?; r& y- J. `/ _( v2 A( P  N

6 B! F+ e9 G1 M4 K  }static struct  file_operations mcbsp_fops=
& q5 f' F) n+ w& ^8 q  s% Y{" y" T2 e8 @( O7 s
   .owner=THIS_MODULE,. e  u8 p; s/ a3 y$ L% X& b  z
   .open=mcbsp_open,4 u2 M/ P6 N# n9 M$ k* J5 t+ p" }7 L
   .release=mcbsp_release,
  R3 M2 {' ~* @   .write=mcbsp_write,
1 @3 M% ]* Q) Y7 B  ~   .read=mcbsp_read,/ a9 b4 D  u1 D8 R$ |% j5 ~" q
};: {+ y; Z/ q4 k9 ]3 [  U- c
static int __init MCBSP_init(void)3 Y$ C8 J# J, f# Y% G
{* V5 r' E- _) w/ W' h: o
   int ret;
% e% p: V1 k& H  [/ t9 S" y   unsigned  int   PINMUX1_REG_old;- g$ M9 m. {- }1 H
   unsigned  int   PINMUX18_REG_old;
4 C8 z$ z* D& d+ U( o& W$ d, _   unsigned  int   PINMUX19_REG_old;3 P( ]6 g6 C! X! t0 J
   unsigned  int   temp;  ' _3 ], \! o4 f9 p1 ]1 P6 d
   if(MCBSP_MAJOR)( G+ }. j5 C. v  Z
   {, @. C1 _( i6 U$ R- @! f* \4 x, Y
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* `' v" l$ V+ b# m* q( P+ M% ]% d# E& {      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);) Q% M+ F$ W) R- p- E$ w
   }
3 w$ Z$ L0 U1 u5 S) p. G   else
1 g$ `2 i* p0 r% U+ Q   {
$ C# W2 `+ K0 ^% U. x  M      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
; r! |# W  D7 N+ R      MCBSP_MAJOR=MAJOR(mcbsp_dev);
  v' n5 j+ F- X( ?   }
% [* n1 G( r( k, c4 e- C. J) j   ( W4 {! W% p! m: T
   if(ret<0)0 m5 o) t& E; q
   {
$ v5 ?8 V! c& o; x" A- f) H" |0 ?2 M      printk(KERN_ERR "register chrdev fail!");
, q0 W8 z6 O- C) ~% o      return -1;
2 z6 N) {( f+ }" W! N   }+ o8 U' P  i8 m0 Q# H
   
( }) L! }, N9 Y7 c* C& s' H& s   mcbsp_cdev=cdev_alloc();
' H: J8 o0 V& e, L- d( w   
2 A: Z8 w& O* w1 A: [* @6 P   if(mcbsp_cdev!=NULL)
0 n/ T; e+ x) b% Z2 g( H/ d   {3 T1 l1 T' O* m: p1 P
      cdev_init(mcbsp_cdev,&mcbsp_fops);
# R$ U- x! [* t. D. L; e      mcbsp_cdev->ops=&mcbsp_fops;# u! Q" h- P( w  g
      mcbsp_cdev->owner=THIS_MODULE;
3 _0 h) Q, u8 n! [" @6 K      : D! `* ]3 ^$ B* E7 N
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! W) Z( h2 J- P5 [          printk(KERN_ERR "register cdev fail!");
. o# n' t0 s) h( ^# d# C      else. g* M0 O" ^; e
          printk(KERN_ERR "register success!\n");6 ]+ C, x) A8 U- s8 m$ s1 c. F
   }
3 ~5 J" [/ u) R  `   else( J6 |7 V; m8 m/ j
   {% K# _( K2 S0 t: Q5 F6 ~# X, |
      printk(KERN_ERR "register cdev err!");
. y5 P; c2 `1 ?      return -1;7 x& C. [- P  S, t- f7 G
   }) |" h+ [7 l7 f, A) ]0 C! c
   & ^' F, w5 A! t* A
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);4 g' \+ A6 s# a/ ]) M5 n. \; e# G
   if(IS_ERR(mcbsp_class))' a# ?+ |; ]" z
   {) G7 S7 \0 [; H
      printk(KERN_ERR "register class err!");2 `; ~" C5 p$ n, d, E. |; F
   return -1;
7 O* J3 |3 `" G/ B   }
9 g. H5 N* ?6 @! g; r6 y! C+ ]   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);+ O1 D+ O8 w$ q
! S2 z9 v6 P8 P& ~+ q
   //PSC% g: H: m  Q7 G$ s! ~! K) T! ^, r
   //add Enable MCBSP
$ t: _, V; G  ~3 r: D4 u2 O9 i   //test
1 Y- m1 n& I( W& _   temp = 0x80000003;
: F5 h- J, D9 e8 W+ v   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
, l% I# {+ M- B' p, o) L   temp = 0x00000003;& C6 w; B1 K/ f
   writel(temp, IO_ADDRESS(PTCMD_ADDR));; w# m* a& O% g$ k

, i0 t& W% d+ P3 q2 x. A   temp = 0x001FF201;
+ Q3 k0 y) v9 }3 I$ ]$ A% w   writel(temp, IO_ADDRESS(PDCTL1_ADDR));9 O5 [9 _8 j6 M8 K# ~
   / I) A7 z8 K' l2 J2 N
   //PINMUX  ) B) V  h5 \2 d# h& G+ m$ \% j
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,1 g' Q. ]! ^! C  [) M* Y* m
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
! \7 c+ D1 u; W+ ~   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   , d( p' A, e9 U0 W4 R
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  p- y7 Z8 x& v
   , Y& m: b6 i; o8 T: J
   //SLEEP_EN,EPR,L138_SHK1,L138_RC& ^; {4 J* P6 f4 U1 `( w
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  6 m: ~: m2 R5 P
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   1 s# M3 r: e0 M# }
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
" U1 G+ z$ d% c- y
; C* J" r$ d( v2 v   //RESETn,L138_SHK2
3 {- ]  n& Y$ u- K, Y7 C   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
1 Q/ }) w$ ^( n  _  Q+ U$ Z# u   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
5 b6 Y! o0 d& T% S$ |   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);7 b+ m# E: x8 g7 h1 |

5 h3 K) f! h5 n% Z( h/ k' g& V ) Q1 f- n6 Y& [4 r0 B$ z  j+ C
  //SPCR Register) E3 q8 M5 T  C) o- A
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset5 P) \% L  r9 ^9 {# q7 {/ v7 h. g  ~/ S
  temp = 0x03000000;//(DLB=0). h. q1 v/ E9 V+ W' F
// temp = 0x03008000;//(DLB=1)
3 o5 O( t1 S9 _2 p  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
' x7 @) {. c: x/ R6 R  temp = readl(IO_ADDRESS(SPCR_ADDR));, m- `# P( ^+ ~$ q% i2 D
  printk("temp=%x\n",temp);/ z4 }  x# o$ v7 f: l# O& ^

7 O) D/ d. h$ x# ?   //PCR Register: Z4 ~+ ^. l0 i. c  i
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
: J% ?2 b* l/ i2 E  // temp = 0x00000F0F;
2 ^, i6 J3 u4 E% t  temp = 0x00000B0F;* L+ S. y8 Q. P3 a
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized + C3 N' C# b% P* V
  temp = readl(IO_ADDRESS(PCR_ADDR));0 j, G. |5 {: E2 ?: ?2 l4 Q/ j
  printk("temp=%x\n",temp);  0 A4 S# S) y; a* m( H
   //SRGR Register
# |9 t  D" G2 m   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: E1 f$ r0 r+ I' b, ^ //temp = 0x301F000B;  k8 V+ f) {1 |. ]' C1 `
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ( L3 b; Q0 u, J' k/ X
  temp = readl(IO_ADDRESS(SRGR_ADDR));
6 _- K' `. ~" {7 m" L- M& N. P  printk("temp=%x\n",temp);0 S: z# p  u9 }2 E8 a: Z
   //RCR
7 K1 ]- m  K% d( D: V7 G5 F   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! u, x+ s5 r0 c2 V3 g
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0' d5 G# P7 P6 A+ t
   temp = 0x00440040;% y, \0 J& x6 U7 d0 x; u1 D$ s3 G
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   3 N& g  R: q4 k3 Z) ^# A6 ]% y
   temp = readl(IO_ADDRESS(RCR_ADDR));
9 }0 N! M# R% t) A; B+ {   printk("temp=%x\n",temp);
' _# I; a( s! f/ v* H% S   //XCR
# m& T+ a/ N# K# A3 f. Q0 G/ K   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% J* H  b6 M; i1 b0 _
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. L! B) ^$ N6 P9 {* D$ H   temp = 0x00440040;
& R, m: v# t3 i- e, X   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   % S6 O9 U8 [0 W4 @: U
   temp = readl(IO_ADDRESS(XCR_ADDR));1 s( O9 k$ Y- W* c! D
   printk("temp=%x\n",temp);
; J. [) K+ ?* `2 y  udelay(100);
1 S+ V7 q- ?* t  a  //SPCR Register" a2 w! ]7 E1 g! X: ]1 p6 M' H
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
/ b1 B( g7 b& x- v8 j  temp = 0x03C10001;   //DLB = 0 VS DLB = 1, e# |! p% _" {& o1 K% n0 F' x
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
5 p$ X' G" ?. Q$ q4 X/ K6 ], H1 q- t  temp = readl(IO_ADDRESS(SPCR_ADDR));& S; l4 h9 X; l* Y, }* u
  printk("temp=%x\n",temp);8 H+ S! P" l6 f  b- a
  udelay(100);
, t) U8 ]' [1 l( Q- q
" e6 r% ?; i8 s; x: I" t2 q5 h  //set GPIO direction! p- i3 d, q$ m" W. w. o4 S( F2 W4 F: k
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));' g$ _- `9 F; R6 K, j
   temp = temp | 0x00000100;//EPR----input
* c  R; ?1 j/ P; B8 D, z   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output  T" a3 n: D& g2 G& ?$ O- Z# T
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - w6 ^2 @8 z; |& r6 V) A8 X: v

8 U* z4 m/ ^  l0 ^3 i+ ?6 D2 V   return 0;. Y. x/ }6 n; u5 {8 w8 g
}
6 I9 r( M# ]9 ]" t3 e8 zstatic void __exit MCBSP_exit(void)4 c" ^+ ^' ~0 F9 o
{& b& t. e5 O' t- b2 z' ?  l( Y
   printk("mcbsp chrdev exit!\n");  I4 ^4 J6 K5 r) a# D( M
   cdev_del(mcbsp_cdev);! T3 R9 z! w) z8 V: s
   unregister_chrdev_region(mcbsp_dev,count);* [  m3 ?5 m# U' s7 n) F
   device_destroy(mcbsp_class,mcbsp_dev);  q$ p, u: |1 S$ z3 T  M! O
   class_destroy(mcbsp_class);
4 y1 c) u1 h8 g* d4 ^8 E}7 p$ c+ i3 z4 k4 e& b
module_init(MCBSP_init);2 ~" P  _! o) b& \( t# r  h
module_exit(MCBSP_exit);+ n/ v( Q1 {, j
+ y' ~6 u# K! s+ m  }7 l7 M9 _
MODULE_LICENSE("GPL");; j# V9 I( X8 `( E( h

% y# Q( @3 y9 [* m: x我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
8 F* }% t# A- U" n  T我的应用层的测试程序如下
+ ^' L! Z, }1 L#include <stdio.h>
/ K  I0 ]9 F2 X- a% Z6 d, y. ~#include <string.h>2 }$ `; t# a& i$ W1 g
#include <fcntl.h>  ]1 {1 _' i8 b% W  e% m( I
#include <unistd.h>
8 W3 j, g: K2 E#include <signal.h>9 P5 E: g$ M  s2 y' |8 s
#include <pthread.h>       //线程  o+ u% u: R- K2 @/ c
#include <stdlib.h>
# ]( w7 X- j/ t" A5 y#include <pcap.h>          //捕获网口数据3 @. s) U; `$ ~0 m: Z
#include <semaphore.h>     //信号( x' @3 m$ B  V  L- y/ J' y
#include <sys/types.h>     //消息对列
4 }+ S9 a( h0 y6 V1 h#include <sys/ipc.h>       //消息队列3 i% X2 b( j0 Q3 A! ]- S" ?* m
#include <sys/msg.h>       //消息队列0 f* u% G1 W9 F2 [6 y
#include <sys/select.h>
# G# x0 E3 S) k0 J#include <sys/syscall.h>) n- d7 N% V( Y
#include <sys/stat.h>1 I, L/ c& X5 T' @
#include <sys/mman.h>8 H. s+ {' h! e; ?
#define msleep(x) usleep(1000*x)
: p! D5 H# f4 U; p: R
  n0 Q7 H) {5 P. Bint main()
1 y5 j. T  M  K$ l. m7 \{
2 g4 h2 I5 V; u# C    //MCBSP,ARM与AMBE2000交互设备
7 X2 n( z0 j8 C1 I int fd;3 w  U& M2 e- G5 W
unsigned short data_write = 0x5555;& ]+ b* c( Q7 m7 j7 X+ P8 V" ~
unsigned short data_read = 0x00;# c* Z! [2 H# ~6 k5 U9 S3 `
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
4 x' L5 z5 _. Y1 H //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ i) G* p( Y( N4 e. q: c0 d' B   
  L  J( U# F% W5 \5 _, u  if(fd < 0)  T( n! K& P) j6 b& [8 b
  {0 j5 V# s1 S9 R3 ^, Y# M
     perror("open failed\n");
0 Y% \# ?' I, C) C9 q0 L     return -1;- d# U( N8 N/ W% x! M9 t
  }5 \% W' p2 C4 v/ T. k# D
  7 N! q0 k# N8 i6 W
  while(1)9 {* O1 \% A% G+ R5 k! U. F7 L$ q
  {
8 M+ [% X$ i( u   
- ^! G" }2 w  M8 f8 r   //AMBE2000每次读写是24个字为一帧
0 f) W6 n+ Z* P/ m   //写数据时将数据在底层存储起来,等到中断的时候再发送
6 s; @" T4 `& [/ E2 S   //AMBE2000输入数据是以0x13EC开头的
3 h2 n. O9 v7 W. {- N& K   write(fd,&data_write,sizeof(unsigned short));
) _4 W& Z: V; X6 J   7 F* @: p6 a8 n$ ~+ u
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  0 E6 \6 y' {& P8 y5 s# L+ f% _8 V
   read(fd,&data_read,sizeof(unsigned short));, v/ N& r8 [; i8 P/ M( h' b
   
3 c2 ?* {: k! H9 q$ t   if(data_read == 0x13Ec)5 W/ m4 ~. ?- M/ s: ?
   {
, A0 C4 y( G/ U. O+ V. n; _   
: p9 q, Q" _. B2 Z  B& x    printf("data_read = %x\n",data_read);* ~) U% `: E# i- z/ J
   }. f. Z& R# T0 k* v2 l
   
7 q8 K  ]( `( x; s% X6 U+ m; K- y! o   msleep(10);& M+ d" C) ~) V% A' m# C, q
  
- J9 O2 X/ Y1 V3 U1 w" q9 w  /*
: y$ O2 [/ `, @6 A- d# \   ioctl(fd,1);   
& z3 O! G! G3 k' n- O. m- Z2 K6 O sleep(1);
+ Y- Z. l! }! k: q0 n) Q ioctl(fd,0);+ _  }% \1 q' z1 l$ m
sleep(1);
7 h; T) I6 j6 L9 i  m0 @8 u1 { */ + K9 M7 ?, z/ g8 S
  }   
9 p9 x" Y4 {) H8 y return 0;$ e8 _9 C+ I7 u2 U( H4 d

0 n9 Z5 P  \4 @9 s! v5 k/ p}' E1 p, x. ]5 t* h$ L. o4 C
7 U! j3 u) N) }, e0 V
多谢各位指教,谢谢! 急7 c+ y5 E/ x. Q4 {

% A7 s3 m2 j; t; Q/ @/ \+ z4 k
0 h' h: o; p# F# Q4 q# v% J+ q2 l* U& `7 Y5 b1 X' l; C

& t0 \2 S* A, C9 Q! P( _2 a( v* j+ \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 03:35 , Processed in 0.041825 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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