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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
% q& z0 [) s/ R# o6 ^/*
$ L% |. G) d# N: {# Z. W. a1 C * Copyright (C) 2009 Texas Instruments Inc0 a( o$ w0 k; }! r3 F9 K
*4 @  z; ?" U. l. z6 F& J6 T
* This program is free software; you can redistribute it and/or modify0 D/ @' w- Z4 ?- L+ ]( _
* it under the terms of the GNU General Public License as published by4 K. @! i9 u0 ^6 N
* the Free Software Foundation; either version 2 of the License, or
1 Q" i2 r4 D5 V+ p * (at your option)any later version.$ s5 y1 Q" g" Y- ^2 g
*$ N5 ?9 v% o, l2 C
* This program is distributed in the hope that it will be useful,9 R# T" ^/ W3 u( A; I
* but WITHOUT ANY WARRANTY; without even the implied warranty of9 L  L& _+ a; ~9 G; a
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
, l* |7 Q. f! ~ * GNU General Public License for more details.
7 \2 T9 c0 B+ p( W( t *
4 M7 z2 S( E0 R5 L * You should have received a copy of the GNU General Public License8 L; Q5 F  e) y! o
* along with this program; if not, write to the Free Software4 h5 y+ ^6 D1 A4 h/ x/ h
* Foundati
# w9 o- _- s) o; K( _*/$ M( y; z1 k6 G8 \2 ?$ M+ w
#include <linux/module.h>
! L/ J$ ^4 Q* h# D. s6 I, D#include <linux/init.h>
2 M, f6 g: |3 I1 `2 k  n( r#include <linux/errno.h>
) {0 Q/ o& P  Y#include <linux/types.h>
7 [+ d; `0 |7 A9 H# b#include <linux/interrupt.h>. s3 W$ T, }; j: C+ i# W6 d
#include <linux/io.h>
0 @8 j3 @) u7 h0 p7 {#include <linux/sysctl.h>
9 N5 M- h5 h! J' s5 s6 K" r#include <linux/mm.h>
( J& {. [- i: [5 `( G5 i& M1 a#include <linux/delay.h>& ^" r* {5 L) [+ x
#include<linux/kernel.h>& p4 |- M" ]& l$ X3 G
#include<linux/fs.h>; b- x0 o2 s4 n% ~
#include<linux/ioctl.h>0 }+ R' U# T0 K; [0 [$ J. O% y
#include<linux/cdev.h>
0 @% e' z* Y. c! e" N& J#include<linux/kdev_t.h>
9 q1 o9 N7 b1 D+ l' f3 ]& m#include<linux/gpio.h>8 k) z# t9 b" W. F6 m' p
#include <mach/hardware.h>8 f* B4 J. T9 B6 k; X$ @7 D4 N. v
#include <mach/irqs.h>
$ Y3 B. m9 J* L+ S5 F9 h* R2 l4 t  Y, Q6 ]
#include <asm/mach-types.h>
0 q* S/ e4 [2 O' {7 j* c#include <asm/mach/arch.h>- w+ E) B- a  g, l) ^# ]6 b' V" @
#include <mach/da8xx.h>
- k$ X3 N# I# \& f5 Q8 ~, E#define  SYSCFG_BASE   0x01c14000
) V0 M  \2 G0 k# p" v3 d#define  PINMUX1_OFFSET   0x124 7 y9 c/ R  d3 g! J
#define  PINMUX18_OFFSET  0x168 5 b) h. g2 E0 \) z
#define  PINMUX19_OFFSET  0x16c
$ s' j& X' C  t#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
4 Q; k; k" h, y: H6 F* @#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
) P  M7 ^% A- u  T# @6 o! @#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
" f+ s5 ^* A8 c#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
  \4 s! M. H4 \7 A#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
4 N* Y3 C2 q/ F                           
; J2 U9 l3 z3 Y# ^% f, y* L#define DXR_ADDR      0x01D11004  //MCBSP1_DXR% `% p; f/ X! A' X4 a( Y
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
/ Z# Y! M3 F' V2 j6 i( [//PSC) a. y) X& ~" \* b9 a) }5 a7 o
#define  PTCMD_ADDR   0x01E27120  
0 c2 D# w+ p( H#define  MDCTL15_ADDR 0x01E27A3C$ b/ ]3 i* n, B: \8 f
#define  PDCTL1_ADDR  0x01E27304
3 i# J5 N( u/ C9 S& y9 d//GPIO8 direction7 H! a! r& Y* s) l6 v; j/ g* B
#define GPIO8_DIRECT  0x01E260B0* J; A. x  }9 a5 o0 V1 K
#define GPIO8_OUT     0x01E260B4; q  r" h; L; O; T5 l2 a; q+ k
#define GPIO8_IN     0x01E260C02 x! G+ L# a" [: l9 @

- f! }$ x/ C1 _//#define MCBSP1_RINT    99              
% X* K$ ?2 J0 C" _( Y7 f" ?//#define MCBSP1_XINT    100  # W( ]4 p. ^( K1 s5 l) }; ~# N
static int MCBSP_MAJOR=239;; C- a# q( s' S3 b2 h6 P% Q
static int MCBSP_MINOR=0;
4 B. m/ W  k' V% ?- mstatic int count =1;
% _3 o  H  E& V
( u$ C8 B  F' A$ ^$ e0 m  G5 B8 q#define MCBSP_NAME  "MCBSP-device"0 `. }: Z1 S+ Y
' n- b6 B& k$ ?  Y, q7 h5 G
static struct cdev *mcbsp_cdev;
' V0 @' r% I& |/ a; h- q, w) istatic struct class *mcbsp_class;
9 W* x# d1 M4 zstatic dev_t mcbsp_dev;
9 j# N2 b+ W+ |; x- N; i' x% G) {unsigned int DRR_data;4 h% x5 ]: N! A0 C- h; ?- a
unsigned int DXR_data;
+ Y  v' a, S* f0 G" L9 Fstatic int mcbsp_open(struct inode *inode,struct file *file)
8 W: N& s2 G$ U3 v- F2 Q2 d1 `{; f6 R% w( {, K  ?% g
   
- C2 N) Q$ R: U$ L6 N   //interrupt enable,initialized* ^+ S7 e  P+ X, U/ [# N; w6 U5 h
   unsigned int temp;
1 L( C( d1 v  r2 E6 }   //SLEEP_EN(GPIO8[10])---0
2 Q' N; c4 D. V) t& t+ {* F% Q   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, Z6 P( p: E( u( L   temp=temp&(~0x00000400);( o7 @8 q0 _( s; r
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( o$ G% \- ~/ B7 ^# a
  //RESETn(GPIO8[8])----0----1$ N% n& k! w! o
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' o% p3 N) ^' p  ?   temp=temp&(~0x00000100);9 t: e) u. u7 j* n
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0+ [2 ?. y4 `3 f/ M( d+ [
   udelay(100);
+ O* ^* I& a" \3 A6 s4 Q' q   temp=temp| 0x00000100;' V( L; o  N- e6 C
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1  j1 k# k" @5 ]
   udelay(100);
) Y$ L1 z/ m0 J   printk("open success!\n");0 G( w% N$ }* {3 x: e/ {% `
   return 0;
, \. v8 K9 {1 g: H}. c' ?' v9 Q* s" t8 @- {
9 V% i' }# K- i5 N% A5 m4 O
static int mcbsp_release(struct inode *inode,struct file *file)
1 I  ~! b0 E7 O/ z{8 N: i7 m8 m- f' |
   printk("release success!\n");
/ E' q9 ]3 w/ a% `' d/ R   return 0;
% L, y% u) `5 i$ F/ e; l+ c}
! `5 R+ G/ ]8 q4 B% L7 p; [" H9 j# p. z7 A8 X. Z8 ]: g  v9 H
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)6 _1 V# ]  i6 j' W; B
{
5 s2 d4 u% X: }1 j/ N5 _    copy_from_user(&DXR_data,buf,len);) m  K. M4 I) }1 C3 g2 C
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
* ?! ~- p8 {* B9 G( o9 _- B    return 0;
! Y' N4 s4 m% t  B8 N6 _1 o9 _ 5 `% A: ~4 C- P) L0 J6 W6 O# U, ~
}# a9 T& Q& V- L1 _2 B' {

; d: o# ?0 J4 {$ R7 W# S! G, s+ W( P8 estatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
4 `" Z& ^3 [) Y; R{ + ?! Y9 M! _/ b8 `  R
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
: g7 C* w- ^: P# f- _   copy_to_user(buf,&DRR_data,len); 8 z/ G+ I9 |0 \1 C7 V" |
   return 0;
3 \4 p$ t! I5 s  H}
9 Y, \; d6 {. n! S) P9 q2 @0 q8 O% Q( Q3 d' X! v/ M

6 `* W3 y* J( n% d. ^, K6 n$ ystatic struct  file_operations mcbsp_fops=
+ l& {$ U$ z; D( X% t% R{) q( l/ t7 J$ y* b* {
   .owner=THIS_MODULE,6 t# w1 Z' M; M" `0 [. s4 n, b
   .open=mcbsp_open,$ D5 r& b7 |# ?- N5 K- v7 F
   .release=mcbsp_release,
8 C+ I" b- p( D9 M6 ]6 M! l9 d+ h' l   .write=mcbsp_write," P. g) P; x0 e$ n0 M& g
   .read=mcbsp_read,
" V3 ?" [0 t9 Y% \# b0 L};: V* M4 c( `" I. @3 w# `  @
static int __init MCBSP_init(void)4 f1 n7 s3 k& Y4 s1 p
{
( ]0 i! f- ~0 A& c! R   int ret;# c9 g0 A# T! ~; |3 Y1 b& a7 z1 E" \
   unsigned  int   PINMUX1_REG_old;
% S3 ?. z; M5 p( Z/ W   unsigned  int   PINMUX18_REG_old;- I, C% P) t% t; v
   unsigned  int   PINMUX19_REG_old;/ B) F0 Y2 O9 c
   unsigned  int   temp;  : S0 k: m8 \3 C! x
   if(MCBSP_MAJOR). ?& J: K, U0 B5 o8 i
   {
# c! R! c$ a) S6 T      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
, N- P$ v" L# C" s/ v      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);+ N$ |! w. s' w# a- M1 t* {
   }6 ~7 D/ G+ ?; ?/ M9 T- h
   else' ^' G8 P* h5 x
   {5 c" h$ S% M) F4 E/ _, e& s4 y8 X# M
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);) X$ W0 |/ x1 H! n
      MCBSP_MAJOR=MAJOR(mcbsp_dev);) y4 H4 E0 y; }2 {# V+ i
   }
( a1 x7 R+ p; ]1 U  p7 a* q$ O   
& u) Y9 o& c2 j1 g3 D: o   if(ret<0)
) e2 P, D% ^2 {! L   {2 R* b+ ?6 Q& }) s, O1 I& X6 w
      printk(KERN_ERR "register chrdev fail!");/ D9 l) c% z+ k7 I' R$ l
      return -1;2 s* N( p( r  W9 w
   }
. Y) J1 S0 V& J0 [  A! ?; e) H( q   ) c" s& r4 U8 D7 n( C; s1 k' B1 d
   mcbsp_cdev=cdev_alloc();
