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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
+ R; }' |( m3 W- D6 V3 f2 `/*/ z8 n: i% ^$ y/ V
* Copyright (C) 2009 Texas Instruments Inc  W  i2 l- W0 |) _0 V. V
*
. J5 b; t' a0 J * This program is free software; you can redistribute it and/or modify
/ X0 w, x7 T$ d3 ]0 W' {  | * it under the terms of the GNU General Public License as published by
8 W7 ?) w* g$ t0 A, s# m( @  j * the Free Software Foundation; either version 2 of the License, or. _8 g3 g! c) |; Z5 L
* (at your option)any later version.
  ~$ m: h$ L8 I; P *
5 E' w% R4 c% j! T+ q- \$ ^ * This program is distributed in the hope that it will be useful,6 o! r+ D4 N. S* g
* but WITHOUT ANY WARRANTY; without even the implied warranty of
3 g# R. s: O: C" J * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( X9 L; Y0 i6 i' C5 I * GNU General Public License for more details.0 }  R* u# v6 [/ i) C6 R
*
: i- ?5 S) X. X- ]0 y& b2 [2 e4 s * You should have received a copy of the GNU General Public License( X8 ^* q; M8 G3 g
* along with this program; if not, write to the Free Software
2 I8 F& [5 G8 R- a+ |- l, {  P * Foundati( p! G" _* k, Z3 R& v4 S3 |& e# @
*/5 L  f) j. h0 c! w3 t; f; y
#include <linux/module.h>
( S# d* [% j# I5 G+ T2 ]* [#include <linux/init.h>
+ H6 m, s8 i3 j8 O* U7 L#include <linux/errno.h>
3 B1 `3 H5 _( o+ y#include <linux/types.h>1 L# U' K# S9 o- i; K  ]
#include <linux/interrupt.h>5 ?! }9 W* U9 i9 ~. o# |
#include <linux/io.h>
8 d1 A4 b, x- V( a+ s; h. G, T0 p% L#include <linux/sysctl.h>0 ~# X' U7 G: g- d" s4 v2 G$ ]+ n
#include <linux/mm.h>" i% g) }3 d( y% i
#include <linux/delay.h>5 b/ j- o8 B$ d/ ?
#include<linux/kernel.h>
" G! ^0 D& i% x6 _! G9 ^9 W# w#include<linux/fs.h>
+ f9 r' q, z2 |& |* T#include<linux/ioctl.h>7 K- \, R9 b4 a
#include<linux/cdev.h>
. j* Y  D5 J  `#include<linux/kdev_t.h>
! p, h% l$ s2 i* u#include<linux/gpio.h>
7 ~/ i. p  \# t% ~#include <mach/hardware.h>. ^* j, h, K8 i
#include <mach/irqs.h>) n& v5 C" A' e, ]2 |
0 T% Y0 ]) t+ R0 @
#include <asm/mach-types.h>
* X! i2 q9 Z" N8 f8 E#include <asm/mach/arch.h>' I" M4 p: c# W6 t' C& c! N8 U
#include <mach/da8xx.h>
( E4 y- g. _$ l# t  l#define  SYSCFG_BASE   0x01c14000% a: f8 w+ L% ?% ^- h& O
#define  PINMUX1_OFFSET   0x124 0 }: @4 X' |' |: K' J/ ?
#define  PINMUX18_OFFSET  0x168 ( p) i7 H# Q- b- r3 n7 ]0 X' }2 b" I
#define  PINMUX19_OFFSET  0x16c
/ u. ]( @7 ^4 n3 Z7 r  [#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR6 [' n) ^+ ~" t
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR* [5 R1 w+ |3 ]: Z% n7 V8 m
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
1 N/ V7 n9 c# d#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
# ?* U. |: _$ [9 H! I: P#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR' U( v( U. u  X) ]+ K
                            5 b4 _0 O; a, @, \) S4 t7 x: U# v
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
! {$ W' a: f& C/ ~" h/ H: ?# [4 e( H#define DRR_ADDR      0x01D11000  //MCBSP1_DRR# ~' c5 t6 V! {$ C8 y' _6 ?0 y* U
//PSC
" U' r$ N4 P& ?2 A7 a#define  PTCMD_ADDR   0x01E27120  
+ `- l6 H, Y$ q! N# U" P! R* A#define  MDCTL15_ADDR 0x01E27A3C
9 C6 F! z# x$ F3 q% T#define  PDCTL1_ADDR  0x01E27304
9 [1 K2 N* t! s//GPIO8 direction
% l3 J- U7 [' X#define GPIO8_DIRECT  0x01E260B0
+ W0 I% x) E3 Q) L#define GPIO8_OUT     0x01E260B4: B1 o9 _* Z0 Z' ?
#define GPIO8_IN     0x01E260C02 M  X" H) u9 C* y! q
5 Q0 y. k" {, r; C
//#define MCBSP1_RINT    99              
: D" G) l3 m" A# |2 r* }" c//#define MCBSP1_XINT    100  * J  M. R0 b. I
static int MCBSP_MAJOR=239;
! J% Z. {$ M9 V& ~7 Astatic int MCBSP_MINOR=0;
) p# s. m5 t! T+ x  Lstatic int count =1;
  [+ g8 U! w8 T2 |! N! h
! A! p: `, o. {2 r7 r& n* ]#define MCBSP_NAME  "MCBSP-device"
1 y; j: L0 u& w) u. l2 E
9 x: l, u; _3 W1 n) Cstatic struct cdev *mcbsp_cdev;7 Z  Z* H0 D# T( M! N# Z
static struct class *mcbsp_class;
* f0 d) O7 x* S, o/ g- i, f, }static dev_t mcbsp_dev;
1 R* ^! z- b- I" W, A6 Iunsigned int DRR_data;  M3 Q7 C: w0 G6 J
unsigned int DXR_data;
" C& Z' d' e/ J+ O/ A4 }static int mcbsp_open(struct inode *inode,struct file *file), [: J; V' J- o% L+ `8 A+ i
{5 x5 x: P7 n& P0 i
   # C: j( S( Y$ }: C  u  X
   //interrupt enable,initialized
  H% u+ q0 j/ E: M( R1 f- x   unsigned int temp;+ _7 B4 J& X6 D5 C  T2 s! ]
   //SLEEP_EN(GPIO8[10])---0
( a# F1 ~  Y0 u* @3 r, r# `   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ c" P3 S- o; \( J% S+ B# ?   temp=temp&(~0x00000400);
, i' [8 }5 a9 z* K   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
0 M/ M0 p5 a. S4 s( d7 ~& L  //RESETn(GPIO8[8])----0----1
* A0 w( w. b* {/ s+ Q2 ^* P   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 V) Z" M5 }# e2 _7 U# X- i3 K
   temp=temp&(~0x00000100);
. a5 n% m0 D% @% c2 g- c   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
% l' p5 i# ?, E$ ?1 w4 V   udelay(100);
5 b/ T- K& p. {4 G+ ^) B   temp=temp| 0x00000100;, q4 G( S1 b! f
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1! r3 W) ~+ M2 x, G$ ~9 w4 r: M! ~
   udelay(100);5 Z" K. o3 b/ g( V
   printk("open success!\n");
$ R1 \( Q' O: G6 }4 J1 p: `, T   return 0;
5 M1 b. @# B' Y& g: c% u% E% Y}
+ f3 Y. l8 H( o" ~8 o- d) X. a" a/ x+ x7 u" e' p
static int mcbsp_release(struct inode *inode,struct file *file)4 |# H+ f* S5 I) K
{0 u- t9 g  P5 B4 ^
   printk("release success!\n");6 P) p. E4 q0 ^
   return 0;
6 c- i7 @% `5 ^3 {+ ^. u}. W5 u# D9 U- y  r% X

  t- X1 g; q1 B- K8 p$ nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 s* U; e1 P+ `: Z/ d( ^, C2 X& W{9 a4 R9 z, ]/ o3 l
    copy_from_user(&DXR_data,buf,len);, o8 T% a9 Q0 c9 s3 X
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       - F) S1 I, l# A7 j- u$ f7 t) a$ W
    return 0;
: H8 E& n4 v0 G/ ]. V1 ^$ a
$ y: B; A6 H; J}/ u+ w9 s$ W# ?* u/ _7 ?& C. E
3 t+ X; m* a0 n' M# x) X. ~
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ s2 R. i/ o1 M$ j4 L
{ ( k5 I: T: n4 h5 c$ t
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' R( M" w4 U4 {/ X, @, R% P: ~* [   copy_to_user(buf,&DRR_data,len);
: Q8 L( e" K' e1 h. N; K  `   return 0;! n3 _7 L& b  D' g  F& J0 B4 U
}
! j% A- p8 n1 k; d; R% U
$ K; d- @; d2 {9 _  {7 H
% m: W2 b, |' M8 K0 _& @. l; ostatic struct  file_operations mcbsp_fops=- `5 L# I! _( W5 u
{% c! I, c7 p$ a  T
   .owner=THIS_MODULE,
4 t& G" T0 g9 m1 x   .open=mcbsp_open,) M1 E3 A$ g1 H2 m4 K6 Q% \
   .release=mcbsp_release,
1 M$ |, e& v0 l8 E, B: d/ t   .write=mcbsp_write,2 F: S8 @! S- U. |( c' O
   .read=mcbsp_read,8 a  ~3 w0 S' z: Q2 i  R0 M
};" k1 ]2 q; J9 f* F! A. H  a
static int __init MCBSP_init(void)
. j$ v4 R/ t5 K' g8 w' B{
1 Z6 P4 I; `( @7 a: `+ |   int ret;
3 Z: s% f4 C0 @8 a4 n/ C4 f   unsigned  int   PINMUX1_REG_old;
) G8 e  V; B) }& f  s7 T   unsigned  int   PINMUX18_REG_old;
) Y7 S% ^4 j  }. K% A   unsigned  int   PINMUX19_REG_old;
# s9 j0 x3 d$ L  H6 O/ ^. E   unsigned  int   temp;  
& r, {( D6 h5 r+ p8 @4 ~- [9 x0 v   if(MCBSP_MAJOR), I9 p2 l7 F: o7 S  ]
   {
. X6 G. H; |; v7 E) X* U      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
; Y0 ]- g; v! ~, E      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ }( R% @) L% C+ p   }+ u/ J! U7 o. l  l8 k2 K: Y$ K  q* i) v
   else/ C- Q+ A9 _( A, P, l5 A
   {! c) v* L0 @( a8 U' m/ z- W' u; Z# s
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
; V  W8 ^: D; Z      MCBSP_MAJOR=MAJOR(mcbsp_dev);
+ W7 C* n& U0 l& S0 C  K+ P; R   }; S9 H, J  ?* R6 k0 H! @+ _: Y
   
) H( T* n. a7 w" b, ~5 k$ e0 c7 h# y% E   if(ret<0)5 G8 q, R& I7 J
   {" d; C; y+ ^9 u2 I3 b4 }
      printk(KERN_ERR "register chrdev fail!");
& V, ]  [5 W. S! c7 r      return -1;" W, J6 K4 `8 {
   }
% }" X" L% r- n4 O: |   
* H) ~) t3 x" J0 B0 Y" U   mcbsp_cdev=cdev_alloc();
  i$ K9 }' P; P+ n6 N" R   
- l3 {4 r( Y1 d) I$ c, N8 H# v; _- N   if(mcbsp_cdev!=NULL)
) M" w8 p# U7 s4 E+ C( Q8 A; ~0 n   {
( E1 w5 X% ]$ \2 a& ?5 d      cdev_init(mcbsp_cdev,&mcbsp_fops);& j6 \* t' x. `
      mcbsp_cdev->ops=&mcbsp_fops;5 Z" d: P/ G% T
      mcbsp_cdev->owner=THIS_MODULE;
1 o, u" a) S; q      0 o% ]! D: t5 P. a9 [; a$ ^; O
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
* O7 M. p( c( h! j) U- V          printk(KERN_ERR "register cdev fail!");  z1 S( @$ q1 O+ [6 l2 l0 h( c
      else
" z% N- H5 z7 m% K& f' w          printk(KERN_ERR "register success!\n");
( O# o7 R. n. k7 [; `   }6 J9 |9 q( Y2 }/ a$ d! c
   else. y) @& q" ?; j) Q
   {
, J. C+ h, C3 Y5 w- ^      printk(KERN_ERR "register cdev err!");
' S3 n5 k) L/ t4 s0 y; u* {5 @      return -1;: l; V) o) G3 H$ X, y. O
   }& g( }3 [) Y( w/ e
   % k7 M; A! |* Y1 A4 I
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
+ `2 L. @5 u8 j5 n4 m6 ^   if(IS_ERR(mcbsp_class))# I( f2 `( C, M5 _/ _5 }
   {4 t: B/ c2 ?4 ?' x& T( J
      printk(KERN_ERR "register class err!");
7 P% Y$ B* i( e3 a7 j5 O   return -1;& t! G7 Z8 S$ `
   }
% _) B4 g7 K  \8 `3 K   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);4 w7 t" A& X; A4 }" y) R" A9 l$ F

. T4 T$ i6 H" e' C6 ~2 U0 ?7 h   //PSC
; O' `+ o7 G4 t0 S9 M4 P$ R9 Z   //add Enable MCBSP0 T. Q5 K$ v. Y5 N1 G
   //test7 y2 l( p5 w, F
   temp = 0x80000003;
7 @( r2 m& f% C! U   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
8 g6 [) V5 v% D) d( G+ W2 L   temp = 0x00000003;" ^! G. X: S: `$ ^
   writel(temp, IO_ADDRESS(PTCMD_ADDR));8 T% F5 G! \) }
6 v! }  A1 J! `; |; a5 l# g
   temp = 0x001FF201;# p. A; M3 O* h) I
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
6 K$ ?0 D' B: Q  g   
  _6 J& o. S- F  ~2 x' }+ o0 v0 A   //PINMUX  7 Z1 V3 `5 l9 X0 i5 `
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,+ B# {! r. \/ R! p9 u
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
, F1 T2 h' n2 P  R6 x7 I* E   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ! F" |* n# k; _3 I
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 l  @2 ?, s# {( x) @4 m& b2 [   / Q5 @0 |$ z3 j  B' H& d' U! w
   //SLEEP_EN,EPR,L138_SHK1,L138_RC9 ^% b0 N& Y) x2 N9 o) ?. U
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
" U+ Z5 b4 X1 m  h, s8 ~( z   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
( J3 g+ x4 @) |9 K; z   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ P$ y8 K* c+ k9 E$ t' Q8 X# ]" P6 e 4 X  Z) o) v3 j, i* U
   //RESETn,L138_SHK26 U+ T+ v1 m8 K0 K& x$ e; l
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  $ L  e) _1 u) F
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
  B( q, r1 ~: r' ^( I6 g- p/ b   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 M; g! U2 `6 t4 z & u, d, u! p" o* q2 t" [

# N0 I# @) \2 w5 s7 x  //SPCR Register' O5 R$ n' H% T& g+ W( N5 X
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 s/ s7 ^: F% @+ d  temp = 0x03000000;//(DLB=0)$ P! A& g! L. ^& L6 `' ?) P
// temp = 0x03008000;//(DLB=1)1 l3 r3 U5 ]2 v% x% s
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
6 l9 J0 x. l+ }' `& `  temp = readl(IO_ADDRESS(SPCR_ADDR));
6 Q) b  H8 }: a% J" q6 U  printk("temp=%x\n",temp);' V+ m9 H1 j9 T2 v! _, G
! V8 k$ G1 {; P8 O
   //PCR Register4 w/ U1 x1 p/ o& k/ |
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0' s6 t" f$ O8 W- g7 f
  // temp = 0x00000F0F;
/ a! {( S9 R+ Z' Y& ^. s( C  temp = 0x00000B0F;" C$ m3 r* k3 k* e( c& N3 G3 r
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized / ^& b: |3 m& {( T" s" p7 q
  temp = readl(IO_ADDRESS(PCR_ADDR));4 `5 k3 G# I8 |  R3 P
  printk("temp=%x\n",temp);  
8 A' _) U7 s% g   //SRGR Register
$ x( \3 ?" ?- X/ j% D8 e   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11% f- L% @' G8 r/ L2 K' M) f) Z
//temp = 0x301F000B;
! p, p) Q3 B& O. ~   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
( x' o1 f3 Z1 s7 Q/ b0 }- `% h  temp = readl(IO_ADDRESS(SRGR_ADDR));+ e: Q3 _$ H3 c) G
  printk("temp=%x\n",temp);5 ^2 N! ~' x9 Z; l
   //RCR
  t2 j3 d7 V; ~! n* N7 b1 i   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,* X1 U7 I6 F6 H! ~! r6 S
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" m3 X* `, H9 A( r
   temp = 0x00440040;
$ Y( h2 ]+ G4 i" `) r3 S5 d1 f   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
* w$ Y6 \! P2 M' b( C/ p   temp = readl(IO_ADDRESS(RCR_ADDR));# G$ R3 m0 _0 x2 L$ Y
   printk("temp=%x\n",temp);
$ f9 o9 H. Z% E   //XCR! m, I/ y5 j: V' y( }. R
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 t9 W0 ?' ]7 h& M2 ?' O. l( Q
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
- X; S8 R# v$ v4 L   temp = 0x00440040;8 i. I, `9 B- [8 B& j3 V
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
3 a: x' K$ W' A   temp = readl(IO_ADDRESS(XCR_ADDR));
4 j! I; A: x; l& W   printk("temp=%x\n",temp);, r" A) I( k+ q5 N$ M" y9 w0 L: [
  udelay(100);# A' A9 j. Q7 P" G
  //SPCR Register* r0 a% f+ O1 o1 C
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 e8 o2 c8 E( P7 d$ r
  temp = 0x03C10001;   //DLB = 0 VS DLB = 19 I1 V8 k6 J; `& F
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
2 v" }1 I3 C+ _5 L2 A6 T4 k7 Y  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 \0 G$ w, ~6 `  X- S  printk("temp=%x\n",temp);" l. I6 p+ o" m# X$ t) y
  udelay(100);
9 M! v  p1 h3 e: X+ g
3 K$ y- l4 i8 a: ~  //set GPIO direction
( {% b' M+ ^( E) {# B) }   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- u/ H( G3 l$ M: v9 Q
   temp = temp | 0x00000100;//EPR----input) h7 O( C6 U0 n( d9 e
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* ^6 m* H8 t, B' T
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # N' P! j+ @  t) k6 n& q6 g

& j1 L! z5 a- g. B6 b   return 0;! U3 N; b" ]% `) C' Z! W
}4 k( q' ^# k' L; E; K/ K
static void __exit MCBSP_exit(void)
3 C8 S) A" d1 W, t{2 Q. n( T' p8 L* m  N
   printk("mcbsp chrdev exit!\n");$ r5 j* |3 C6 B7 [/ M4 k
   cdev_del(mcbsp_cdev);
1 l) b- R" t: ~  _! H   unregister_chrdev_region(mcbsp_dev,count);
4 \' z: y: v1 N  A) R9 L7 o   device_destroy(mcbsp_class,mcbsp_dev);, J6 j( w3 I5 F0 R' j
   class_destroy(mcbsp_class);& ^" ]: {; N1 ^
}
. u% k; S8 v, ?  Tmodule_init(MCBSP_init);% s$ \% d' q( N3 p$ F$ G) b7 |
module_exit(MCBSP_exit);
' |+ V  P- ]3 @: D0 q' D$ D) [. [6 _; T6 F( W" J) ~5 V+ a. C! l
MODULE_LICENSE("GPL");% }5 j; n' g. E$ I

0 Y9 ]9 i$ ~* f3 v( p$ h; n我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。$ c! m1 c9 W9 p, Z# p% y
我的应用层的测试程序如下
4 ^- e- P' j: Q' ~. `* A#include <stdio.h>" ]+ a- r8 d8 Z+ E0 C/ m
#include <string.h>1 A+ z/ D* k, g! D/ {
#include <fcntl.h>
+ j# `5 k. y9 H7 m#include <unistd.h>) ^, j- S$ o- E
#include <signal.h>' W6 b0 z# G- |
#include <pthread.h>       //线程0 a. b5 e! o/ s. I; Q& {, j$ C
#include <stdlib.h>6 W; Q- a, {- g9 R9 ^$ ]
#include <pcap.h>          //捕获网口数据  Y( g" u9 t5 \- h7 y$ c; w
#include <semaphore.h>     //信号
* q: L# c9 W0 Y& y1 |1 f& }#include <sys/types.h>     //消息对列
+ W- I7 n0 r, T2 e0 o+ i#include <sys/ipc.h>       //消息队列
9 N% F6 T$ M, i/ J& ~- k#include <sys/msg.h>       //消息队列9 u3 D( a$ C; _9 K( N+ N7 ]
#include <sys/select.h>0 A6 r8 h# g  [* g) I
#include <sys/syscall.h>
) p8 x1 s* }: Y( [; t( F3 y- L: V#include <sys/stat.h>5 G; B0 c5 W3 b) e& }( ?
#include <sys/mman.h>+ i9 e% r. q0 M- `8 p' o  c
#define msleep(x) usleep(1000*x)
8 s& S4 m& ?; v  O- X! _
8 ]# Q$ k; s  Y' i5 i, A( Pint main()3 }  j5 Z: \. p( ?: b
{
2 c* i( M, E- S% p. L    //MCBSP,ARM与AMBE2000交互设备8 [7 _; I5 ]  v9 B
int fd;4 f9 w) N' s8 q( t- A. I
unsigned short data_write = 0x5555;
' z$ r* `8 H) t4 k" R0 Q unsigned short data_read = 0x00;; p( q- \5 m+ p! s: Q/ @! w
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);) e  w! x: j0 ^4 _$ }7 t- K
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 r& U/ L1 K" j+ G   
4 [4 b- I' E+ H' w6 ?  if(fd < 0)
. Z8 V% I* p( D% K) A2 U% K  {
# y) {& Y2 Y/ {     perror("open failed\n");# S; f. B6 a# K6 u6 T5 k/ a9 E0 t1 V
     return -1;
- Q- |8 q3 _! e! g1 t  }
. ?( w$ K, A, O: _1 h- m! P  9 {3 y4 F8 E4 P
  while(1)& s1 K3 p, p7 R, {& M0 |
  {
+ h0 k9 q# `" D& R5 I" @   2 U6 o" |4 L1 u6 }
   //AMBE2000每次读写是24个字为一帧) \! z( `/ A& j) H
   //写数据时将数据在底层存储起来,等到中断的时候再发送
4 Q, n+ z3 d7 b+ m% }5 {/ y9 ?4 f+ i   //AMBE2000输入数据是以0x13EC开头的
. ], y, \4 D' C- J$ O6 y+ f1 E   write(fd,&data_write,sizeof(unsigned short));
6 g, p3 ~# m5 ^2 d   
, w; `/ \# g4 [2 ?- z) N   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  , _6 n' ?$ n7 h8 c% ^
   read(fd,&data_read,sizeof(unsigned short));( g0 U3 j  M' ?' H6 r
   
0 R8 G3 Z( E: Y! G6 S, T! M   if(data_read == 0x13Ec)
6 b, f: Q0 M2 j* p   {1 Y) Z! E7 h4 B7 |% q
   
. \/ x# x' u7 Z* z- {    printf("data_read = %x\n",data_read);0 v: ~6 w, o$ ]) ]: O# e3 S
   }: E. ^* S, f7 k" [8 B$ J7 Z
   
6 W+ o5 k3 o- a   msleep(10);, D2 I; a" Q' P1 h) ~; L  T# i8 w- `
  
5 d/ Z. ~5 p% H5 X5 X4 L* l$ _+ e& Q  /*  o3 m' ~( y$ I0 ?+ Q5 F. F3 E
   ioctl(fd,1);   
0 ?  N4 W! q" U& u: Q- c" e: c2 N sleep(1);/ P; S1 J- Z, ]! E
ioctl(fd,0);$ G! ]/ r- |5 w4 z3 R
sleep(1);
& ~3 L, S$ W% ~, c! X+ @ */
7 u% K, o" m  x2 P  }   
: ?* B6 a. F" ~5 B3 Y return 0;: O: k* r1 E5 r2 G" a

9 s. c! ?8 P  p% X! g3 g$ Q/ H}
5 z% R: R) l! `! ~9 o4 h3 k- S6 J  y5 H9 F
多谢各位指教,谢谢! 急
. d* P$ P, J0 w  u( R2 i" ?' M* M

& k8 g* T0 I5 L6 M6 x. E& N- p' @7 j; u6 }- N

, c( a8 d4 x' J9 _. q
) n/ h( R% _2 `: {. `  h* H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-15 22:37 , Processed in 0.042031 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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