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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 9 O% K* G% O9 B* p
/*$ Z3 U! ^& b  ~
* Copyright (C) 2009 Texas Instruments Inc: ^' {5 R( N. N; U* Z
*
/ G6 p* L6 n4 T3 ~ * This program is free software; you can redistribute it and/or modify
( E7 s" H7 L2 d * it under the terms of the GNU General Public License as published by' Q4 t' B; a7 |' Z) y; E0 `: M3 P! w
* the Free Software Foundation; either version 2 of the License, or* J6 v* R; O6 `$ k8 i9 }- h
* (at your option)any later version.
4 {6 l4 H7 `9 u4 H *& E3 ?8 V7 d3 e5 V$ S( l
* This program is distributed in the hope that it will be useful,
8 _! X1 A" g+ {& i * but WITHOUT ANY WARRANTY; without even the implied warranty of
: C- ?" A. w& \) r% I" ? * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 R' b; K  Z6 d4 Y- `3 i4 n1 M
* GNU General Public License for more details.( f6 K3 H# T6 {0 }3 J3 `
*, ?( U  S6 b- ]+ \) y
* You should have received a copy of the GNU General Public License/ ~. i/ {3 z$ w7 t
* along with this program; if not, write to the Free Software; q( h5 g# [/ d  V  ~
* Foundati
7 b+ q8 s$ V5 D5 M* x& I*/
' _9 v, y2 _8 V4 q+ v1 g$ v# z8 \#include <linux/module.h>
4 u' Z( V4 ^( l2 J#include <linux/init.h>0 f3 k& `$ `. ^: ]) g# m% T
#include <linux/errno.h>
$ H' o: z, f' {) J#include <linux/types.h>
& d3 U6 n" E5 [#include <linux/interrupt.h>  J; T6 J" ]/ p5 b5 N! f
#include <linux/io.h>3 L, P; N  Z( ^3 q3 A' o
#include <linux/sysctl.h>, v/ j) a( I# a/ t  m
#include <linux/mm.h>
# @" y+ D9 P, m/ k/ W#include <linux/delay.h>9 b! s6 o* p! |! ^' i: k
#include<linux/kernel.h>* p8 [( n  `" N- x% _4 J
#include<linux/fs.h># x; b! D: `. N
#include<linux/ioctl.h>
# J0 E" ^" F% `( n! B% C#include<linux/cdev.h>
7 V6 e! M7 m5 W' {+ H#include<linux/kdev_t.h>
; K* d8 |; x1 w7 @0 ]#include<linux/gpio.h>
% G' g0 m3 ~9 [2 q: c! \4 m5 C6 z#include <mach/hardware.h>
; q( k( b+ d7 w- N& n' z#include <mach/irqs.h>
' G- f2 ]- r3 `3 U( w; ]9 G! K
/ Y6 p% Q/ E, c, u* y! Z: o#include <asm/mach-types.h>+ \; Q4 U; x1 h) T: k$ G
#include <asm/mach/arch.h>
" M' Y& v& p% O/ V9 B#include <mach/da8xx.h>
! }+ W6 r/ h& @4 v5 D* V, w# o6 j#define  SYSCFG_BASE   0x01c14000
/ a2 g* {) c( Z. T  }& h#define  PINMUX1_OFFSET   0x124
" D: ~, T3 C- G" L9 Q#define  PINMUX18_OFFSET  0x168
; \$ h8 w3 ~+ F2 i#define  PINMUX19_OFFSET  0x16c
/ i% \- Q/ k$ B7 W2 ]6 @+ T#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR3 X8 [$ o' Z- G% c
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
( K1 j. c( a1 i' R9 v8 e#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& S4 H% B! H! k) K' u$ z#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR( x; J+ s7 G" X( i, @# @8 X, f
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
) }! j8 [. b# ]6 v                           
* L, X- B8 t5 x1 B#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
& W1 D: {8 W: b; U#define DRR_ADDR      0x01D11000  //MCBSP1_DRR# g8 D5 @0 l* d! _8 A: a4 |
//PSC2 N( c% F1 y" i% L
#define  PTCMD_ADDR   0x01E27120  
+ z+ D- r- r6 ^: _+ D#define  MDCTL15_ADDR 0x01E27A3C0 x& M' w8 x% p4 K. c, x) e
#define  PDCTL1_ADDR  0x01E27304
( ~+ B4 v# E$ Z  C# n8 q% \//GPIO8 direction, z, i2 G4 G* K5 l
#define GPIO8_DIRECT  0x01E260B0
8 P+ J0 ]: Y% l+ i/ S#define GPIO8_OUT     0x01E260B4
6 C2 t* o2 B& e#define GPIO8_IN     0x01E260C0* J, R- u+ u$ B
4 x7 d0 [/ ?. s7 O" O2 g. o& Z) S
//#define MCBSP1_RINT    99              3 v2 S9 r+ W8 V+ f2 k, C
//#define MCBSP1_XINT    100  
: c6 ^# L- P) |/ Kstatic int MCBSP_MAJOR=239;6 T3 K) M/ Y' F/ f0 u- F; X, |- k) L
static int MCBSP_MINOR=0;* N2 `1 m! v! b, G! M) i/ _( c: E
static int count =1;
' Q3 v+ F  t2 ?# \+ H+ a
3 ]/ {( L+ h9 Q' ]0 d; e3 C' S#define MCBSP_NAME  "MCBSP-device"( i3 J8 C- W' L$ j1 j& R
8 \" g% ?# s5 c. p
static struct cdev *mcbsp_cdev;
* _- V/ k/ E3 Y! R9 ?' estatic struct class *mcbsp_class;
; x7 V9 k" V6 _" h- f4 f2 gstatic dev_t mcbsp_dev;8 D) E/ c$ l6 i, e
unsigned int DRR_data;# ^9 J8 I, t- F8 S8 K
unsigned int DXR_data;
+ x: G- Q7 u2 I2 Fstatic int mcbsp_open(struct inode *inode,struct file *file)# r1 n6 |& {5 P. @
{$ @( D* W) x6 i/ }
   
# h) U( y0 {1 u8 M9 |   //interrupt enable,initialized
* ~* B5 h; m* y; ]! ^. b   unsigned int temp;
! O: n  [. d1 `/ a) }/ I   //SLEEP_EN(GPIO8[10])---0
& ]6 e' j& x2 N/ Z   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
  b: [, z9 |1 j2 I7 U   temp=temp&(~0x00000400);
$ ^6 g  w5 c7 C- \0 n# _" p) |( C% A  l   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
  ~0 \$ h8 x: a. a- A: S9 w6 ?  //RESETn(GPIO8[8])----0----1
9 h2 D  w8 f' H* d! U) O& M/ U% i   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ Z5 O" z) L! i1 O6 n# o. n$ q
   temp=temp&(~0x00000100);: F; R' o" V$ s! o8 e5 P
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0* a  T% `  Q9 `4 \1 ~
   udelay(100);
& u% a) c/ ]3 Z) s: b5 t# ]   temp=temp| 0x00000100;  J9 r. G: I' q( n5 l% j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
# O4 H" O$ Y5 _2 R4 |* F   udelay(100);- x- P9 v5 E5 t: h
   printk("open success!\n");