$ X2 O: |& F! _3 ?: Q8 w   2 a8 X5 A8 B( P
   if(mcbsp_cdev!=NULL)+ X! c9 }2 Q0 H9 u& w6 C- v
   {4 h3 k, X/ G9 z, D0 }
      cdev_init(mcbsp_cdev,&mcbsp_fops);
+ }2 S" q1 k* C1 E      mcbsp_cdev->ops=&mcbsp_fops;
* y0 _- e& R+ T- i, }4 ?# h      mcbsp_cdev->owner=THIS_MODULE;' {* B* C8 @+ d* H7 r2 x+ D' ?& Y
      
/ a6 Q# d! i6 S- m' Y5 Z! f      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 i- }% P, _* d
          printk(KERN_ERR "register cdev fail!");" P$ X% y4 v, S. s/ x4 D7 A
      else) b9 G4 l* F+ [
          printk(KERN_ERR "register success!\n");
- h4 U4 v& a' i" V   }& M( C' W0 O0 z, U4 ?  q) U2 M" c
   else; U" o  ?$ v' t' q' I1 P$ \
   {( H9 b' C% p  S, W3 ?& \; \8 F
      printk(KERN_ERR "register cdev err!");
: u! q* \  S1 A4 s      return -1;. P8 {/ Z+ B0 h2 {1 b( V
   }
3 E9 v& `) {& n3 ]' }   
0 _: ~* w  w9 X# O  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
0 k. W" X# j5 T   if(IS_ERR(mcbsp_class))
+ _1 @3 I8 l# e7 L. O$ {% |  I2 y   {6 z+ `* f/ W* ~
      printk(KERN_ERR "register class err!");
' c; F7 ]: d9 N   return -1;- W( W5 n) Z/ a' q, ]9 u3 }
   }% C4 g+ o3 b1 L9 J$ X1 t4 h2 r" ^
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);- Y, _+ V; I5 e& K7 b& Z% G

