McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
  f* p- u% q5 Q# w  F/*
4 f4 m2 r3 A+ [) u! g * Copyright (C) 2009 Texas Instruments Inc
1 g: {' V" t. t* t9 i *
( R) G; _% s0 d8 t% }6 m. l * This program is free software; you can redistribute it and/or modify/ B% i" f3 t0 s) t9 p
* it under the terms of the GNU General Public License as published by( `" H0 y( x+ e5 F
* the Free Software Foundation; either version 2 of the License, or
4 B9 ^, ~6 ?/ |) ~/ u * (at your option)any later version.
. @) M9 A8 H( {) b *" t! t9 R( S$ k. U# z. j# I/ E
* This program is distributed in the hope that it will be useful,
* S, I4 Y3 f; Q * but WITHOUT ANY WARRANTY; without even the implied warranty of
' j$ q- ]$ W+ ]$ l5 i8 N  G: [5 A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 n1 C+ @( J' @& O, l * GNU General Public License for more details.
% G6 D$ F+ B7 ~/ f *
+ D" K* B6 U- P * You should have received a copy of the GNU General Public License
3 g. Y4 [5 O0 x3 G1 j * along with this program; if not, write to the Free Software
  p: s2 X, F1 f$ u3 ~* C* U * Foundati
4 B. {& ?: C; ?& |. p5 F) \+ V*/
+ _" X2 n0 g5 e! P% [: H" `  K/ P#include <linux/module.h>- x% t+ W- y9 p+ z2 B+ E/ D
#include <linux/init.h>
7 i8 H1 i/ g% x) F- h#include <linux/errno.h>- c) {. c, M0 Y1 A1 F
#include <linux/types.h>
$ Q5 X& Q& U' N6 S' X" n0 F#include <linux/interrupt.h>! {1 e" l0 F+ F7 o7 \( e8 @
#include <linux/io.h>
3 B! D" m2 C6 b+ `$ |+ K#include <linux/sysctl.h>6 f) Q# k$ l4 l2 ?
#include <linux/mm.h>
& c: B" B6 b3 r- `; j( ~#include <linux/delay.h>& P  O7 @- V' `9 R  @
#include<linux/kernel.h>
. l5 Q! h6 E1 J6 Z/ l! L* M' t#include<linux/fs.h>
9 _2 \" J# _7 k* [& f3 X& z" W#include<linux/ioctl.h>
0 ^) |6 J" t. `4 w0 L#include<linux/cdev.h>* U8 G2 ?* `; _- {6 r' p/ q" x
#include<linux/kdev_t.h>
8 C- {. M, l9 O8 Q2 X( E#include<linux/gpio.h>
; A( J3 s! @0 m& F% X#include <mach/hardware.h>
, i" Q6 o- V0 w' n3 M8 }( k#include <mach/irqs.h>
8 _. w3 C6 K7 l& o) V6 o
! V: ]( Z5 A6 b2 h. f% h% G#include <asm/mach-types.h>% s$ _9 ]9 ]5 S
#include <asm/mach/arch.h>/ [6 q; N6 C4 a) z
#include <mach/da8xx.h>
1 a1 S) \$ X& n1 \/ g- G! B6 C#define  SYSCFG_BASE   0x01c14000( @& w: g9 r- e$ X: }. \
#define  PINMUX1_OFFSET   0x124
4 R% G$ p( B2 ?; }% f( X) M+ l- [$ z#define  PINMUX18_OFFSET  0x168 * R7 }$ S/ T; m! t% p' \. I. q
#define  PINMUX19_OFFSET  0x16c1 x/ `% H0 T$ p! ?/ @
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR7 I% d; |* j) w/ z1 |+ _% g9 c
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR! o' v, c" l, J# Y* s
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR  ~7 r. X) N# X# `- {/ \9 @% b/ _
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
& L) W" K$ u" U0 A: M; [#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR8 I( Z$ `4 B- U" ], l4 j
                            4 @- C  D7 R, j
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
! p& n* c: t9 _& D. U#define DRR_ADDR      0x01D11000  //MCBSP1_DRR3 O/ Y8 H+ n$ V% T$ }& j5 i1 {. J
//PSC
& e$ f# ^5 O' e8 l/ _) S: j- c#define  PTCMD_ADDR   0x01E27120  : D+ K! `9 [0 L4 l
#define  MDCTL15_ADDR 0x01E27A3C2 B) J+ G0 Z: d: i6 N
#define  PDCTL1_ADDR  0x01E27304
; l; L& W6 }& Z/ @& i8 P* m) S' S//GPIO8 direction
2 ~0 _6 l# x. C$ _6 B#define GPIO8_DIRECT  0x01E260B0
9 [) p# E6 A% S8 w#define GPIO8_OUT     0x01E260B4; |& ^$ s8 |* P$ Y% o  d
#define GPIO8_IN     0x01E260C0' |/ N' E, b0 P, C

