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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: " `1 ?- B/ W; }- _8 X; z$ @
/*
& j% ^5 n  }7 S, {+ C * Copyright (C) 2009 Texas Instruments Inc
2 f- E1 ^+ g! ^( L8 M! Z$ a2 j, g( V *( N  y' z' {! [) F
* This program is free software; you can redistribute it and/or modify
) m) I+ B1 Z2 g2 [; c# C  R8 c * it under the terms of the GNU General Public License as published by/ d# v& \4 r/ \- i
* the Free Software Foundation; either version 2 of the License, or
) D( b+ T6 D% g  I+ t * (at your option)any later version.( C2 Q: s# n* D& F! U
*1 ?8 Z3 F6 k9 ?. e8 x; f  s% j, K
* This program is distributed in the hope that it will be useful,5 H7 x4 x6 L3 T! I
* but WITHOUT ANY WARRANTY; without even the implied warranty of% K9 F- h' T" `1 h" p: c1 x
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) w) r. \, a. T, f+ _7 M! Q * GNU General Public License for more details.
0 T/ k* l8 s8 m0 F' |  g- l% ^$ z *
0 D; |1 R7 h1 p8 F7 _5 ] * You should have received a copy of the GNU General Public License/ M! }( L& ^, N8 a+ x2 R
* along with this program; if not, write to the Free Software
' E' F3 ^. v1 P; x9 E) g# c * Foundati6 P+ |" \/ j2 ]( w  f; y
*/( V6 g( s1 l9 a1 \
#include <linux/module.h>
' A9 V' O! e( L% j#include <linux/init.h>8 P6 j" N4 ~3 _6 K
#include <linux/errno.h>* P: O8 y7 _0 u; H% G6 T
#include <linux/types.h>
. |) M/ s+ y/ o$ ?) U#include <linux/interrupt.h>; _0 F* J: X+ q$ H( o- [) m
#include <linux/io.h>
( C  M" |* u* q  X" t#include <linux/sysctl.h>
* U' ~6 o# a. Q8 ~# X#include <linux/mm.h>2 D+ F2 z( i; u, d' ]
#include <linux/delay.h>+ f& c" s7 }& v. ~' \" w2 b
#include<linux/kernel.h>) H# E+ `0 E9 G2 r7 |! j9 ^2 S" B
#include<linux/fs.h>% M4 q. J% K. ]+ t! y4 ~& _
#include<linux/ioctl.h>
5 [  p3 B" D# D3 K6 O#include<linux/cdev.h>
3 B' ?0 i1 K9 s( j5 q9 [! b7 J% B#include<linux/kdev_t.h>
9 s2 U$ a% B9 N: v# l  A6 E#include<linux/gpio.h>
! g! y. m2 T. g! V* j7 s5 N+ _#include <mach/hardware.h>
) y- M. b$ n: @- |" V2 S. f) ?#include <mach/irqs.h>
! c! ~# m; g8 ~5 J( s7 R
* k) I1 m/ u7 R5 F& Z7 v#include <asm/mach-types.h>/ ~; v. g* R& o% q0 k5 L* C( {* ]
#include <asm/mach/arch.h>
% b4 o; E# ?9 ~  `$ d2 b#include <mach/da8xx.h>
" @( P, T) B7 C9 i#define  SYSCFG_BASE   0x01c14000, H0 S. i* S3 q9 U+ @, Q% h$ ~
#define  PINMUX1_OFFSET   0x124 5 U, f% d* a* p# H* l! ^# a
#define  PINMUX18_OFFSET  0x168
, ?! E, j' G! M8 a0 a) I$ h  [# |#define  PINMUX19_OFFSET  0x16c4 ], d; Y3 |5 A" v9 \" }, {0 N
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
; L+ \) D3 `6 i# h& K9 q! u, h' J. V6 f#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR" Q6 H* C2 N) `# A
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR8 p, }8 j& z" t1 E2 C! p$ J& O
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
; g/ h4 w2 V, W# W/ I0 J8 p6 L' b' v#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
$ Q; z# m& i- A+ G4 a                           
: y8 Y! c' Q; e) Z" o#define DXR_ADDR      0x01D11004  //MCBSP1_DXR1 L$ N+ A" F5 r1 h7 I
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR3 v$ m1 H  T& N9 T
//PSC+ P9 \6 ^8 ~1 j1 j+ l. B
#define  PTCMD_ADDR   0x01E27120  
% q2 Z% N9 z- S#define  MDCTL15_ADDR 0x01E27A3C( C, J7 \8 f; b; G
#define  PDCTL1_ADDR  0x01E27304* r$ g6 S+ ]0 s# p4 @+ T0 n
//GPIO8 direction
% ~( X7 F( ?' Y1 R# I5 j) z#define GPIO8_DIRECT  0x01E260B0
. p  F: A! r* e* e5 y#define GPIO8_OUT     0x01E260B4' k& `$ X1 c( b- J2 G* l
#define GPIO8_IN     0x01E260C0% E3 _7 }2 J$ Y# i. l

7 f% _4 A( x6 f" N0 ^//#define MCBSP1_RINT    99              
( |5 c4 t" P# G//#define MCBSP1_XINT    100  
; [& \% f$ B+ P. Lstatic int MCBSP_MAJOR=239;# Z. A5 W; ^/ R) O8 g7 u5 [
static int MCBSP_MINOR=0;
4 f8 X8 {6 Y) a4 O8 `5 c# Xstatic int count =1;- i! E3 M4 q, g( P4 i( r+ U

7 L$ f) |& e% W. ]! }2 E& u#define MCBSP_NAME  "MCBSP-device": s3 l' _, a1 N/ H! X' P, r
) C+ ?& c2 E* |7 D7 k
static struct cdev *mcbsp_cdev;
* }. V! E) g8 h, ]) f1 e# `/ Ystatic struct class *mcbsp_class;$ C$ O9 u* Q9 y+ e
static dev_t mcbsp_dev;
6 K( E! `$ S8 v2 F) q: V# W3 punsigned int DRR_data;2 c' c# `  l# E- P
unsigned int DXR_data;( F2 s" G( w4 E/ O
static int mcbsp_open(struct inode *inode,struct file *file)0 h6 M+ {3 [* u/ G) n; e
{' x: O. A: X) a3 m
   
$ j+ h" Z$ a! O# l   //interrupt enable,initialized7 M3 j7 |* c4 z
   unsigned int temp;
  S4 t, k2 B8 `/ i/ d. T/ Q   //SLEEP_EN(GPIO8[10])---0
* |* w( b+ q0 [0 X! D- o   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ q- @# n3 P. ?: @& h0 j   temp=temp&(~0x00000400);0 z  K1 X- F" D) B  T
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]5 v& ^+ H5 @: U* x; N
  //RESETn(GPIO8[8])----0----15 U8 n0 i2 E  q, l$ R
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: p* K# M$ P" \  m) u
   temp=temp&(~0x00000100);0 o& N, ]& \% C2 u4 A2 ^8 G
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0; E* }& J! i; H2 h
   udelay(100);
' s6 i! o8 A, H: U   temp=temp| 0x00000100;( |1 T3 l, n# @% R6 M. R
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ T+ @4 a' }) u2 P3 Q+ e
   udelay(100);$ O' q% ?0 |7 L+ d; z8 i
   printk("open success!\n");
# C6 `% ~! C$ K+ M5 E0 G   return 0;+ B7 g) `$ w* ^' a
}
" `3 _, |# P: a- W) J& ]( ?& _9 m; \/ u) [
static int mcbsp_release(struct inode *inode,struct file *file)) u2 U& T. P0 |
{, w/ E# ?0 b9 L% z  I' g- f
   printk("release success!\n");) A* _' U  j0 j: N3 E) i
   return 0;
7 t6 U, x: ^! D. ^5 I}
, T; {6 ?$ a) t8 X( u' e% f: Y  K4 Z9 S
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 Q3 ^0 m6 F% A$ B3 `5 ?2 D4 x{
1 o9 ]( }; u  g; ?4 k  x2 G6 C    copy_from_user(&DXR_data,buf,len);
4 W7 k/ a) a4 k: C% u/ e    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
+ E9 Y3 C$ F: Q' W2 P    return 0;" }; ^$ g1 D, F! M! E& [

8 v) J, M! I! d8 q8 Z! t}
9 k8 C' ?  H( t$ |: o/ n' S6 _
& x' M; N1 G4 y# A% ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 ?9 I2 ?+ ?) o/ C{
+ w# M' L  o8 m+ D   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));! G5 R7 h6 Y! M8 H: E3 a
   copy_to_user(buf,&DRR_data,len);
+ B# \0 D- P: _& i1 z( d+ f   return 0;, e' X( |+ a! A* j1 J% }4 U( n! l& s( t
}
4 A' b5 _- b% [! A
; F0 D' A0 M, F
. p) R1 p! d* p7 H* E7 Z0 wstatic struct  file_operations mcbsp_fops=
& G7 f$ _' }4 |6 [1 _4 e) f{
9 N" a* J6 W6 [" A. x5 [/ N   .owner=THIS_MODULE,% U7 H9 m) G5 m4 i5 h8 ], d- E" P- d
   .open=mcbsp_open,
( y4 U: D: P  o% z! Z1 u   .release=mcbsp_release,* D* R) @3 q$ h4 x/ D* y' ]1 V3 i
   .write=mcbsp_write,
) G5 j4 j# U" h7 h  w   .read=mcbsp_read,: M5 F; W7 B( K3 E' [/ c
};
% o+ F$ r- Q7 }static int __init MCBSP_init(void), P, _5 G- S* |* f4 n. P
{5 a9 g. r, [2 _( `4 g' j
   int ret;% J1 ^3 Z1 {0 }3 G
   unsigned  int   PINMUX1_REG_old;
5 K+ |! @6 u" i   unsigned  int   PINMUX18_REG_old;" t, {7 \) y, O5 Y
   unsigned  int   PINMUX19_REG_old;( b* O- R# x9 U1 T. X% f2 S) c
   unsigned  int   temp;  
; s8 M& o& K" `   if(MCBSP_MAJOR)7 U+ h. C+ A/ l" N: ~* W% W# ^
   {
9 Y% s  ], i, w4 ]* g* _+ Y' n; A      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);/ N2 z- u. [5 y5 b. X! x. p- }
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
* l* F: J7 H7 L8 A* {& n# e   }
  h0 \  J* f8 s   else9 q) G2 A8 M1 E) x! K
   {
6 h; c" k8 I- h# X  U8 D0 g+ ^5 v      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
, }4 g2 @/ y; J% I2 N; ]& \  m8 E      MCBSP_MAJOR=MAJOR(mcbsp_dev);
/ O* v4 O- _! `0 V  c   }6 U. N* p& {; s( f: o
   
, {! u( m: M9 C   if(ret<0)% z/ r0 \4 w; }6 n! p* I
   {" g% X- \% v6 k8 n$ D
      printk(KERN_ERR "register chrdev fail!");3 c9 M$ t2 g" h2 p! B, x
      return -1;! Q: j! W# D% B' _
   }
; n( n9 R7 N- `1 D9 I9 r, w   
1 B* H8 t+ }0 I: ?+ |/ \* ^   mcbsp_cdev=cdev_alloc();
' C$ P5 ]% \2 H# X$ H   
/ v% A2 z* z$ V, l( k4 h3 l   if(mcbsp_cdev!=NULL)) k& a6 W8 Q: r, i, G3 V1 g
   {* ?# e9 W" N. R8 z
      cdev_init(mcbsp_cdev,&mcbsp_fops);
' m6 c5 W3 B! O" ?' F- K% Y      mcbsp_cdev->ops=&mcbsp_fops;
7 w& P3 F" N0 P/ ^3 L  d' R& \" l      mcbsp_cdev->owner=THIS_MODULE;
, Y8 _4 p  M6 K3 g      
& e# w! f$ V1 C# ~+ ?0 D      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 ~# U( o0 x2 s; b( ^5 V, E7 A$ c
          printk(KERN_ERR "register cdev fail!");
0 `9 V3 l* w( p% k. l      else, B* B3 d+ T8 ~& e
          printk(KERN_ERR "register success!\n");
) ]( x. f$ L* W: k. c- ?( W. Q   }
2 z' k# {( k: k' Y, T7 P7 C4 {   else& C; I' a' T5 @6 I3 \, s) d% S
   {5 R3 w1 E. }6 q. @* I  E: q7 Q
      printk(KERN_ERR "register cdev err!");5 A  k- p2 p" n2 x
      return -1;8 [7 E/ }0 m$ l
   }
! U' H. n' f% b4 l   
& i0 G6 ]! _' q* p  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);( o; I4 A$ ]) U2 \
   if(IS_ERR(mcbsp_class))
& m! z# j* Z* s8 L   {
7 l0 T5 F( r  U* |5 u8 I      printk(KERN_ERR "register class err!");, _2 Z1 S, F' k
   return -1;
% }( ?) p7 b4 S7 D4 d+ V% a, i% z( H   }
/ R( u9 D9 a, l* V   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
( n# s0 s" T% y3 J: g: B, V
2 Y6 e1 v% ~2 P( l% x! W( R2 M   //PSC
9 K& n' W0 M  @  ~" O   //add Enable MCBSP$ i# C/ O- U7 [" V, b
   //test
" U" L) a1 [3 k8 ?2 n% T7 h   temp = 0x80000003;
* p8 z) z7 e# d. G   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
7 b/ Q2 X, R1 k: W7 _: @   temp = 0x00000003;
& i- i# N8 x# S   writel(temp, IO_ADDRESS(PTCMD_ADDR));1 Q# O+ K) A: _0 s/ `
* k/ @5 O6 l/ c: w! c1 z# D
   temp = 0x001FF201;
* ]) I! b4 G+ v- l   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ U1 T1 B# p; Y$ x6 L( V# W   
; `! v0 _6 I' E: L4 l# X  N+ O   //PINMUX  
# L$ j2 E9 F! Q( ^7 @- t   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,- ~) {5 H  k, o: R
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
( u% w/ {' {# n# c2 S' {   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
8 U% {7 a" }) i# H   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);. l* S, _; r. |6 M
   3 y! k8 W. K: v/ J' O: p
   //SLEEP_EN,EPR,L138_SHK1,L138_RC# A1 ^& J, ~: f# k: K9 G9 p! r
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
% h2 s) S. r/ o2 Y1 n( S   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   $ M( q; {7 K1 d/ n0 y0 @
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) d* i5 f% b. A( y6 y
! M- T8 t# U* W) Q
   //RESETn,L138_SHK2# k0 c% n; g9 {8 {% p6 y6 n% g& U
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  $ b  R' s1 u( n4 O/ _6 \. _8 [
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   . G" }+ a% P; g( L" N: r, \
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 i- P; x9 N$ W+ l/ D$ v( {0 B  d " {+ F: `5 \0 F$ Q' F; F
5 W; ?% e* S6 ?1 G* ]5 U- P- n
  //SPCR Register' e* X! f: S. u3 G/ i( P+ N
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset2 K$ G0 J0 z; \+ e' p3 D+ z' U, K
  temp = 0x03000000;//(DLB=0)
/ n2 |8 ^- B0 [5 D: L+ [ // temp = 0x03008000;//(DLB=1)
% ~9 Y& l( d, l2 `  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
5 t& P0 i+ D" [) w# \, @1 P  temp = readl(IO_ADDRESS(SPCR_ADDR));5 S/ v# z* t3 R* _0 p) {/ q
  printk("temp=%x\n",temp);; J7 y2 a0 J/ e
. ~+ O8 V! M# K# N5 E0 H& {
   //PCR Register7 o5 h  Z: ~1 W
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-04 r7 b3 h& @$ y0 G: z+ y8 g5 Z! M
  // temp = 0x00000F0F;; a  r7 G! O3 V* X( X
  temp = 0x00000B0F;
; J) f, `- B( F  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
8 Y/ J1 x" ^, f6 a  temp = readl(IO_ADDRESS(PCR_ADDR));
- T( F6 {. E  R/ k8 ~  printk("temp=%x\n",temp);  ' W9 y! b3 }( U1 Y( I
   //SRGR Register2 d& P: O  n+ q' b& j
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
5 |' L( a# v" X8 e2 ` //temp = 0x301F000B;4 z# B" H7 u% A: D; r. W
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
7 E- S& O2 V0 L# J$ C  temp = readl(IO_ADDRESS(SRGR_ADDR));1 \$ D6 O3 X3 ?( k
  printk("temp=%x\n",temp);
- q& `+ c* y0 {  E   //RCR
0 ?8 C. Z* t& \# R2 ?   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: C8 D3 N# e1 m% F% ]' g   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 m: T7 }& Q* c6 S4 C, o2 L
   temp = 0x00440040;
+ x; Y2 C, L* D9 \# A  C   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
' K4 D+ a9 R2 b2 G" X) x' X$ }   temp = readl(IO_ADDRESS(RCR_ADDR));% {% @% M- K% L6 @+ y# W2 p- D
   printk("temp=%x\n",temp);7 I. _; X7 E. V6 m9 E: E3 n
   //XCR
* J4 g) {8 e( R% b+ _# Z   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- I' H  o( d9 X8 }! W
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* U* K" d  \; ]( v. x" W
   temp = 0x00440040;
6 E  Y# P+ G3 _+ q   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   1 k8 J. f4 v4 \% d* `) W4 H
   temp = readl(IO_ADDRESS(XCR_ADDR));/ G; L6 U/ [4 V6 P+ F, b
   printk("temp=%x\n",temp);
( z7 ?" w/ [% K6 ]& u  udelay(100);' w* [2 S: ]# m' }7 f% ?
  //SPCR Register
+ |7 f: N: J2 B) S) l/ q" ]' W+ o  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-19 K1 B9 Q) r8 A
  temp = 0x03C10001;   //DLB = 0 VS DLB = 13 n: K  ?8 @8 K) D1 g
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
8 I0 T9 F: {7 x6 ?5 [( Z  temp = readl(IO_ADDRESS(SPCR_ADDR));
% _+ ^3 a4 p" r  printk("temp=%x\n",temp);# N* t, f: A8 }+ ]% ?
  udelay(100);  m1 c) k, U# ]+ L8 s5 Y& W2 Z
/ X7 @+ d0 I0 `* O7 C0 u: ~
  //set GPIO direction
/ X: i7 F1 Q: x% Q" d3 l7 Y   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 y6 p( @4 a! V9 @   temp = temp | 0x00000100;//EPR----input
3 z/ \6 q- v8 C. |# B   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
  g6 m1 r6 C( O! |( F& W   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 R: @: w% F) C# h
  p$ H5 @$ b9 W" P+ @. u
   return 0;6 I3 p6 ~2 M' l8 S
}" T# a! W2 D5 a
static void __exit MCBSP_exit(void)# q5 R/ f  B, z* h( [. h* U
{
' P+ R" H, }: @   printk("mcbsp chrdev exit!\n");
( g& \* W/ S9 _4 M   cdev_del(mcbsp_cdev);" o! Z8 g" f6 }$ ~
   unregister_chrdev_region(mcbsp_dev,count);
8 f2 e7 ^  ~6 g& F' u   device_destroy(mcbsp_class,mcbsp_dev);
% v% D; \: F0 M: ]" J   class_destroy(mcbsp_class);
" D& ?6 v) h* r5 r, s. ^$ L}+ M$ j) x/ B- s. k3 d
module_init(MCBSP_init);
8 G, J" k! ^3 O7 Y& W& F, @module_exit(MCBSP_exit);5 j: f6 ^+ p3 H+ y

: S" L, U+ {; p' f. n8 RMODULE_LICENSE("GPL");5 R5 v9 D* F8 f# w
4 a0 a1 h, Z/ f; p4 g4 G
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. W: {, x! A6 C我的应用层的测试程序如下
' A, ^; ?/ h9 X  p! `; n" f+ G#include <stdio.h>
! s) z/ l  C6 T4 E2 P, j/ R#include <string.h>
3 B: M" Y# S: h+ i% k#include <fcntl.h>
- Q  k' w# \: C5 u#include <unistd.h>
6 T6 s2 I+ B: t# {#include <signal.h>/ Y  r8 ^1 D" R  }1 v& g' L
#include <pthread.h>       //线程$ K1 e, f1 G& T! g1 ?
#include <stdlib.h>
. Z' t1 X0 Q- L" @$ I4 D/ S8 T& A% F#include <pcap.h>          //捕获网口数据1 g' q1 k# \5 E" r. A4 l
#include <semaphore.h>     //信号5 ~- N0 h- Y  w/ _: H2 V+ I' G
#include <sys/types.h>     //消息对列. s" R. E; m3 S  L
#include <sys/ipc.h>       //消息队列3 I* m% V4 X; v& {7 f
#include <sys/msg.h>       //消息队列+ O* A. x6 @" G/ e! k. R
#include <sys/select.h>0 a% F( ]" N  C. s+ x
#include <sys/syscall.h>
" n* b) S/ N; B) h5 ~$ v; A. B#include <sys/stat.h>
9 f9 T% _/ q% K6 s#include <sys/mman.h>& ^3 `9 B9 n0 {
#define msleep(x) usleep(1000*x)9 g7 W8 R, D! ?1 A7 ~& @; N$ L) T

4 N% ?! z1 T* h/ b8 P' O! Yint main()
8 r8 c% z  N1 }* E7 Q{ + k) t5 n' u, m7 m9 ]
    //MCBSP,ARM与AMBE2000交互设备* |9 w5 |9 T6 D% ~
int fd;8 ^# T  G/ R/ |* s3 \
unsigned short data_write = 0x5555;: A# V2 u" P" k2 _9 `
unsigned short data_read = 0x00;; a( M! d/ h9 e7 @4 j2 E$ N0 ^  c
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);  K" U: v0 u2 f* p; o9 t% z
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 Y4 L1 X* E) Q8 T/ [3 X& h    6 j+ D. f  y/ f
  if(fd < 0)
. q4 {  n9 V. N) `2 E  {
. B7 ^7 w7 x7 X- P/ c' u+ L- u7 }     perror("open failed\n");
6 G9 F5 k5 k) }0 f     return -1;& P. b5 Y4 h5 X+ d5 ?0 B! a3 i
  }0 F# h' Z0 i2 X- S1 Y
  
7 ^& {6 h: e1 f8 y# o  while(1); r# X. }* g, {" b& z: a* S
  {/ V! Z9 j' }" e; [" d+ f! e
   
& n! e* F! q5 u( H5 S   //AMBE2000每次读写是24个字为一帧
. B) L: S4 Y8 B$ s   //写数据时将数据在底层存储起来,等到中断的时候再发送  B5 n' y' d. f% X( G  J$ o
   //AMBE2000输入数据是以0x13EC开头的/ ~( ^, R$ ?* s! H( R  Z" @" h; c
   write(fd,&data_write,sizeof(unsigned short));; ^9 T6 T% ?9 K2 [+ L: R, |: W$ \' I- n7 U
   
7 A3 X1 r* p, q3 ~7 K, |6 P   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  / r. t- z# B+ w! o/ s. o' k, @
   read(fd,&data_read,sizeof(unsigned short));
$ O* s3 q9 I" q# o; |7 }7 c   
3 w3 ?3 u3 m- Z) z4 k  a- e5 @6 }   if(data_read == 0x13Ec)$ }/ z. K5 F9 H
   {6 q& Z' ~6 g2 p) S; o! D- w
   
( _: y: C; V( J. N5 }' T    printf("data_read = %x\n",data_read);0 Z, w: j8 P/ H4 L
   }
5 F8 \# q6 Y5 c3 q. }% X( |   4 w' e0 U! Q% I8 }# H
   msleep(10);
3 {5 l- n' r5 I: H  
5 g2 U# ^9 F  ^1 g  /*. g( {/ X  T2 T% R% b
   ioctl(fd,1);   5 a; L- F; J5 m- a9 U0 W0 Y
sleep(1);1 @" R0 ]5 I7 S; K
ioctl(fd,0);
- D1 M5 m9 k5 U$ M$ D, I  O& ]: O sleep(1);
4 D' O3 q) b  I7 F5 M# o */
) R  E' g' s- b. f2 e% e+ e  }   / L! T+ D1 D- W" e; p, }/ f+ Q
return 0;
3 i7 [$ S- {& j3 `6 V/ M6 y : t5 Y2 R, p  Q% m8 O6 @0 J
}. c+ E1 H, b/ _5 n
/ W0 s  G8 f! k( ]2 E7 L4 [* g
多谢各位指教,谢谢! 急
( I: \7 r7 R; j. j
5 H- ~' \- |6 F- a- I) D$ v8 z, {- N" p. ~7 ]$ p

* V3 G( a8 y9 S6 u; W1 D% X7 E0 r3 L( }! q( k: P3 _

! `' P% ?. d" v- [) Q; g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-5 10:18 , Processed in 0.055226 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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