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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# f+ O9 p0 r" s# X8 p* f) N2 ^/*
, c! i* E. ?; R* L1 M2 z * Copyright (C) 2009 Texas Instruments Inc$ w. ~+ `% ^/ O
*
" t- H5 w9 {. l) c( r * This program is free software; you can redistribute it and/or modify8 t2 _% l6 K8 K5 [5 T
* it under the terms of the GNU General Public License as published by" s  r" a/ ^  \, m5 P! r" H! W8 ^
* the Free Software Foundation; either version 2 of the License, or
, {! A& d' C0 w# K' E * (at your option)any later version.7 y! X+ {# _2 x
*
' K- X/ T' m, r0 ]6 l: v * This program is distributed in the hope that it will be useful,
' O+ C) e& B4 B  X! P  K * but WITHOUT ANY WARRANTY; without even the implied warranty of
, n" G  ^% O5 g * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the/ v. Z- T% H, |6 G* p
* GNU General Public License for more details.
+ |( Y2 V1 [3 ?) v& e *
# H  X' R* L4 D# Z * You should have received a copy of the GNU General Public License- \: V0 {; T$ [( `: q2 U& A
* along with this program; if not, write to the Free Software
; U, f( K7 L% G, f# O * Foundati1 K- {2 p% v3 p( E, B$ {
*/
- l  n8 ^& F- F" I9 a* v) L#include <linux/module.h># o$ a8 A' m! n5 v, b3 t
#include <linux/init.h>( w# @- }5 A6 P5 A
#include <linux/errno.h>
! \& A7 k( X& R# r0 O( ^5 N) E" S#include <linux/types.h>
& m/ [, ?2 G% ~0 P#include <linux/interrupt.h>" H2 A4 u2 R& f; u7 @1 \4 b  S
#include <linux/io.h>" |* b5 q5 m0 K6 R/ R
#include <linux/sysctl.h>
# G6 O7 M0 q! e; h* {$ ?9 k#include <linux/mm.h>
" }+ w( y' S* I: b#include <linux/delay.h>3 C( J  z- }5 b* U+ ?+ [" M. }7 @" `
#include<linux/kernel.h>7 D; c/ X' M4 C" \, H
#include<linux/fs.h>
; B5 l" r7 j9 u: p#include<linux/ioctl.h>3 t9 b( k9 Y  K4 O
#include<linux/cdev.h>
( g" S* J9 l4 G* \9 Z#include<linux/kdev_t.h>
5 Y2 C& }/ r& }  e4 _) b1 r6 O#include<linux/gpio.h>
2 M! M, |, [) k#include <mach/hardware.h>
/ U# W8 P- Z+ P" w. ]5 l#include <mach/irqs.h>. o5 Y( P3 \& j9 V; K% a) W% E2 ^
2 c8 Q: V0 r  l% K- [; C# r
#include <asm/mach-types.h>/ O" G* r4 U6 Y7 [$ ~5 ]! z
#include <asm/mach/arch.h>
3 p" d) \% ^! R5 O#include <mach/da8xx.h>5 {; }0 m& x& J& i& n; i& `" I0 u
#define  SYSCFG_BASE   0x01c14000
1 h# ?/ U) t. ?1 B8 @#define  PINMUX1_OFFSET   0x124
, p6 O7 ^1 I4 G& r, a8 U: a#define  PINMUX18_OFFSET  0x168
' o1 s+ w2 }' [5 v  C' ~; E#define  PINMUX19_OFFSET  0x16c
  S! J( F& E3 V- i% L0 g5 W" b#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
% L( g3 f3 i% H2 Z#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR4 |9 l) L- [$ T7 S* g7 u
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
/ k5 l2 e8 e2 ~4 [) i) ^9 j) t; L#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR9 x& X- X/ n6 c! q
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
- j& P( _$ n2 {; [9 N1 x. M! A% m                           
9 S8 N, A- N  |7 @+ }& M2 p#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
) z4 K0 U7 d' Z" z5 q( z#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
0 z: t- R# I0 d1 P# R//PSC, ]5 b# ?+ j; s% v% W" y9 k+ Q
#define  PTCMD_ADDR   0x01E27120  
% b9 I; h9 F7 u3 S' N8 U" i! ~#define  MDCTL15_ADDR 0x01E27A3C
8 l4 }- Y* c  h0 e#define  PDCTL1_ADDR  0x01E273042 Z0 F8 K# {/ }" a5 o6 b1 u
//GPIO8 direction8 ~/ X+ i! Q$ A6 I
#define GPIO8_DIRECT  0x01E260B0
1 w: f$ _! p, I& `5 c( @#define GPIO8_OUT     0x01E260B4! S) `1 E" z+ V: _& r% V
#define GPIO8_IN     0x01E260C07 J. O4 r7 |6 j; F/ ^2 `$ h! }0 ]

( E4 ~: t3 U8 ~3 I- R( y* _2 S, ~/ q//#define MCBSP1_RINT    99              , D; p- T" d: l7 h. T( q4 _; z
//#define MCBSP1_XINT    100  7 f: P% o" T9 n& m; s- P
static int MCBSP_MAJOR=239;: N' J3 J; C$ a$ i) n" z
static int MCBSP_MINOR=0;: \' Y" Q4 i9 H/ v& g/ O
static int count =1;
/ p4 \( ^0 A- x9 }% }0 C$ V3 I2 \
& e0 Z, ~) v* [# g#define MCBSP_NAME  "MCBSP-device"
7 Y% {$ ^- t2 |; s
7 d" a7 G6 V% H+ o8 P) x8 p8 t6 O- ~/ jstatic struct cdev *mcbsp_cdev;+ ]8 m6 X" W8 o4 T; K" ~4 [* Q$ {
static struct class *mcbsp_class;
7 A+ i& ~$ [3 J0 s6 E' |static dev_t mcbsp_dev;
# B& b- c) m' l: i& cunsigned int DRR_data;1 @! _1 {  U5 `  f7 C* ?; @- \; w
unsigned int DXR_data;
! q8 n4 C) a3 [2 q6 Estatic int mcbsp_open(struct inode *inode,struct file *file)1 I; a! l$ ]! z: @
{
1 Q5 K% g2 [* T: J  U& q   ! ?: w0 F* d3 _) B% X6 H
   //interrupt enable,initialized
$ x- s( V" T8 X. h3 X: n% _6 s   unsigned int temp;4 q. M: |# Z6 j8 \
   //SLEEP_EN(GPIO8[10])---0
. J6 |* R8 M; ?; O2 x   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% p0 @. s% B: l1 `; m0 T% n+ [   temp=temp&(~0x00000400);; C  D6 ~, ^' T- M+ F
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]4 R( a! H* @( I1 Q0 N
  //RESETn(GPIO8[8])----0----13 s6 i: L% [  x5 x; \3 n; E; Q) I
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: x) m" z& L, a   temp=temp&(~0x00000100);# C2 a, F/ h& v% {+ `4 n
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---07 p/ X3 ~# r7 D% l$ a8 v
   udelay(100);
+ k; Q+ P* P2 `1 D0 c# W0 g   temp=temp| 0x00000100;/ q7 J+ `' V  B% n8 D
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
" Q2 i( \: @7 r6 y   udelay(100);
/ [  [4 B% z7 B3 Y  O0 }3 }   printk("open success!\n");
/ G! \$ _) ^  H% `* z: v   return 0;
9 ]+ ^& @# U% ]6 `}
" i- S& {6 \! M! D, N0 T0 B! k6 k$ F" R
static int mcbsp_release(struct inode *inode,struct file *file)/ l2 U) P7 g8 P0 Y
{( t2 m8 U  S0 w- @( `
   printk("release success!\n");9 h; t  h+ R6 k  L
   return 0;+ w' t+ w8 L7 O9 w$ K
}5 Z/ D. l2 ?% P, K( B
4 g: ]3 Q/ Z* U4 S' f
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ x5 Y  \0 O8 e. f
{$ l6 r% u- O! o# B. W
    copy_from_user(&DXR_data,buf,len);$ H$ b3 l. N% V2 V) v$ ~" P' ^
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
% o' W1 a" y, N5 A  c    return 0;4 J. Z( g* l" @5 G) @$ @9 H

/ \6 m: T4 x( u% j}' j9 I7 j  `& x9 ]' X; Q; n" @
! x" F1 L& I& b3 l6 l! O
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
( [* m6 s' D/ Y9 k2 Y& b{ # y) b4 ^+ L4 f7 v
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));' S0 t3 h& v; Y: u8 l$ w0 K! T
   copy_to_user(buf,&DRR_data,len);
1 j# b& S. X9 f( w' `8 f   return 0;( j! q( I* q3 b0 x4 ~, W8 g+ T
}6 i0 x8 ]7 S: T2 s
( }4 L, R* D. a9 U
# l8 }* ?2 z; w4 Y
static struct  file_operations mcbsp_fops=- v7 h# b* T& @. x8 E
{. U4 w9 Z) @5 H& r4 ^! {& q' m
   .owner=THIS_MODULE,
( s/ b- _1 E: a) X" b   .open=mcbsp_open,  j% L1 ?# m9 e* h- h& o
   .release=mcbsp_release,
- E: m! z! V: B0 h   .write=mcbsp_write,! q% G* h0 w3 X. Z
   .read=mcbsp_read,
5 z- P- q0 |6 S" [% `3 _, X, K};
8 _6 _7 c7 C2 B$ i0 @0 Tstatic int __init MCBSP_init(void)
/ i" h, K- m* c/ G9 y/ Q{
) k1 \' V8 e2 y: l) A  D$ @4 y   int ret;
* M* y; ?; }( Z  s+ g, P   unsigned  int   PINMUX1_REG_old;$ c: n, A- Y8 b7 R" A( U! l! r
   unsigned  int   PINMUX18_REG_old;
" j% ~2 \5 \" O! x   unsigned  int   PINMUX19_REG_old;
8 `6 X/ p% u0 s& j8 B7 s7 Q   unsigned  int   temp;  5 k& W) n6 N9 y
   if(MCBSP_MAJOR)% I- N$ N: t( C
   {# Z& B. ?7 @1 p* C  u" e
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
& q5 h( X# ?' z* O4 _, u      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- i9 l" y1 A, Y0 ?" b+ Z' c
   }, @7 D/ D5 e! C
   else6 b. A+ u1 `! r, W+ s/ ?
   {
' h4 Y2 T( i0 o7 s7 y      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);: s7 E; P8 h" w3 o3 v) i7 f4 K, U5 `6 `
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
& f5 D3 j9 `7 b& d3 T- O: e   }
: B6 C& Z! Z( L  |8 L   . _  Q1 p+ ?0 X# c
   if(ret<0)
( j: ^. t3 _+ l4 J6 i5 F4 e   {1 ?6 q5 @) X! _7 y
      printk(KERN_ERR "register chrdev fail!");  q) N2 ~2 X8 ~7 d/ i
      return -1;
; k& f! ]$ u& n5 u  h   }
0 v0 Y, x+ m8 V' l% T" j  D& S) ^   , E' ~+ {% a7 V& T1 e
   mcbsp_cdev=cdev_alloc();9 J" _3 q6 M1 `# ^  R0 G3 g8 m
   8 W" x: l: n. C! e; @! m! ?
   if(mcbsp_cdev!=NULL), v$ G9 o. G% {" p1 _
   {
& w; A7 |- c: \  x7 K! S4 V) t      cdev_init(mcbsp_cdev,&mcbsp_fops);" v" }& f! K  u4 k+ P  [/ U
      mcbsp_cdev->ops=&mcbsp_fops;& z* ~  j) m3 R8 ?; G% |4 l' |: x
      mcbsp_cdev->owner=THIS_MODULE;
$ p8 e9 W9 X) F' U9 O# X+ \, z      
+ e' [. k  r7 e# \      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))+ S# M: E# Q) p+ k( H% M1 _
          printk(KERN_ERR "register cdev fail!");7 W9 ]/ A) j. ?% l9 Z
      else) ^+ u& E7 L2 T
          printk(KERN_ERR "register success!\n");