: h3 g9 Q+ O% f5 {: i& R//#define MCBSP1_RINT    99              
" d7 W% e6 v: h6 j. P//#define MCBSP1_XINT    100  : A$ P; o6 ?5 e6 i/ ?8 c
static int MCBSP_MAJOR=239;. e5 M8 ?6 Y" m& O) v
static int MCBSP_MINOR=0;
/ n) g4 f, B0 }, e: estatic int count =1;( E% i$ U' Q1 i1 J

  u! o* C5 e! v* \  `#define MCBSP_NAME  "MCBSP-device"
2 l6 X0 w( y) B0 k6 w5 V5 b
' Q; j5 @: K; Wstatic struct cdev *mcbsp_cdev;' N, Y* W8 Y* j! v- g4 j: Y
static struct class *mcbsp_class;
2 W) }- E# ?. w7 O+ J( pstatic dev_t mcbsp_dev;! A" |$ u6 p  N! K1 n# V$ U
unsigned int DRR_data;
! [! ~: h) t* P3 d! Yunsigned int DXR_data;
! v% X; i' U* L; d# K8 hstatic int mcbsp_open(struct inode *inode,struct file *file)( v; `6 m+ b5 j- M
{
  L$ {. W* C- g4 C* g( o( q% i   
5 N+ ]$ r  j$ A( {/ I* A% b* w   //interrupt enable,initialized' g& ~' _& _% X8 q) h, x
   unsigned int temp;
5 H$ [# K6 K% K0 {   //SLEEP_EN(GPIO8[10])---0
8 f, k) r! B* z* m. @, }   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' A; g( I3 Y7 h( X
   temp=temp&(~0x00000400);
& v; A% p# p. Y0 B$ A   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ e* s3 \3 y0 K  //RESETn(GPIO8[8])----0----1
1 |  D1 K! l+ b$ N8 R2 V   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 a6 q* e: K% R' R& n' Y
   temp=temp&(~0x00000100);. L/ N! P' ?& W! w% n4 c* N
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 U. I7 j. X) A! c0 Z" ]3 ~   udelay(100);
0 s, [8 g, m; K   temp=temp| 0x00000100;
" ]3 r* l8 f" W5 a& ?8 q7 `   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% D' p, O+ D) {3 P9 ~
   udelay(100);; p* Z4 `; Q& ?3 O: B) j' X
   printk("open success!\n");
3 m$ f7 }, ?8 W  `7 n   return 0;8 R( ]7 I% H, u( ^2 P+ `, d& m' ]
}
, d  Z/ l( _: z
% f3 f! j% |4 T7 D' ~static int mcbsp_release(struct inode *inode,struct file *file)
8 O7 ]+ ~: |, w) g) ?/ d{& R5 Y& Q: b3 s5 j$ g/ J
   printk("release success!\n");
/ D' l( x0 M' n6 P) O   return 0;
$ t/ [- p) N2 V2 ?. E}3 i/ o: O$ a% F1 k$ V6 C9 R