3 ^$ W& t7 }8 N. o0 p   //PSC
% W8 k2 J  R7 h7 k; w6 b5 K0 f   //add Enable MCBSP
3 H' @: @2 L* ^8 d% I   //test
$ u; h" j$ K8 T  Z" L   temp = 0x80000003;$ H% ~& E/ v) x6 k" {9 N) Z
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));3 O# e4 Y1 S" S" y
   temp = 0x00000003;, B* _5 \" m1 E- @5 @5 }8 A
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
& j3 f8 c! v3 X5 O8 t" ]1 p+ K
4 Z- X5 R+ p1 q) T3 e   temp = 0x001FF201;
* `, M0 x' @/ [) L- R" ?   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
7 s9 t3 u7 z( i2 J( ]3 M& X   
, H3 I7 D# q9 |. X/ F   //PINMUX  
8 f8 L" G* P; k; z0 V   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
, N$ f$ L+ d2 Z/ W   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  - {( [8 `: n& ~& }( T' `5 t& N6 h
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ! ]; ^2 E" N# g2 _$ \  _
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* P. F/ }$ c" j% F1 c+ w) {   # r5 {& o/ J/ d" f
   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 p" h6 s9 P! F, U5 J* I# c* z
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
. c/ k  v  L# W0 H6 ]. J   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
7 F8 D0 M: j( M0 R: f   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
  X2 f: E, b1 M
) o, B- u  O# m! Y- H! c   //RESETn,L138_SHK2! Q1 z* ?# I5 C0 X8 ]8 Y
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
7 a" m$ r! @) O3 y* Y   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
& X! F8 ^% p& N2 j8 C. d   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 _/ l6 [, ]* n & L; r# i; U) e4 T% \2 `