+ @& i1 j; z7 e: e. l   }* r& Q2 J, }, }
   else. w2 J5 D8 x/ H) J) f
   {
+ J6 |  P+ N2 B" G7 W      printk(KERN_ERR "register cdev err!");
: A. ~- G8 z. o( ~1 o  e" R1 v      return -1;
& `, S$ ^, X; U4 b   }
* l! A. C6 z2 S5 [; Z( \   
$ [0 d$ ~% v4 N3 a0 }  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
) P: N9 u7 R  m% Q$ a% [   if(IS_ERR(mcbsp_class))* |+ E1 G+ P' E8 r- p8 |4 j# m
   {" h6 `# m% d( X, s2 m& T' Y; _/ {
      printk(KERN_ERR "register class err!");
* D4 O9 W2 Y! g. g( n; T   return -1;
& f: H1 W$ `+ ?   }+ r9 `4 d' m, V+ p# v. D
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);8 W, }* W  `0 r5 S

/ \5 G* W- F& l' g   //PSC1 K9 ^8 ]7 f- c8 i4 M
   //add Enable MCBSP  c: _5 b& m( y( K' z
   //test
( L8 m& t0 y) s% H6 N/ r" ?   temp = 0x80000003;4 m3 v* j7 N  M6 F' v
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
. S: d! G! H/ I4 `   temp = 0x00000003;6 I5 y3 H# e( e5 f% Z' v1 V+ J1 W
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
) y  V7 \5 c( z( s6 _
/ v- z& i/ q: d( ^   temp = 0x001FF201;' t% G  G: h# q; y
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 c2 K& I3 G8 e/ K( |3 v: i* Q( E
   
2 V6 K8 L2 S' g* B1 i. Y) v; a   //PINMUX  2 L, r7 L' b% I% M
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" X- K8 e0 n3 }) L- h   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  * j$ S! M7 }; v: h1 ^6 i- T0 M
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
- b7 W6 c" H7 o   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" C$ S- J% C  D   
5 E' o0 v1 o5 t- F9 v  A   //SLEEP_EN,EPR,L138_SHK1,L138_RC% |" j$ m7 F8 w
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  " I* H: L6 V+ T
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
: g5 O+ [8 e3 {   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# ?" {# d$ O" K
  a3 L$ I- m" }4 E( {0 D9 v# t   //RESETn,L138_SHK2
: [1 ]! }1 K+ K3 S: C- l8 t( {   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);    q( b0 I/ P! R! L
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   , v/ v3 {9 g! ]1 s- C+ X
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. e2 c' W* t0 i 9 _/ I* U! d6 A) G7 V
. p; L7 W4 j/ P) ^" P% \
  //SPCR Register
8 A8 P" l: F( _. M) ~8 ]+ y% h  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 r" P1 _$ @+ ^- g: t" S3 n  temp = 0x03000000;//(DLB=0)+ [) z0 i1 [. k- J2 x
// temp = 0x03008000;//(DLB=1)/ B6 c+ J9 H; \! A0 i6 E
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
  x0 a- l& ^- y6 z+ T8 W  temp = readl(IO_ADDRESS(SPCR_ADDR));
! e+ _  c6 r- x) s- z) K  printk("temp=%x\n",temp);
* _9 D8 n$ e! o1 L
* D: ?& n! ]" A9 y" k; }   //PCR Register( ~5 |$ r& x% D. `
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
# |; n% w2 D; u0 l# J2 |2 d  // temp = 0x00000F0F;1 M. T* C9 x% b7 B
  temp = 0x00000B0F;
, V7 _! k, g9 U1 j) X  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
) [2 E3 d6 n7 \$ [$ H! F. @  temp = readl(IO_ADDRESS(PCR_ADDR));* r+ u' k  X! k
  printk("temp=%x\n",temp);  
$ U$ D3 c, r$ m3 ?1 w/ f! e  h) b   //SRGR Register
! R. ^0 b4 a3 H5 Z; R* h   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11% n3 M% W% O4 [9 d5 Z1 L
//temp = 0x301F000B;& A9 m: C( ~, V( V. z7 P# ?- M
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ! O- F; d7 t5 f- p
  temp = readl(IO_ADDRESS(SRGR_ADDR));
, [6 ]- ?0 b5 A" {0 W  printk("temp=%x\n",temp);7 I% e- u& y! t4 x# J
   //RCR
; G! [$ {! y9 c% b* Y+ _; K   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 N9 Z( V: J+ H- y' z; x   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
! O' ^; E* e  w! }( t- r8 U   temp = 0x00440040;
+ T: h: Q3 w: Q+ r/ _. ^8 a2 a; g   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   : V. N- i! G3 O3 ~
   temp = readl(IO_ADDRESS(RCR_ADDR));
& `7 d7 s# j0 W5 A" m9 a1 s   printk("temp=%x\n",temp);# Q, v5 a  v6 \% L" W( R7 r% f
   //XCR
: N4 }8 W5 n9 D9 T" J   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1' b) d( I  U# d) T
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-09 Z. M) T5 b' r& [  X+ U5 P
   temp = 0x00440040;
0 c( T1 ]1 U9 o0 d8 d( B   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   + m' }  T; A6 N5 @8 X
   temp = readl(IO_ADDRESS(XCR_ADDR));
+ L4 p9 E1 E) p0 V  @, s   printk("temp=%x\n",temp);1 X* c' Z9 `: {) A5 l0 s5 |
  udelay(100);
3 d5 _. [; g: F! `2 R  //SPCR Register4 y. d/ G" }* o1 m/ d
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1: T" r/ t; L' Q* u: A8 b
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
; u6 f$ ]. k5 U$ I  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
! n- m7 x, W6 G3 G# e$ L  temp = readl(IO_ADDRESS(SPCR_ADDR));+ m2 k3 `+ o9 o% ?- C
  printk("temp=%x\n",temp);
2 F- e* `1 f1 w% ?/ `3 y) R3 _  udelay(100);
8 v" I2 w! i5 G9 p- x4 l! X! O: M  q' W/ I8 z
  //set GPIO direction: z& ]: \, B4 Q9 B5 v. n
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
# P- y! n' \* f3 V/ {: b   temp = temp | 0x00000100;//EPR----input* H0 [3 K& Z/ i
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output  ~* t, X6 E% L* o
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 r" c2 B3 q5 N2 G" P
. R/ Z9 O% {* x. J% j$ @; X
   return 0;
4 G6 @- C# _2 a# ^) |, O}1 I' p/ i' M+ z3 q9 i
static void __exit MCBSP_exit(void)
- c- Y5 A/ z% l{
! ~6 ^9 h2 e' i; O& g. Q   printk("mcbsp chrdev exit!\n");2 g+ q: t$ \. T) o! {1 x; u( |! V
   cdev_del(mcbsp_cdev);& t7 Y5 q) [; x: h# R+ s
   unregister_chrdev_region(mcbsp_dev,count);
, J, h1 B4 P9 X   device_destroy(mcbsp_class,mcbsp_dev);- b: _% P$ @9 D  I7 r8 {
   class_destroy(mcbsp_class);! Y. [6 J+ `+ Q
}/ i! |# u8 t: p% C: i  [
module_init(MCBSP_init);$ P- B8 q2 j* p% Z+ n% m" m
module_exit(MCBSP_exit);, W% v, m9 V6 [2 J  C( h
* A6 C7 f: _- F7 O: F2 C
MODULE_LICENSE("GPL");
- s8 ~: }7 S, B+ y7 X0 q- w$ D" \
9 l9 ~, Z: V; `! x$ g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. f$ g2 [; ]+ E. W" Y7 I4 r2 L. I我的应用层的测试程序如下* M$ I" U' _! e! X  k+ l  ]
#include <stdio.h>4 n9 R9 {- u, N% m) K
#include <string.h>$ ^7 o5 b$ Y! s0 y. L
#include <fcntl.h>
( o4 f- H8 t2 X#include <unistd.h>7 L& x! |! B1 v! d1 |% A
#include <signal.h>
$ Z( ]0 G1 |; ]. @% `$ O, }+ z: p2 l: H#include <pthread.h>       //线程
/ x5 ~9 g* G# @# ]4 W#include <stdlib.h>
4 Q9 v- u( e3 F6 Y3 n0 Y#include <pcap.h>          //捕获网口数据0 J" r% v; Y3 r& l+ S+ t
#include <semaphore.h>     //信号* _5 Y+ s' Z' M7 J# A
#include <sys/types.h>     //消息对列
& Q0 w4 `, D6 @; _( [7 F1 u9 Q* ~#include <sys/ipc.h>       //消息队列! `. k* n  s9 Z! M: X( Z$ n9 m6 L
#include <sys/msg.h>       //消息队列
) q6 t; j+ ?9 `# i7 \% f7 ?; p  H5 U#include <sys/select.h>& X; V+ Y2 x# L! R0 d
#include <sys/syscall.h>) S$ ^* G6 S! E: B, v  f6 f& n
#include <sys/stat.h>/ r. j9 K! K% B2 Z* o: k- j
#include <sys/mman.h>1 P$ J' ]  ^! ~! N% Q1 k/ D
#define msleep(x) usleep(1000*x)2 ^, _7 W# `/ e. _$ g
' b$ H  l  Y) q9 l
int main()
) j% p1 D9 D% z{
1 ~5 D9 J( N( a2 k! T, e5 |7 g5 x" v' k    //MCBSP,ARM与AMBE2000交互设备
8 z) I+ _2 c- d9 g3 R2 L int fd;
; P; W$ e$ u6 G. @ unsigned short data_write = 0x5555;' A9 ?- Z3 {# B% e8 w3 z1 r
unsigned short data_read = 0x00;$ e1 U. H- G( n0 X
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
' }5 B: a, A4 H4 _3 | //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- E, H; k( t: M  q. e& o   
/ P6 S* \* y& z  if(fd < 0); L" u9 a  a( k  h
  {
( v& m. _  F- q# `1 G, S  I     perror("open failed\n");3 Y7 ^. G' N% G
     return -1;' M) q- S; n/ p5 g. Q# d
  }
( t5 g7 A" k8 ?3 o6 `- L) H5 Y  $ A8 |5 }' m$ h& C
  while(1). M1 h+ a) x6 Y  Q0 s% P& K2 i2 h
  {
- [1 V. a* D2 i. F! Y! k. X   . r# e* ^" e7 v/ s3 h+ X! w
   //AMBE2000每次读写是24个字为一帧8 U2 C3 M. H9 s+ f
   //写数据时将数据在底层存储起来,等到中断的时候再发送
: @$ f2 Y. J5 U  b1 N" f" ~   //AMBE2000输入数据是以0x13EC开头的
' p# ~  Y9 V3 C) ^3 N. p1 H5 h   write(fd,&data_write,sizeof(unsigned short));8 C, T( j' ~! a
   
7 K2 V7 r6 i+ H( k0 K   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  9 I( h9 W; f5 o, J( M6 d; v
   read(fd,&data_read,sizeof(unsigned short));# A9 N  R4 l3 i1 y& @
   9 V9 `$ K& I4 v* E3 C6 T
   if(data_read == 0x13Ec)1 N6 }0 v. [$ H
   {  S: X$ k0 z- S
   
) h7 L& y$ k. ?; k  C    printf("data_read = %x\n",data_read);
( M; |( K! Z" @2 c- T   }2 U( Y; z- J3 f) c' V0 v8 o- _
   2 f$ y' T# l( c* Z
   msleep(10);
. U7 |' \% o5 Q: L% w$ S( D( F' N( R+ D" m  
9 |, B  E' @) Z/ ~, Z2 e* @! \  /*& ], ~8 I& L) e6 _
   ioctl(fd,1);   
9 M5 U8 }) i- q9 v* ]; k sleep(1);
( j7 Y9 z* D8 F% d2 V+ w$ l ioctl(fd,0);
; Y, i- d: w/ X: L" N sleep(1);
' h9 M+ K8 }6 j- ~4 w  Z; J */ 7 r  W' t- |% }. R8 ^
  }   : \" X& O3 [. j" `
return 0;
0 h) n7 e; E8 S) ~- ^
5 K# E# k6 a7 ~( D! E}: ^0 D* j9 \8 R  M% H% d

& y( g! D2 Y* ~% L- ~多谢各位指教,谢谢! 急/ e8 E, t. b! l" q2 v: ~5 D) p2 t

4 `0 l$ ^" k/ h$ Y/ R+ j# Q3 f7 L/ k$ \3 R% L- K. T& a

: U, _* L; ~' e3 F1 s/ c
) k, N2 b9 _! v4 p* Q+ a  \. v0 L( W( G( Y* T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-22 16:54 , Processed in 0.045310 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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