. a' N& X, h8 w& Z1 Estatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 f2 n) ]+ i$ R: w
{( @1 a7 z8 t& c4 U
    copy_from_user(&DXR_data,buf,len);
, l$ o4 F4 t3 k1 F1 A    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       9 x, C  G0 t" L9 C5 L4 n
    return 0;. d2 U! c2 v8 w& V9 B- |0 J" J! s
3 v- [1 s4 [$ ?
}6 K' g: Z, `% L6 J; i2 ~3 C
5 k- H4 ]5 G6 R+ _3 s
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: [4 z$ z% z. j{
  k# ?! G4 Z3 e7 C" \8 y) {   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 Z2 ]* O: {4 G2 ]" ?$ G) H/ ?   copy_to_user(buf,&DRR_data,len);
; V% X$ G8 K) j0 Z! S& X) A   return 0;
$ Y$ h  V+ Z! U% c% ]( a}) L& {/ w  `, ?3 Q; N

& K% D2 T1 q6 C) \3 E. q* ^5 L; }; ]7 N& c& Z$ {/ c0 v& b7 H
static struct  file_operations mcbsp_fops=
8 n2 S6 T: [' y{" r# |6 ^; W9 {' ?
   .owner=THIS_MODULE,
; C7 h# p5 t8 J: j( Y$ D   .open=mcbsp_open," T1 t8 v7 v8 [. J  m" D% I
   .release=mcbsp_release,
+ _' }2 d0 O$ P" l' f. t   .write=mcbsp_write,
% N, ^4 ]. l5 {   .read=mcbsp_read,
! p  i& _9 ?& e- W  v: G};% H/ B- [. K" T0 ^% j+ o0 G
static int __init MCBSP_init(void)
: E# y, y6 U9 u{. ]; |7 y3 x  ]
   int ret;/ }% o( I, s3 u! t
   unsigned  int   PINMUX1_REG_old;
" x/ I; v* E; ^- r2 p   unsigned  int   PINMUX18_REG_old;
2 v1 t& v$ Q, [1 S, u/ T   unsigned  int   PINMUX19_REG_old;/ u, ^: \9 h" e4 k
   unsigned  int   temp;    _+ \, E0 h- S2 ?; c+ R- u) v, t# u0 ]
   if(MCBSP_MAJOR)
1 k+ e& o0 s/ v2 m' a   {$ B. D  d5 f& j* P
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" l6 t0 s* C; y( {2 z- J9 V9 a      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
# Y& a1 n; A5 t+ Y  R& N   }
: d6 j; K0 k1 k5 _; j$ E7 H+ ]' E   else
7 y; R( c& P3 E; q3 ]$ I   {+ U6 f# X; p' c$ ~
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);' |# J! z6 O. }" v. p( n4 C
      MCBSP_MAJOR=MAJOR(mcbsp_dev);* g# {2 g/ w" V% M+ |
   }% V1 r. y# T$ O  P) v
   5 R% E+ X% @) [6 x4 D8 M" s; ?
   if(ret<0)
# X0 E* Q" F, [   {  O" ^5 `& t: {# d
      printk(KERN_ERR "register chrdev fail!");8 R/ n( z* n, F# ^: q1 J: k1 e
      return -1;
5 w* e* Y4 q0 L, x   }4 H+ s* @" l8 _/ u2 V+ b  d
   9 `/ d8 ?/ m& R& `( s
   mcbsp_cdev=cdev_alloc();+ B5 u, c9 _$ x1 F/ m' R4 A
   
2 |5 k1 g7 p0 l+ W5 \. }   if(mcbsp_cdev!=NULL)# a; Q8 J& E7 ^! ^+ }
   {7 O! N$ A/ I6 o
      cdev_init(mcbsp_cdev,&mcbsp_fops);/ j) {) |5 {: ?+ S* O3 ~' k
      mcbsp_cdev->ops=&mcbsp_fops;
; D  o5 g. a- X      mcbsp_cdev->owner=THIS_MODULE;
% i9 G/ D" O0 y+ v/ r( R      
% }1 u3 K& a/ `1 [" y5 _      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))7 b# F( G2 O" s% c. t
          printk(KERN_ERR "register cdev fail!");' U' N  Q2 k: q4 x. U- V' a2 `
      else% i5 E! n1 a) \0 w7 r1 z
          printk(KERN_ERR "register success!\n");- P7 V4 a0 ~, ^' v' `  x! g: w
   }
) }% q* }/ S5 c0 t* i6 |0 V- y   else$ q/ W) j0 U1 Z8 s( v3 J
   {; Y) I: N8 w, Q; H
      printk(KERN_ERR "register cdev err!");
2 J4 r4 x8 u, _/ ?3 E* k& ~      return -1;: ?* N% b, |- K- C1 {. x: Q
   }
4 T: i+ t# l% s5 o% U* m   / J1 ^* D! {! w; }# Q% Y3 x
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
6 \- m4 L" \* P6 {! u   if(IS_ERR(mcbsp_class))' g2 e$ K9 w7 q. _1 Z
   {; }! `' ~8 G7 G, u8 ?& T0 }
      printk(KERN_ERR "register class err!");! U/ n1 T" U7 g5 o" {2 a
   return -1;  j! b& O, C  j4 D* s; r$ t. z
   }
3 X) I; |4 w7 C5 I: @   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);" t) H' h3 y: r5 s, }