5 j0 s2 B; ^% I1 v  //SPCR Register/ s+ v3 t" Y8 N
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset' o) q* G! W% m- V% [, x" Y( U: a4 Q
  temp = 0x03000000;//(DLB=0)
* ?  j0 L1 F' n( j // temp = 0x03008000;//(DLB=1)
# S" J& s+ ^- N" ^4 j  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
& `; K: v3 L% a  temp = readl(IO_ADDRESS(SPCR_ADDR));2 ~6 |( R( x# J& x0 ?7 q$ R: @! p/ }
  printk("temp=%x\n",temp);, G8 |3 M% I, C$ G
% y- n; _. n+ ?; o
   //PCR Register% H. _3 v! O6 w$ K
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ V! s1 t' [# d1 S1 g. _- Q
  // temp = 0x00000F0F;& R. t, j$ b0 f
  temp = 0x00000B0F;
; o$ P. \% r* @# v! I) M) v2 r) W  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ( f+ `$ U7 W8 X6 r/ E7 g' v& l* y
  temp = readl(IO_ADDRESS(PCR_ADDR));: `+ r" P, }/ s. d9 L
  printk("temp=%x\n",temp);  : F% l6 B, j( X* A1 _* H
   //SRGR Register
1 S$ w) |- Q& S" G* }5 d- P   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 K. a+ B" ]! Z4 D3 Q
//temp = 0x301F000B;' i# V" _5 u1 r6 G) n8 e3 b9 `, @
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
  x, P& v) q1 l5 c/ i  temp = readl(IO_ADDRESS(SRGR_ADDR));' @8 T. a/ S* j, Y- K* ^
  printk("temp=%x\n",temp);
