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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : S" [5 s  W" _9 Q
/*
# U. l3 Q( w: d8 g* z * Copyright (C) 2009 Texas Instruments Inc9 F$ U( d7 U5 x. ~& S0 @/ h
*8 m+ j. i) k" F
* This program is free software; you can redistribute it and/or modify
) H$ E7 n% x9 l  X4 {" ^ * it under the terms of the GNU General Public License as published by' S9 r( K3 K  }) S# b
* the Free Software Foundation; either version 2 of the License, or' @' _/ N$ d" v" e9 m( D' P' r
* (at your option)any later version.0 t. Z( ^  q) W( y/ S
*
  `" z! v; F2 Y" N, d * This program is distributed in the hope that it will be useful,. s0 ?) z5 ?7 c$ o( k
* but WITHOUT ANY WARRANTY; without even the implied warranty of
9 A+ r2 X- `( [' r/ b* P+ Q' G * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the3 D1 g2 K. ?$ Q& n
* GNU General Public License for more details.' l" W7 S4 F" ?9 N2 X
*
: c5 H5 V: b9 ]" n; v7 @ * You should have received a copy of the GNU General Public License2 p. \# r8 G/ [* U  a
* along with this program; if not, write to the Free Software1 s) p3 p4 N; x/ S& p6 N8 K5 h
* Foundati. N* Y& N3 m) j* g# [
*/
( {: h8 T& `& B0 f( u* E1 @#include <linux/module.h>
3 d5 Q$ ?. Y3 Q8 l) M#include <linux/init.h>' b' j- L5 P9 b
#include <linux/errno.h>8 ^- T) {! S) q3 [
#include <linux/types.h>0 I1 d+ V- b# U6 K3 r
#include <linux/interrupt.h>
2 x4 _- j- Z0 P: `8 v. V#include <linux/io.h>, z: q8 Q' ?5 K" w) z5 G
#include <linux/sysctl.h>1 x% J% o$ `5 d* u1 M! p6 f& Z3 v
#include <linux/mm.h>
! f$ k' Z9 i" d. W, X( x* p* F) t) J#include <linux/delay.h>
- G0 q% L( o) t! E8 [# a#include<linux/kernel.h>
- `! K5 l+ p& K8 Z#include<linux/fs.h>- ]4 F7 b5 M; b6 I% Y( V# ^
#include<linux/ioctl.h>
, l7 y. E( \0 p, W. V3 T0 F#include<linux/cdev.h>
& ^% q- {3 t/ q, v! M* E#include<linux/kdev_t.h>
1 X& |. i. f; W. p' D#include<linux/gpio.h>& _, \! I, o0 m" I! ?1 E4 C
#include <mach/hardware.h>
: Q9 j; j3 d& R0 U. j1 Q#include <mach/irqs.h>! z5 r- _3 w8 K0 |( h3 b
6 \$ M7 ~8 B% Y/ l
#include <asm/mach-types.h>
( T3 _2 Q1 V; |#include <asm/mach/arch.h>
; M) H# O0 D) O2 J' v7 X/ M, l' [, }#include <mach/da8xx.h>
. g6 A* Q( O) B- s& n2 S/ _#define  SYSCFG_BASE   0x01c14000/ ]3 D* x8 i/ m$ X) ?
#define  PINMUX1_OFFSET   0x124
9 P5 N. h; h/ t1 g" M1 i#define  PINMUX18_OFFSET  0x168
! t$ R2 a: h3 C/ I/ H' e$ t#define  PINMUX19_OFFSET  0x16c
/ i# V7 d# b5 i$ ?) Z, N/ Z#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR' u  [0 v% u1 ~& O
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR6 i  w& G: k$ a
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
) M" r( j- d3 v) `; ^#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR  B  Q- W' S. R; N; X, j4 J
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
6 n/ t- U# e2 f3 K4 P6 p                           
! d) S6 j' T' r#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
# v( h+ w% D- x#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
/ ~4 J: n( _, |" @& @& u, A3 b0 z//PSC
, L/ ?% r6 F0 T#define  PTCMD_ADDR   0x01E27120  & r1 C4 x4 @& |' K+ C- ?* v
#define  MDCTL15_ADDR 0x01E27A3C2 f. |$ d4 |) I
#define  PDCTL1_ADDR  0x01E27304* f; n+ Q; _" h9 h9 f! }5 {, n
//GPIO8 direction
- Q7 Q+ s3 K: ?#define GPIO8_DIRECT  0x01E260B0, p; H2 S+ T5 C& h
#define GPIO8_OUT     0x01E260B4$ @5 a- I/ G0 \  |
#define GPIO8_IN     0x01E260C0: A: L* b9 _2 N  Q' \0 ?

; V) P; H' s$ E//#define MCBSP1_RINT    99              
6 S4 m, H/ C8 _; W) x) C( G//#define MCBSP1_XINT    100  ' T! b; n) U& e. C* h" Z1 z$ C. F, f
static int MCBSP_MAJOR=239;
. j  Y$ R& R! W+ {static int MCBSP_MINOR=0;
2 b/ ]# {) a! Y# [/ p$ M) x& Ustatic int count =1;
  T8 [( G  m, f" _& M% T! P' O9 |, P4 o; T" h4 p" c
#define MCBSP_NAME  "MCBSP-device"
" Q! b/ E: {& T  g* R0 F5 f+ M% K4 P" _2 d! H( a
static struct cdev *mcbsp_cdev;
$ b: @' B: K2 {static struct class *mcbsp_class;
4 T& H7 b' }& ^" ystatic dev_t mcbsp_dev;4 r, W) w( x7 J, z6 [' a
unsigned int DRR_data;
" K1 ]: _. A2 g( w/ {, Uunsigned int DXR_data;$ ^( E  ]- z! _* `1 G1 Y
static int mcbsp_open(struct inode *inode,struct file *file)$ \+ z! {: |; X6 D
{
2 f) d3 L" }. x5 E6 N   
* f3 {. L$ H' }# T, N: V   //interrupt enable,initialized
% j5 i$ F0 X, Q   unsigned int temp;
; l% @% B9 e( J2 F; {   //SLEEP_EN(GPIO8[10])---0) {* N" p" ^2 H7 r5 q5 }3 V, D+ A
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ a, T# p" z5 ]   temp=temp&(~0x00000400);' e4 @% o3 H5 a7 j8 U  _9 ?1 j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]1 o. Z1 h3 `5 S" F( v; N
  //RESETn(GPIO8[8])----0----1
" R. t  p, B" Y. s7 z. L# d' t' N# P   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 ]+ `" i" Y% W! b# O
   temp=temp&(~0x00000100);
4 X! U+ w$ D  w; [5 G) ?   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---00 b5 g. A: W' @
   udelay(100);
% l: l( K% p( Z" C$ Q0 P; c% H   temp=temp| 0x00000100;  y7 b5 y1 L# t; G$ c' v% c
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 m2 O* D$ C7 Q; ]) ]8 L# s   udelay(100);
9 Z/ E8 Q& V, \   printk("open success!\n");# m! l! m/ u" O0 @
   return 0;6 h' t) ]" v& b& L9 i1 e8 Q! z, r
}. ]6 @! B: n; a; u4 ^
( U, a- O8 T9 P
static int mcbsp_release(struct inode *inode,struct file *file)
9 D& V% Z9 L" b) P8 U$ P2 O" P  J{
& C- w3 J: E- o1 s* m   printk("release success!\n");3 H" O% ?9 l' p7 l. g& I) B/ x' e
   return 0;
( g; {0 Q( j: ]8 j. E}2 U, z# e3 T  A* h3 s
" g% ]4 R2 ?, n) `
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)  X  ^9 w; W; ?3 H" `& ]
{1 x8 ]( h, R; k- ^9 [) `
    copy_from_user(&DXR_data,buf,len);! n3 I# A$ j) K7 F/ W: }8 r4 R7 n" _7 s
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
& c" x7 W' L! y% J0 k    return 0;3 o2 U4 g0 V) b1 _" Z& q% }

6 d9 F* k' I. Y$ `( R8 q}
! x1 x2 M! \/ O" E2 e( i  t% F6 Z  r$ ]" k& {& u$ H2 ^7 {5 ^
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 i" T- b5 i* {
{   D1 C5 C4 M" X- r4 d, s5 Q- r+ g
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 ]. A: L% T; G$ A+ a  A' c   copy_to_user(buf,&DRR_data,len); * f( F, F$ w" f  i6 B1 u4 J
   return 0;
6 N9 r+ e+ v, _}- _2 W( k7 ~4 F, ]/ H- y2 E; _/ {
: S: V1 b' G1 l0 o8 X

9 L3 D/ v% |$ n  q+ P" dstatic struct  file_operations mcbsp_fops=
: z/ w- `. M' b{
7 H( F/ Q3 S6 T8 H   .owner=THIS_MODULE," z# a. z6 l# Z  j- f
   .open=mcbsp_open,5 k6 s  J: p% W) a: F1 K3 S) v7 l
   .release=mcbsp_release,
: x" f1 m) N3 h; X   .write=mcbsp_write,/ ^. k* O! z: s1 k9 d
   .read=mcbsp_read,( f' r) q1 T  A
};  d  _5 F, @+ J# b" P, L6 [1 w: `
static int __init MCBSP_init(void)1 e: [9 l8 x; l+ [( F
{5 D( [) F/ c9 b
   int ret;
0 a* }0 V+ _* ~   unsigned  int   PINMUX1_REG_old;
% k  J( ^& G1 \2 q- W8 s5 U! a8 Q   unsigned  int   PINMUX18_REG_old;* r# c6 W8 R# @  R
   unsigned  int   PINMUX19_REG_old;
7 ]  o  ^2 [. v* S2 Y   unsigned  int   temp;  ) `: J3 G$ v* u! s* l
   if(MCBSP_MAJOR)' z; d- z" d" m# y  G
   {
- \6 R5 l0 a) r/ i4 i      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ L- t8 J* P- f  N  d/ _+ z& ~0 d      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);% O  V( I) K$ b5 W3 ~; T2 [
   }
/ z: h( T, i$ A   else4 q5 w' J; [5 V9 s
   {7 }& ]* N$ C. F3 q1 j0 x# i
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& G& v. L) B9 `. D      MCBSP_MAJOR=MAJOR(mcbsp_dev);
6 m; Q* B$ D2 o   }
- r/ W4 ~  g2 S- m  W2 \   
+ |" d0 E2 q; @  h$ O7 Z   if(ret<0)
' H% e7 {# v2 G" X8 A9 u& [$ e   {( t" X" d, W6 C8 G- I* H$ s
      printk(KERN_ERR "register chrdev fail!");
4 S; C) O7 i% C$ l      return -1;
0 S/ V: H5 l  K7 B   }
% j; K% g+ Z1 |% W& t1 E) D4 Q   
6 u$ q- a: a' w! F4 |   mcbsp_cdev=cdev_alloc();
% h9 S1 X: \2 X5 Z" H   : m. ~+ ~4 S7 ]9 s# \8 @
   if(mcbsp_cdev!=NULL)
8 w- f/ N* D9 a0 T, K! c1 q9 m   {  D* H* N3 G  Z+ ~+ {1 ]/ ^% U
      cdev_init(mcbsp_cdev,&mcbsp_fops);
, f1 r& V  I& p4 E      mcbsp_cdev->ops=&mcbsp_fops;
0 J, a% T1 S2 B+ D      mcbsp_cdev->owner=THIS_MODULE;( [3 D( Z/ R* v; P& g
      
2 L1 O; r) I- N5 f( C  A      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))  o! P6 [+ t* g4 t, h
          printk(KERN_ERR "register cdev fail!");
' T" C4 l' i0 N2 a3 u" T      else
/ Y6 t- E$ b* J* R0 @; C: A          printk(KERN_ERR "register success!\n");
% j! _4 G5 R; N) a   }+ c! A. v% h" t9 A0 f( w$ g# w
   else
8 Z' I( b1 F! i0 y& l( a   {: h5 A1 D; O- e) H$ D
      printk(KERN_ERR "register cdev err!");
5 B$ T6 H2 D" k7 L. z4 _  b      return -1;; v9 x1 w- i( _4 ]! Z. O# [
   }0 V" G7 p) L' u0 \( g  B& H0 j
   * _3 [, f! C& A0 e) _; o
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);; U  C& w- H4 k" z& Y0 I1 @$ g
   if(IS_ERR(mcbsp_class))- L$ I: w: m% h( D
   {% _- u2 N( r% c2 H; ]* K
      printk(KERN_ERR "register class err!");0 e9 p- Y- s  u# x1 ?
   return -1;
; o: F9 p7 Q( i: ?   }
! ~/ a6 U1 o+ C" v9 Z- `0 [2 M   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ T6 C  q; l5 C5 j. x* s1 q3 T1 R$ v9 J9 g4 K
   //PSC
- I( Z1 g0 Z# f   //add Enable MCBSP" Y9 e( s5 f4 }+ r+ U; I( g$ N9 T
   //test6 v% x8 P8 _6 U3 M# C
   temp = 0x80000003;
+ b( X8 T/ o, J% K: S/ b   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( s/ Q+ X' ]  p   temp = 0x00000003;
8 U$ _4 A/ h/ T; C% j   writel(temp, IO_ADDRESS(PTCMD_ADDR));& a8 f0 H$ \6 N+ V8 l
1 }4 d6 J% O3 s
   temp = 0x001FF201;+ u' J" e+ Z5 Z* k: `: ~
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));! Q5 X, Y5 g) M
   
6 P3 U4 @  D6 b2 R7 r   //PINMUX    m; h7 x1 b- P* e8 |7 o
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
8 E% V* Q# c, b* Q   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
8 R) s) |" H! M5 Q1 h/ E; }/ |" ]   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;     K0 ^1 r9 L! k+ P2 P0 z
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. w5 o5 [) Q5 v   
1 h" y$ W* T% l  t- \% }   //SLEEP_EN,EPR,L138_SHK1,L138_RC
6 ~- _. @" G2 w0 Y2 j- k: v6 X# |6 |8 b   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
3 H1 I- V. w0 Z6 F   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
' n3 d! r0 H6 W   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* e: t* \  s# U/ Y* Q' { 5 e; |! k$ [, m: _; g% d
   //RESETn,L138_SHK2$ S. {9 d8 i, {" P, ~" ?
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
) S! ]5 w- ^8 b. D. U+ s- i1 F   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
" H0 Z$ p3 {$ j9 {7 `% w$ O6 T   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);3 L9 R% f/ O, U. q* H2 M. ]6 [

' C8 j% n( u1 ^& U/ q, ]7 a
0 k: m' `/ E2 _* w- J  ]7 g$ y  //SPCR Register& X4 b9 C) c# ]' F3 p1 i
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset! j7 X$ q; ^+ U4 a
  temp = 0x03000000;//(DLB=0)
& i- B! e- W- K& R // temp = 0x03008000;//(DLB=1)
; k4 @! C4 H/ q( ~; k  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset. ^1 c, A8 t, T7 |! G' J) M5 p' q
  temp = readl(IO_ADDRESS(SPCR_ADDR));
6 D) K' g9 M( n) w! B% \  printk("temp=%x\n",temp);
6 X7 q, F/ }+ j/ `9 ~! n
, X. v6 r9 o  P; `: u   //PCR Register) C, A# h, l1 L* N) c
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0- E# N/ i8 A3 Z, w6 V; [
  // temp = 0x00000F0F;, |; D- Y) ?( F9 l$ r
  temp = 0x00000B0F;
% @3 Q( l" `1 z3 ^4 w5 U  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized $ R# |3 P4 `- R" |4 K
  temp = readl(IO_ADDRESS(PCR_ADDR));
6 M3 [! C9 f' ?: b2 [  printk("temp=%x\n",temp);  
- C7 u1 {  o! L5 I' ~  ?8 p   //SRGR Register
3 b, `9 T  s7 K- Q  a/ E   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11" P6 d- L7 d, F/ S/ M" }; V: p
//temp = 0x301F000B;
6 z" Y* r4 z# B" R8 @. H/ B   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
! g; r3 H5 M9 t1 }- J4 @, W  temp = readl(IO_ADDRESS(SRGR_ADDR));
6 [) X/ O$ H% f- q- f  O  printk("temp=%x\n",temp);
, e3 x3 h4 y. Z) n   //RCR
! o7 X4 W( r' y! r; d$ q" @   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
8 R4 I- |$ z; d6 o! c3 W   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( g4 C6 d3 `7 x3 |# Q! c9 U# E   temp = 0x00440040;5 H" h# J6 R% h+ `* P5 a* p+ r
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   8 O( i+ c5 \$ _7 u
   temp = readl(IO_ADDRESS(RCR_ADDR));
4 w, ?$ ^+ _! z   printk("temp=%x\n",temp);" L0 |; x7 A# n5 `$ B+ q" G# A% j
   //XCR
1 r  f" c& V+ T: c0 T  M   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 S* `3 P/ K9 J( [2 [1 K+ U" @' K$ j( u
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0- \; C0 D3 k# Z9 K& [8 V& M' ?  `
   temp = 0x00440040;0 p  P: P. X! ]  R( Z2 D7 F
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
  ?8 R$ n' |: F" a! ]   temp = readl(IO_ADDRESS(XCR_ADDR));
7 j7 E* e+ X$ ~$ Z   printk("temp=%x\n",temp);: \# B/ u: R' q
  udelay(100);
* ?+ ~( a% k! B3 x6 }# f/ H! c  //SPCR Register
, L0 p8 U3 W+ i" T/ r2 m0 J6 O, J  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 m( n$ P& _' S$ ~: A4 D( k3 }3 r5 l4 \  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
3 j( W+ l$ \  a  J$ c  S: B7 ]  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
$ [! [0 a- t7 g7 b1 I/ y  temp = readl(IO_ADDRESS(SPCR_ADDR));5 C' ]$ N0 r, O& R9 e
  printk("temp=%x\n",temp);
! Q8 B2 k1 _) Q8 _, W: O  udelay(100);+ {# n6 n8 I% E; U4 a& k" P+ r
- r) V8 e% Z4 T% _2 e
  //set GPIO direction8 m, X" B' v- w& D
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 p3 {0 A3 ]5 V   temp = temp | 0x00000100;//EPR----input
! i" |4 t7 w" z2 o) [   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output: x7 F1 g; @. L
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); & G1 G  X! b3 r) g- j, ^% G* V

, [5 F9 g5 x1 p- j4 S; d0 m& g   return 0;4 _& e2 K4 D. y3 D
}4 h- @4 K6 K3 t1 [
static void __exit MCBSP_exit(void)" e  ^7 W; c' n! ?, }9 A8 x) |
{
. s: k8 L3 B( c9 a# r3 D/ |   printk("mcbsp chrdev exit!\n");
9 |5 _& G7 B  w9 r   cdev_del(mcbsp_cdev);% H& [  A4 p/ W* R7 I
   unregister_chrdev_region(mcbsp_dev,count);
7 P2 j$ i# F  `9 C1 i' ?0 e7 o   device_destroy(mcbsp_class,mcbsp_dev);. g  _. F( R3 {: S
   class_destroy(mcbsp_class);
! C) p. J, O8 |- M/ h}
$ [! p; T: O! Z1 f6 V( i$ `: |7 Smodule_init(MCBSP_init);
( n, k: l' I9 I0 p: ?4 F4 e1 Emodule_exit(MCBSP_exit);
0 g1 P9 N7 o0 R4 c. U9 I
' `$ R. o2 F! v, `: u9 S7 h/ |MODULE_LICENSE("GPL");
1 ~: Z3 S5 s" T: T: P) z5 R* b4 Y2 g; ]: D
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* F6 N' X9 X. e! z
我的应用层的测试程序如下0 Y, {9 P! h* i# P) E" `. @
#include <stdio.h>
- a! a9 @, y8 d. _' d& H' f/ z#include <string.h>) }9 c9 v9 _5 S) t+ {5 B  Q% r
#include <fcntl.h>$ L6 X9 D6 |3 W; t+ Q' p2 m4 W# V/ B( A
#include <unistd.h>% K  m0 L( w" w; k- g
#include <signal.h>: a6 ~: Z- R$ F- z) I' K7 P9 c
#include <pthread.h>       //线程/ B. Y! N8 [; u9 d$ `% T) A
#include <stdlib.h>
/ j; _7 N' N6 @7 _3 a#include <pcap.h>          //捕获网口数据* I/ [( p* o, i" U  p/ y3 d
#include <semaphore.h>     //信号
# p0 a& D; L( v! X% u# N( l: }#include <sys/types.h>     //消息对列
& x9 v. P9 C$ A2 c  k8 c, G4 f/ p#include <sys/ipc.h>       //消息队列
9 X% y) H8 A6 f- A+ j/ b4 N4 s#include <sys/msg.h>       //消息队列
+ b- P' x1 S- D+ M: [, \#include <sys/select.h>
) K6 l/ |2 h$ N7 J! `- H#include <sys/syscall.h>+ l. {6 t& h5 j  o/ A4 G
#include <sys/stat.h>  q& b8 H) G4 v% I/ s2 n' G
#include <sys/mman.h>0 V/ l3 k. y. Y/ S
#define msleep(x) usleep(1000*x)
" c2 q$ p- R8 X+ b, Z) _9 D. D; j
; k' K- {, z5 [6 ?# E% {int main()
3 a) C! ~) @$ ?/ i# ^% E$ @{
9 z+ a# R' F4 A* @! E+ r4 N1 a    //MCBSP,ARM与AMBE2000交互设备
3 b6 v+ o1 _& N' u& b4 u int fd;( Q  ^8 D% w1 `
unsigned short data_write = 0x5555;# A5 O" T! t# i& d. Q
unsigned short data_read = 0x00;
7 {5 j1 I( N' X9 g1 Y' g  @' M  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
% t' }9 H+ h/ } //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 |& k, C2 i% m. v) C" @+ Y# T6 ~   
, U, P  B1 N, c5 }  if(fd < 0)8 h& A  W9 g' k/ ?" Y
  {" c$ ?& w5 t2 X2 U
     perror("open failed\n");7 y4 F6 {7 Y8 b
     return -1;
0 c; S5 j/ [5 r. @1 o( ]7 j  }( I5 j) k- V% H
  6 H6 ?: j( h. k$ \6 r
  while(1)
* `* ^8 l4 w+ `/ B% O& Y  {
5 s6 T% R* [+ G& ^   
" _; O5 R  z; T) i# D% Z   //AMBE2000每次读写是24个字为一帧
1 t. r$ [5 g1 |. [   //写数据时将数据在底层存储起来,等到中断的时候再发送
  y" r" C4 I& U- ?9 s5 z& \' t5 \   //AMBE2000输入数据是以0x13EC开头的
# d/ ~) e* v' I6 c0 a+ X7 o' ]   write(fd,&data_write,sizeof(unsigned short));
* F8 ]" a2 D! ~6 N$ X   
- a9 P8 Q- K( W: Z   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  : @, q3 t. |2 M# y1 W% Y) D
   read(fd,&data_read,sizeof(unsigned short));+ y2 ~; `. {, k
   
1 b0 Q% m% J! m1 Y5 k5 a( Y; g( _- D( X   if(data_read == 0x13Ec)
( `! I/ k1 u6 H: ?) m, e* O   {; O9 M& F9 N; ]( a2 G: \) {
   % T  y$ S/ H0 w5 l7 e
    printf("data_read = %x\n",data_read);
6 r5 b- t/ ]: @* T8 T) w+ ~   }) V( F% m/ ~5 n" D% O' R9 g' H  x
   
! U4 d8 g8 {  c- V" i! ~7 l$ F   msleep(10);
0 K8 C8 ~4 ~/ @1 V  / k) B" m" \4 ], g$ ^* ^
  /*1 T+ {: x8 O1 r) @
   ioctl(fd,1);   9 [$ i+ o1 F, a' T' ?, Y; M* G
sleep(1);( X5 y. f/ ]1 C( e' m# r3 z5 s+ ~; Q
ioctl(fd,0);
. t9 Y0 y! W+ q1 K5 c2 B sleep(1);0 F/ Q, S" {: P  |& L
*/
# R5 u5 n! c4 d1 X& S. }" \' ?  }   2 F( C) J% r4 j
return 0;( g# u4 D- }. X, k

& s+ N0 j/ y/ g; ]}
9 i$ X9 ^1 F# L* p0 `2 E# ^( ]7 f4 }* q+ k
多谢各位指教,谢谢! 急+ K7 B: K! o; R! n; E$ _
$ O, C0 U+ H9 e1 M8 f3 U3 q7 d

/ O4 W# w1 e0 p0 h8 i5 q
( Z  C# r2 Z1 i$ g+ [
' V: }2 h0 D! M& w4 A9 g5 L$ |& B# m; p2 e# Q0 _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 11:39 , Processed in 0.041465 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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