. X* H, {: d% y; b   return 0;
: v1 D' d# e9 o/ N) c}$ T5 N# X: D& @# f2 n% z
. O1 l: D- t4 s' l' ?5 i5 K
static int mcbsp_release(struct inode *inode,struct file *file)
" X* R+ y- L6 K) Y" Z: S2 C& ^4 g{
/ Y$ z1 o6 \* p, s   printk("release success!\n");
" S& r! [& z" H- ^4 K7 F6 d  n   return 0;/ ^- V0 G) M: X( X
}
4 v4 B* E1 L( z0 `+ c6 J+ Z- Z$ L7 Z. I, T# Z! z
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)) Z; K/ P: h5 }+ q* L6 S
{
& ~2 N8 v* Q" p- T$ O/ e  g    copy_from_user(&DXR_data,buf,len);
+ s2 }& H; X- n4 \  ?    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       5 f7 i' f$ q3 }" v3 k/ \6 @
    return 0;2 k( @, N. c+ p& C/ Y+ t# ?
) t! U0 Z7 y) Z8 O$ Y$ f
}: f6 [3 y( o; i' H0 L! I, B( i
5 e# r& d" b1 u
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
  {/ F( W5 y& z1 A9 X{ # D& F* g$ N+ P0 r$ o
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; k' k- h! q/ B. Q, s- L   copy_to_user(buf,&DRR_data,len); * }" a, Q; b3 t5 s, U7 e, F* Z
   return 0;
( k, z7 G  D9 m* f}
9 B* U  `$ H+ |6 L0 p3 a( i+ s
: g7 d7 i1 ~* K) s' T3 _1 _8 I8 l3 t& V# D! a2 p' w1 C
static struct  file_operations mcbsp_fops=, i: U! I* r7 f5 {
{7 ^1 f  a! p) I7 i4 s( a. D9 A% o
   .owner=THIS_MODULE,/ V) ~' k) F0 F2 K+ Q
   .open=mcbsp_open,
8 i5 L! ~  t1 B" k2 u' X   .release=mcbsp_release,# @& K9 z( i. x# ]
   .write=mcbsp_write,
7 g3 a0 [8 C8 W; X8 V   .read=mcbsp_read,
# Q0 S6 @, {% G$ E. D};4 F# v9 Y2 Z- z
static int __init MCBSP_init(void)
& k" C. X( J# G{
# [% @0 p3 v( }, p2 r/ Q3 _   int ret;
+ A" ^. w4 e5 q   unsigned  int   PINMUX1_REG_old;
7 k: I' V* b. |   unsigned  int   PINMUX18_REG_old;3 n. T5 A. H, _) k7 u' P$ Y
   unsigned  int   PINMUX19_REG_old;
- o! [/ j; e/ r0 g' R0 w) ^* f   unsigned  int   temp;  $ w1 h# U; A& u% a) L
   if(MCBSP_MAJOR)" g# c8 ~+ t8 M2 a1 c
   {  O/ n, A7 F/ r, L; v# M
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
. u  ?) J- V/ C      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ E* @' F; R1 o/ R) f& k   }0 f/ T3 {1 |) [5 S
   else+ O% X% A. K3 w& A0 `
   {
' N5 c3 s; ^$ z& `9 j3 k# H4 p      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
  ]! A* l" B6 L3 f5 g4 ]5 C      MCBSP_MAJOR=MAJOR(mcbsp_dev);
6 t9 f2 s- Z4 K1 H   }4 i  n. O, s" r
   
6 N; Y/ r# j0 d   if(ret<0)) ^$ r  H0 P, u
   {
$ e' E! z/ ^# K/ P6 |0 c      printk(KERN_ERR "register chrdev fail!");! X+ f' G5 @6 z% r2 L
      return -1;
) Q/ m$ d2 b( c/ ^7 m   }
$ J1 t% F5 ~1 F2 f  T   - k. M2 z  @0 P/ A. }! a0 i: u
   mcbsp_cdev=cdev_alloc();* M( C/ d8 I% ]1 W- E
   0 t7 c6 D# l6 L2 U, H
   if(mcbsp_cdev!=NULL)
4 `5 q( Q2 D5 M+ l1 P5 q   {
# \' l/ t8 j. [      cdev_init(mcbsp_cdev,&mcbsp_fops);
5 y, }. }/ ?* r' ~9 g      mcbsp_cdev->ops=&mcbsp_fops;
0 Z; x' _" p0 v  m      mcbsp_cdev->owner=THIS_MODULE;6 g* R6 j& K: ]. m' h
      7 O# y; ^9 E/ h1 S, h
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' e, I$ J) O! q  v: Y5 E: F          printk(KERN_ERR "register cdev fail!");& l4 X* q% D+ h+ ]# {2 C
      else
' j# [9 c- D* S          printk(KERN_ERR "register success!\n");$ Z$ l  O- r5 h! R4 C9 s
   }: F+ i; Y; n  [; z# q5 I
   else
, p* E* D4 F+ }6 w0 E. L) h  U   {* q3 h; j+ k6 ]6 d6 \7 I" B
      printk(KERN_ERR "register cdev err!");! y3 M5 x- s: W# }, M2 t
      return -1;
% O. O  ]& }  ?   }5 M# ]! l; g' X* y+ c5 c# V. \
   : N+ X, p/ E) U' r* i4 N
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);" m0 R+ V, T( i' K5 l
   if(IS_ERR(mcbsp_class))& D9 T, ]+ B) n: b' x& O8 Q1 p
   {4 O4 D7 V2 r2 V8 L# S4 s6 p
      printk(KERN_ERR "register class err!");
" k- ]( a( S/ Z0 K0 l   return -1;9 |- @( ~/ H' ?6 l& t
   }
4 B* }3 S6 q: T/ Z/ [& [   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 u/ o) r  T" R, S
. G& T: l( l0 W( Z: Q: }% h
   //PSC5 D, i: v. b, `; ^
   //add Enable MCBSP
+ k1 p( P) R  n8 k: T   //test
  j5 V& |1 b! c' D   temp = 0x80000003;9 J- i5 v0 H* y% Y, m8 ^" D3 x9 q
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 O4 n5 ~7 R8 c- _; Q' i5 z$ Z
   temp = 0x00000003;
" [" ?  p; x9 j3 g   writel(temp, IO_ADDRESS(PTCMD_ADDR));3 Z: E, \! f' i) @

6 y3 B2 b4 e/ M; O- M0 o   temp = 0x001FF201;
8 J* Q- Y* D3 n$ m( D# V) I   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
& c0 x7 `, W* Y, R     B9 P2 m0 h+ G( t. _
   //PINMUX  + T3 o: r- m3 H+ B% L% m3 E
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
# [. U4 W: m5 L- D2 D  H# Z   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ) A) Y, m9 ?, S+ `5 s
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
, e! X+ e7 B/ |6 U8 }6 i5 E   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);7 y0 N8 t8 z, h7 \6 I/ Y# J% P
   
$ [, ~- `0 D: O; S8 T' l   //SLEEP_EN,EPR,L138_SHK1,L138_RC
0 A/ @9 N6 o& J5 {. N0 G- X   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
* p# J5 ?$ p5 `9 A) F2 C+ }  z. O   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   7 s4 P1 Q1 k( Y* E! E8 ^7 C2 g0 f5 L
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);+ p& q: k9 i8 Q; \- d
) O% b3 z; `0 d# L0 ^) _* k  U5 w
   //RESETn,L138_SHK2. `. W6 m/ c. W1 o1 E1 @
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
: \1 j# X+ `$ W# W6 C8 i  h! \5 j   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   5 D& j+ K& r& H% u3 U
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- o% p' h$ q( G$ D