! t! U, i( q5 g) b/ W   //RCR
+ x4 E4 o) d" L$ i0 i; M1 ~   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
2 B3 W* W7 t0 b/ z& Z  P1 ?. ^5 P% _   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 C3 \+ ~. a" z
   temp = 0x00440040;
' u" K- i9 n3 p   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   , K0 |  x3 C& o1 @" ~8 U$ w
   temp = readl(IO_ADDRESS(RCR_ADDR));6 E, u* B1 J5 I2 n+ I
   printk("temp=%x\n",temp);
' a2 C) m& ]9 {- k( l/ ?4 f   //XCR
9 u& T6 _, D  A- P   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
# Q7 x) @5 d. b% O3 U- s   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
: v! E6 O- n0 G8 v  F. B   temp = 0x00440040;
8 }* w6 Y& s0 h9 N$ j3 o5 ~   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
$ o9 [8 D- E6 U' |, w5 q6 N   temp = readl(IO_ADDRESS(XCR_ADDR));5 n- L6 ~' x: R" g: X
   printk("temp=%x\n",temp);) C2 V& `* Q; s0 ]
  udelay(100);
. t* @: L/ A2 s$ M  //SPCR Register' c* E- w1 A, z: ?" e
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1: y6 Z, ]4 n9 W" H; C: }* O
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1' i# d# I9 r" S6 V2 C
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
" t4 @: u" [2 |* x; F9 d  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 K+ V- P, Q$ e: |  t' _# P- s  printk("temp=%x\n",temp);
. S4 G+ I. l7 @  udelay(100);
! G  ]3 @$ a5 C$ H! J; O0 z# }) {# E! S
  //set GPIO direction
- {  D+ S! d, c& n' `/ ?2 c   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));( q+ h( z! `, {1 w8 f
   temp = temp | 0x00000100;//EPR----input( v) H" W) N3 c# i
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
' H! c; |1 v7 p   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
8 M* e" C9 X1 f) v7 }% B1 s1 t. W1 B
8 U/ {! C9 [: @# q+ G. P   return 0;* D5 z& C9 w" f1 R
}" A( r) L: e" e- \
static void __exit MCBSP_exit(void)+ E3 e* _. u: m9 N4 y: I: w' e
{
" A! v. ^' m( Y* ~   printk("mcbsp chrdev exit!\n");) o% ^) R! ^5 J" d4 K/ U! r: I
   cdev_del(mcbsp_cdev);
( |. {9 D7 x* n( T9 a4 L: |   unregister_chrdev_region(mcbsp_dev,count);
  C" p0 Z9 T8 q" b- W   device_destroy(mcbsp_class,mcbsp_dev);. x" L( B; q: e4 c1 Q
   class_destroy(mcbsp_class);
  }: X2 x+ c1 W! x3 u. l}# Z! u' }5 W$ U4 f/ s! V% i! j+ J
module_init(MCBSP_init);
1 x; c8 ~9 O2 V, ~6 Dmodule_exit(MCBSP_exit);0 \: c) o2 l$ H' M+ y+ q7 B1 x

( B: q: @3 u/ g/ sMODULE_LICENSE("GPL");  A4 I* Q( U( r; S+ {
9 Y5 j  g5 h. o- C5 }' Z
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。5 P& a3 S9 r: w9 ^, q: p* _
我的应用层的测试程序如下) K  q  @5 S  K* K9 `) ?! F
#include <stdio.h>
% X# j! X# o. a5 ?/ b#include <string.h>8 U' r4 P+ F  K* x9 s
#include <fcntl.h>
% o+ Y3 P! B% Z9 q( s#include <unistd.h># |9 @& Q1 p7 {  w
#include <signal.h>( k0 w/ i3 m. V- o' b
#include <pthread.h>       //线程
- v! n  i' Q. |( |+ F#include <stdlib.h>
: Z: {4 i+ L0 e3 c2 n8 Z5 N#include <pcap.h>          //捕获网口数据
: v1 w! m2 V0 g, T0 V#include <semaphore.h>     //信号. n5 m+ R1 ~! X
#include <sys/types.h>     //消息对列
" L( S& R; \* [) I" ]9 ~% t#include <sys/ipc.h>       //消息队列
0 x+ h" t; G% b7 Q' }#include <sys/msg.h>       //消息队列: p& a. x9 H7 v  w
#include <sys/select.h>
' \; {+ `$ J8 ]: S; W0 y#include <sys/syscall.h>! j& {) p7 F$ V1 q0 L8 y# {% {+ E
#include <sys/stat.h>- r9 r9 J+ Z4 t% j" l/ Q
#include <sys/mman.h>. W6 w3 _/ Z% a  y3 U6 n
#define msleep(x) usleep(1000*x)7 m0 n1 V/ O; s7 l

$ ^, K' J$ }6 V" q# Gint main(). E; D5 x( m/ @3 ~$ B
{
  l% N* Z! i$ x4 C# A6 R    //MCBSP,ARM与AMBE2000交互设备. b- }( G  n* H7 |5 V( F- R" j2 @
int fd;. a4 B% \5 U7 w1 J, |" O
unsigned short data_write = 0x5555;
  M- e% @4 D1 w: U8 S2 d unsigned short data_read = 0x00;& W( s6 R! U6 E0 k, a0 m) Q  `
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ L" o" p0 F1 r, }& X" d. l
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
) f& {( d+ i: L) O- p    ( n+ O' L+ L% |; J4 O3 t
  if(fd < 0)2 a: u3 Y0 `* A$ [7 H
  {4 ~& z: z; X. P- d! r/ A5 K
     perror("open failed\n");
* ?: P; I4 ]: N7 s1 f, v. v/ W     return -1;0 R& l7 n6 J) q7 z2 g
  }
# s+ u( p7 s$ K( O3 D  ( H4 C6 o; |/ t( u
  while(1)2 U! c4 X2 i$ E7 Y/ [8 o+ I; e
  {
! u4 }- Y9 q' I. f9 K9 E   
; Q7 M1 Q8 N) Y8 B& e1 |/ P/ [   //AMBE2000每次读写是24个字为一帧
& s1 b1 ^1 Z- F/ A% x) h   //写数据时将数据在底层存储起来,等到中断的时候再发送
4 a# L' H, B% Z   //AMBE2000输入数据是以0x13EC开头的+ ^$ m" S: g! A3 ]5 E
   write(fd,&data_write,sizeof(unsigned short));
) }" f0 Q: k- y& s; |* Q$ O3 e   
; M' q; q2 X) l. C' ^   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  6 B9 w9 a3 d+ H; A: W
   read(fd,&data_read,sizeof(unsigned short));