( _' d1 x9 M# f  Q( z* E   //PSC
6 b. j7 O4 U+ p. _' L   //add Enable MCBSP
, Z5 f4 f' @) n) h0 W8 Z  @   //test3 Q; \* U, g% ]: U
   temp = 0x80000003;' @( {5 \# g: A  }
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));: u+ }. n  P# X) k; l
   temp = 0x00000003;
" J  O" z1 W9 y( v0 W, ^   writel(temp, IO_ADDRESS(PTCMD_ADDR));
- B, o+ \9 k5 j3 @; O
2 E9 j$ {  x9 [   temp = 0x001FF201;
7 M. H* J) `! \2 W$ ^  r   writel(temp, IO_ADDRESS(PDCTL1_ADDR));4 V/ D0 x1 Q5 J  Z8 _
   
* w# X- ?- Q( V7 j   //PINMUX  ) V1 x; L" ]& H; ]5 k& l
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& {4 W! a* ?5 m
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
3 |) ?% u9 K' y   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
8 a% [4 T0 h5 n; A0 j/ U/ |# a   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- ]6 Z# z" x% m: ~! K) t$ P- j1 n' C   * n# D5 U5 c9 V4 n+ M& M: n; i7 c, `4 _
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
" h2 o. P6 N2 v3 E7 V   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
* C% O7 \8 }( ]# S   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   " j' V2 ~, K+ @
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. K- t+ H% |$ ?* o7 w
8 U7 }, A( \2 [6 Z, Y1 w   //RESETn,L138_SHK2/ C# f; y0 i5 x- u) l- A
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  - A2 }- A$ J" e2 K0 P8 a8 A
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
3 l+ b; G1 O' \; Q& J' Z+ a7 _   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);( R4 }3 v4 w- S
7 u. u5 A% ^5 r" ^6 o. Q5 v
  y, b% B7 T% C; \2 [1 ?# n
  //SPCR Register
, J. _2 E5 h: `9 E6 g  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
& R& g' c3 ^6 G. y3 M' J, I  temp = 0x03000000;//(DLB=0)
7 V1 Y. J; E$ Z% L* I! Y' A // temp = 0x03008000;//(DLB=1)! X% z) o9 n' B3 m1 j
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset# |: L7 L' h' J5 p% V/ I
  temp = readl(IO_ADDRESS(SPCR_ADDR));" X; g. u0 ~$ w* N! M4 X" H, p
  printk("temp=%x\n",temp);
/ L& U; s! ]8 ^: X2 {/ M
$ ]2 z' \. b- x$ B! Z. q! W6 I( V6 z   //PCR Register
& ]; z2 q+ h; x# u   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 H$ r' C8 O& R  // temp = 0x00000F0F;
. M- h& M9 J7 _' a  temp = 0x00000B0F;
0 q9 O; Y) L& r# S  h  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized , o9 m$ ~# \  S
  temp = readl(IO_ADDRESS(PCR_ADDR));
' }6 G) ]/ `" [! h; z  printk("temp=%x\n",temp);  
' R' i. B; n1 w" R   //SRGR Register
9 }1 ?& I3 {# G   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- w: j0 J/ p0 c& d
//temp = 0x301F000B;
8 Y  ]. G; r; `: f# T8 z- @4 l   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 9 o" s  s/ T1 O. Q# a% U* P2 i, D* g
  temp = readl(IO_ADDRESS(SRGR_ADDR));
' t- |5 e5 j5 w! `! ]5 }# P* z' F# T  printk("temp=%x\n",temp);0 z3 P# R- u6 D9 v  V& Q
   //RCR1 }7 E1 k( C; _7 w! c1 R
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,$ u4 k& ]6 t( P
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
& m/ _  r; K$ u  s+ F   temp = 0x00440040;/ `6 x! m7 a# J+ N* _  G% H7 u
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
; b4 @. m5 y3 g/ {" w4 l; b1 h  y   temp = readl(IO_ADDRESS(RCR_ADDR));& M5 d3 O7 F+ w2 U; t
   printk("temp=%x\n",temp);7 S; G2 a/ V* s
   //XCR
1 H( h! [. J- p" H1 j   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 R9 a4 a  I# d! _7 q* O0 r; b
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! d, Z: o# _2 M8 ~( I/ n/ y6 M. K+ b
   temp = 0x00440040;
, Z9 B* A* B& k# X   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   " v# r: ^; {: G3 K. i; _1 X
   temp = readl(IO_ADDRESS(XCR_ADDR));
5 ]+ z' s( f8 d- L9 O. d6 V& m! V   printk("temp=%x\n",temp);
. l; ^& C, e) V7 E5 Z. t3 n  udelay(100);
  B. W: u9 I3 a* p1 g  //SPCR Register. ?4 f' E1 z# U) r' C
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 U' e* ]$ {( T! A5 h4 n; r
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1/ C/ H' N) w: i: v9 z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled/ \) M1 g7 e- G1 N
  temp = readl(IO_ADDRESS(SPCR_ADDR));
7 ?( Q0 \( k: P  printk("temp=%x\n",temp);
5 l- |' }: K: \7 F  udelay(100);3 y5 a" }3 j' A8 H! x

# U: M( X5 N6 a8 C& U, I0 A  //set GPIO direction, B$ @  p# T+ h, n+ v6 F, f
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));6 ]6 t4 b* e2 k( Y$ A8 J/ L
   temp = temp | 0x00000100;//EPR----input) O7 F7 N0 T2 h# {: A) E3 {4 ^
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output; b* n7 b  O/ }5 |3 ~+ {. q
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); % T7 s& T& m% t/ O" ?9 A

0 r  T0 X: R' W$ ~; _/ p   return 0;$ ^5 g# ~* Q( j6 ]2 y/ E
}/ i1 V* N8 ~' H2 Q
static void __exit MCBSP_exit(void)9 a& U$ @" Y6 ?- R9 v; V
{
! V; c) S1 H5 v. d8 k. D9 c   printk("mcbsp chrdev exit!\n");, x5 x+ d0 D) y" A# U! {
   cdev_del(mcbsp_cdev);3 O; h( D( G& z
   unregister_chrdev_region(mcbsp_dev,count);
8 U& m# }, ^' a' s2 p# ]9 |   device_destroy(mcbsp_class,mcbsp_dev);
9 T" J: T; a) ]5 I   class_destroy(mcbsp_class);
6 J: ]% ?# A4 p9 u, W}4 D3 V2 I" Z2 j+ l6 K7 V3 G+ w
module_init(MCBSP_init);
: F2 R! y" i# O4 Vmodule_exit(MCBSP_exit);
; Z! Y) w. @! a! z) q" c& A" t* V. u. p' c
MODULE_LICENSE("GPL");
: X3 b' Y1 D7 T$ c' Z6 M# b
3 X$ M$ ]' M3 F! \我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。# L6 E  s) ^: c4 x- n
我的应用层的测试程序如下  a5 l$ Q: m/ e$ z  n3 q7 U, `
#include <stdio.h>
6 H' M6 I9 o. O5 {2 \#include <string.h>1 h; n. g7 [& |8 a
#include <fcntl.h>$ s" F! E& K4 M. y7 _! P5 X2 e
#include <unistd.h>
, H: _9 o" o6 B1 b: U. r#include <signal.h># S; [9 J+ Z# P: d* W+ j
#include <pthread.h>       //线程
# G5 h* g7 C4 e  b#include <stdlib.h>: ^3 s; a% L4 w4 r7 C
#include <pcap.h>          //捕获网口数据+ v5 F0 @! Q! d' ^2 _. ?2 U
#include <semaphore.h>     //信号
) F% t6 r4 S( @3 N2 E#include <sys/types.h>     //消息对列$ {7 g  v$ k/ j5 B; ^. D8 e* E% l5 H
#include <sys/ipc.h>       //消息队列
; s3 W& L% u+ e/ O7 G#include <sys/msg.h>       //消息队列  j4 Y) r) W' k9 ?+ C' b
#include <sys/select.h>% v$ \; n& A1 c6 t, W& ]
#include <sys/syscall.h>$ b* O5 u0 i' ^- E, w
#include <sys/stat.h>* S7 @" j0 M+ V/ o' r8 r
#include <sys/mman.h>9 [  z4 h7 l9 k5 S/ u$ A" [7 V: Y  d
#define msleep(x) usleep(1000*x)
3 S2 D' p4 l& M: E: A9 S) _9 a; ^# ^% T9 g! O/ w) S5 l, a
int main()0 g+ J% Q! A6 G+ T  n
{
  ]" S( z9 G$ n+ v) r    //MCBSP,ARM与AMBE2000交互设备
( D* P9 {5 E7 `$ U1 n6 q' ]% [2 S/ H! Z int fd;  M; g2 |) F8 q4 p; V
unsigned short data_write = 0x5555;
2 v5 q4 P2 R. Z: p8 ]2 O: r" ` unsigned short data_read = 0x00;
& V: @8 L" T3 j" `' @4 a  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: m  |" o9 S0 j
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
" C! G: w* C6 G" d* |+ n   
% Z+ g0 P4 d% @3 j+ j& h1 j  if(fd < 0)
5 D( d1 W4 i8 y  {
0 m( u' a9 I& j# y- j+ i  W1 F" j3 [     perror("open failed\n");9 f! N1 }5 T+ ^$ y) r2 o% m
     return -1;
: G. A( g4 B7 e8 F  }
9 K% u% J. Z8 _3 y2 p% k5 R  
* M; e; p, K3 m# l) z. k, K  while(1)
6 g! b: ]' Z/ O  {
, U- ^0 p3 b/ j6 s; }7 R8 P) ]' u5 [   
8 y6 W2 ]' t/ x, ?4 w$ [   //AMBE2000每次读写是24个字为一帧
& {3 }- R- v2 |( k. \" Y& J   //写数据时将数据在底层存储起来,等到中断的时候再发送
" |, r/ `1 S6 F6 B: E  C; [   //AMBE2000输入数据是以0x13EC开头的
" s7 b7 K8 I: q8 Q   write(fd,&data_write,sizeof(unsigned short));% M5 }! B/ B0 B1 v- j1 {
   
( `3 U. i0 l8 _! t& i* ?# h5 O1 V   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
2 U7 a$ t, b+ R* A2 e: _3 I   read(fd,&data_read,sizeof(unsigned short));$ w$ u3 Z' x2 `* ^
   7 h% C/ Z+ J; o5 v
   if(data_read == 0x13Ec)6 h) u& m7 ~/ z
   {
- o7 P& C2 Z/ C% R* F2 t  _# ]   3 G( H1 U; H2 ]: s; A9 ~) L
    printf("data_read = %x\n",data_read);
0 K) D- y, [( v+ L, k   }
; J; H1 _# U* B  K   ) w, ?5 V5 v1 D
   msleep(10);
& P; L2 z7 \) @0 O* \! D! g  7 h) B6 w4 ]3 A' G7 b) Z% u
  /*
5 P6 e' w! [% r; n5 p   ioctl(fd,1);   
. f+ N# @0 E1 O- y, g7 c# y sleep(1);6 J5 P# Q6 B. t' A
ioctl(fd,0);7 \1 f5 v# R) Y2 N0 p4 Q
sleep(1);
: @: }1 s' M3 g& l& C0 j */ ' }/ ?( F6 {) {+ o2 {9 G
  }   
' g( v, v+ K, X" ?9 Y# J return 0;& ~& n( J1 H9 f- K% i9 r2 L! F
- N2 \7 {) M7 F/ b
}
1 ?- b% v. c. D) e
: I- V  O4 G+ p; C' D多谢各位指教,谢谢! 急; x2 [$ |0 E- e) i* {5 x

/ g% s; A/ ~0 W* E7 @/ n( [3 R9 ~: |. q: C2 o

; L: W6 ^" X5 i' _4 V& d; t% K5 X  T+ x/ s+ N9 }. |
! s4 Q; r" n; T" q$ ], L: i  C0 ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-3 12:03 , Processed in 0.048825 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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