& u, {; R; L6 A$ b
- m6 C, ~. C* N9 G+ I+ A$ ^' i8 W9 M  //SPCR Register
1 I" g  j& R) K+ `! ]# F& g  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset2 I1 y9 `+ V% G' T7 c
  temp = 0x03000000;//(DLB=0)1 x) @) Y0 ?8 ?1 K9 n: }* `, F  g& C
// temp = 0x03008000;//(DLB=1)
& I) H) F$ r4 U3 |  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
, {  p) n/ |/ [( N# e$ k  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ y9 m' Y! X( E2 U8 j: p2 f  printk("temp=%x\n",temp);
4 ~) @( x/ p- i1 I 8 s9 R( d9 a6 j$ N/ t- Z
   //PCR Register
, U5 Z2 J. ~1 s# X   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
6 s4 b& U6 Z9 F. \  // temp = 0x00000F0F;9 w& T3 v. _  l+ k
  temp = 0x00000B0F;
6 b4 `2 K% f9 f- Y" ^- C5 J$ c  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 1 w4 ?/ ~4 r1 B6 }! K
  temp = readl(IO_ADDRESS(PCR_ADDR));
0 y' [" t+ G0 H! o  printk("temp=%x\n",temp);  
/ `9 N% @# K& s$ Z   //SRGR Register; y/ a! m0 }$ n- f4 f3 l5 m
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
9 U% Y/ O  |% B/ ?  ~$ b4 W0 r  O //temp = 0x301F000B;
6 @# `% \! d2 w4 ?   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ; ^( i5 p9 R3 b3 V; f2 B* p, M/ D  E1 S
  temp = readl(IO_ADDRESS(SRGR_ADDR));. {6 O3 R6 ?; ^
  printk("temp=%x\n",temp);# {) O6 w9 K+ a
   //RCR
! \: D5 Q) M: P# p5 L. }4 e# F, z   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,) |3 a. _8 m% h3 A
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
! M0 ?( w7 w/ I0 L# R* |$ e% ~. a   temp = 0x00440040;
/ D- A6 J% I# u   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
5 M0 s+ V7 T; F9 b   temp = readl(IO_ADDRESS(RCR_ADDR));0 S" [& @" _2 F2 Y# h
   printk("temp=%x\n",temp);1 u* ~  A/ |! g& }* l
   //XCR
5 A9 x' Q/ ]" d   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-10 H; v" h/ W8 `* ^- K
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
! o$ g( d/ p/ E) T4 N! u1 O   temp = 0x00440040;# V& J& A* \8 |! l' {8 I
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
2 B6 x( M) V: \' L) `   temp = readl(IO_ADDRESS(XCR_ADDR));
  Z3 y; T$ V6 ]6 N   printk("temp=%x\n",temp);
7 L$ `7 y+ r7 I* A% x) r  udelay(100);5 q* Q9 O; e1 q8 w- `6 R* m
  //SPCR Register
  c# }" m+ N& }; H  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
' `9 U/ M# C& g) @, K  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
, N' E" Z/ H1 @4 K1 G  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled- K! d6 A5 c, d# d
  temp = readl(IO_ADDRESS(SPCR_ADDR));
  ^) \. T/ F0 f, x7 f, v* ?- V3 Q  printk("temp=%x\n",temp);! k5 |, r% ~+ d6 E; {. C
  udelay(100);9 [# W! f7 k8 b! U1 L/ @
8 Y+ k5 O; i/ d) r) Q
  //set GPIO direction& B/ D! l* R, E1 k7 c3 t
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));4 |0 i9 Y! z: K% G1 e
   temp = temp | 0x00000100;//EPR----input