% [% m3 C5 v. j- E6 ~) s5 b( k+ i- y   # o4 T4 a  `. a/ D
   if(data_read == 0x13Ec)" v& B9 ?, W0 f
   {
9 U: m0 a) G; h( `/ ^/ K" V   5 Y' \+ M' W. V* _3 E4 {  O
    printf("data_read = %x\n",data_read);
1 Q; P- F! d; t" a% R   }
! V! ?1 W) T. `   
/ x: ^2 k9 W) |) ~   msleep(10);+ r3 v( N6 H) `: ~) J. Q
  
. A- s' S) K6 @# v  /*
2 ?$ B' D0 U( q/ k+ s" V% e   ioctl(fd,1);   
, @" C7 g% ]0 T" G" H, c sleep(1);8 [+ x! @9 J1 X1 N0 t/ L. V
ioctl(fd,0);6 w- o% g" U9 S( S0 F
sleep(1);
: [3 |. e$ J% r. N) s, L* \ */ 2 P' l  M4 K" }
  }   2 v4 h& v* J% o- K" e; I& o' Y
return 0;
6 x9 u' m& w* E4 Z4 ?/ c3 B
- B) Y/ b) A4 U# f0 c}
9 _. p' i0 c9 S' Y" J
- X  k0 G# d* k) C  _$ W2 b& t, A多谢各位指教,谢谢! 急
( A/ d$ C, b: O% Q' ]- n% H% O" S
: ?" J$ O0 \2 y. j, Y/ z7 O9 T! f' M# I$ w5 ]

' m6 L6 T+ q; j* r; w/ U; N% b) w( m5 S

/ u0 k/ m! Q5 W) _- \* m: Q- |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-6 21:51 , Processed in 0.048766 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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