5 \! j+ d/ r- v   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output1 \5 \9 F' Z1 P) ^1 v3 N
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ) U: Q2 B. l+ V0 K7 n& [2 A" q- C
9 e( m( I1 a9 Y! g2 u/ x
   return 0;
  c- v* M' l9 T  f}
3 c, Q7 i9 Z. F; Wstatic void __exit MCBSP_exit(void)8 d$ Y: u/ Z  T' p- f
{: y7 k- }3 r2 t# D! ^& J3 N
   printk("mcbsp chrdev exit!\n");
& z  p6 Y. p3 j! Q+ @3 Q, R1 C   cdev_del(mcbsp_cdev);6 o  l( G: B& q) c# k# Q' C& \
   unregister_chrdev_region(mcbsp_dev,count);: c+ l# A, l" F/ a% a2 H& Y
   device_destroy(mcbsp_class,mcbsp_dev);
3 o* T4 J/ S' I3 s4 D& H0 u1 r   class_destroy(mcbsp_class);* Z. j% G3 B; E
}9 G' n  p+ F% K9 D5 U
module_init(MCBSP_init);
' |! k8 U3 u5 _' v+ K& Vmodule_exit(MCBSP_exit);
' R( i9 U5 i7 Z! P) g6 E
$ Z  C7 }& e4 F) l9 v# bMODULE_LICENSE("GPL");% t$ w  O; L, m  e3 t# g5 t8 `
) z) g$ I/ Z6 H- Y3 P6 Z1 @
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' q9 G- R4 i' n# a我的应用层的测试程序如下
$ W! F6 [* L: o# A6 }$ u; @#include <stdio.h>
) y- P7 @# q: P* l# r- D#include <string.h>) T# l% ^5 @2 y* \5 t
#include <fcntl.h>% R& \" O: _" r% R; Z
#include <unistd.h>  c2 l' ]1 _. r* o5 T6 x
#include <signal.h>
+ k- L" y& z3 H) [5 A! E2 T3 N#include <pthread.h>       //线程
9 d- @7 E  B& g4 h( t, R' t#include <stdlib.h>4 D8 h& h! S% @* x9 }! ^
#include <pcap.h>          //捕获网口数据$ x) j0 ]7 }$ v( f
#include <semaphore.h>     //信号
3 ]" @" Z; c+ a% J, y#include <sys/types.h>     //消息对列1 O& V  u$ G2 V# ^: A
#include <sys/ipc.h>       //消息队列
9 }8 _1 K# o6 J; `& U1 H2 \#include <sys/msg.h>       //消息队列* X. S, |) |0 ^) ~- C8 A8 a2 l
#include <sys/select.h>  o0 q6 u6 @9 H, h
#include <sys/syscall.h>
' {) x+ ~" I! Y#include <sys/stat.h>
; ^& F3 ?" q& o- ]5 C4 h#include <sys/mman.h>
5 P# o* r/ e" J# v" p" J( C#define msleep(x) usleep(1000*x)
$ Q( E& U8 U, A+ Z. ]* c! W
& M: D+ H/ i' Nint main()! ?* K& t4 ?8 y3 p
{ ' ~; e8 H( K9 p2 h2 I& I3 G
    //MCBSP,ARM与AMBE2000交互设备
: {- i$ `. O7 ^6 f int fd;
5 s' i! w9 ?* ~  B/ V$ |6 i unsigned short data_write = 0x5555;/ X6 B1 R& c6 |
unsigned short data_read = 0x00;# t: Z8 t' d( f6 ?) p! o
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
( ~! d2 e: E+ l6 T& \ //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);. n( `- K! }' P( u$ t4 K# w
   
2 |+ X4 K* I$ x, l, H2 \* R- _" w  if(fd < 0)
1 k3 m0 Q7 E6 b8 w7 B  {& \7 {+ Y" D# s: }
     perror("open failed\n");, P: ~8 w( ^( q+ O
     return -1;! V5 g6 U# t( J; N: m2 g& X
  }* v) M* v& V8 U. e* m6 P* j( R% W& w
  
: ~) U- x. x6 P0 V* f- e  while(1)
2 h2 @8 K4 i/ V9 \* {& r, _1 \  {' J2 P2 j1 k. B1 Q, w
   / H$ N9 v/ E5 {0 T
   //AMBE2000每次读写是24个字为一帧! g; Y7 a5 k: X' c- l" A
   //写数据时将数据在底层存储起来,等到中断的时候再发送! a! m" z9 D, n' ]' G4 R- C
   //AMBE2000输入数据是以0x13EC开头的
# h7 Q% W/ t& W- m) u5 @   write(fd,&data_write,sizeof(unsigned short));( v) a8 s, Z( _& s1 e2 Z
   4 c/ V* Z& Y* D5 W, A1 k1 [0 ?* e
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ' V. f& _- O' V, y" o+ O
   read(fd,&data_read,sizeof(unsigned short));
7 s% _# q4 w6 y. Y' y4 |- R, y   
5 N9 u. ~' z4 X  K   if(data_read == 0x13Ec)
% G; _* W8 o& Y- W7 u6 ~5 z   {$ Z! \& L1 [. |1 s+ j
   " z  W% B+ l! Y5 r  K7 H
    printf("data_read = %x\n",data_read);9 k7 f5 c6 a4 _
   }* l5 S- |* o7 H- E& d2 A+ i  Y/ G
   1 G1 m1 f6 m: ^# q" n
   msleep(10);
! p, i3 d6 `% \: c  
; u! }6 u  g* }' T' x# _  /*5 M7 A3 F& u, p0 X6 \
   ioctl(fd,1);   8 S6 F- z: D" P: P
sleep(1);# D" M7 l1 ^8 z9 R2 \$ _8 x. Q) x
ioctl(fd,0);
0 e4 l0 p" b" v+ g1 t% a4 z- S sleep(1);" z" \! X- l  j- o$ b$ d$ F
*/ , e6 G& J& q# W1 E7 C9 @
  }   0 p0 M' a- i; T0 A  O. g
return 0;
1 Z0 g) ^7 G" ?- P% [
2 d/ i" Z$ ~1 P  J9 R}
. q- h. ]; W( \; \; R2 q* C
5 J7 U/ Q/ P2 ~; @" `( d* a  j多谢各位指教,谢谢! 急2 O9 M) V# D) i' D- G0 q9 t

/ H) U, M, l8 j% p+ l0 m( W' E/ X' Y, e8 U% B2 Q# P

2 Y( L2 Z6 c* \$ G" _3 a, n
4 H: y/ m  X2 @" d9 `) ^) M# v5 z& D) s6 O+ l# q8 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 17:36 , Processed in 0.043292 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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