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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
' |3 D( d  ?. }2 u& H. k/*: Q8 _! L4 R, f+ y) T
* Copyright (C) 2009 Texas Instruments Inc
) s8 ~  f: Y4 P8 |6 |  _( g: D *
9 b$ T0 ^2 f) N; R7 k4 R# x * This program is free software; you can redistribute it and/or modify
6 T/ S: A0 C- D. j7 q * it under the terms of the GNU General Public License as published by
8 ]( f. g" y6 R" }* w/ x( v * the Free Software Foundation; either version 2 of the License, or# u; B. o* V- ]" J
* (at your option)any later version.3 P, W" E( W) c8 }2 B0 ^" _% Q2 D
*- _$ m/ ]# W6 i6 g) {- F. B
* This program is distributed in the hope that it will be useful,
; G! t8 X" y7 _ * but WITHOUT ANY WARRANTY; without even the implied warranty of
& ^# W  }' e; |: L1 a3 B7 c% ~5 V * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# R  I6 h: G% o2 z/ n
* GNU General Public License for more details.9 e& n" Z# O& R+ e1 A- }( }- }
*
$ u9 J* o& z( B* H3 ^: B* l * You should have received a copy of the GNU General Public License' A9 i5 c3 S& X, w
* along with this program; if not, write to the Free Software8 N, {2 ]) O1 y) x
* Foundati
( |) ~: }! g3 E) X6 B) D6 {*/
: {8 j. F) |5 W$ e$ C4 }#include <linux/module.h>7 |+ l# _& d) H% K9 W
#include <linux/init.h>1 C! [: d8 T) r7 N& ]
#include <linux/errno.h>* T# S" y- Y) |8 P* s2 ^" I
#include <linux/types.h>
, }/ C" J! Y, m7 N& Y9 g#include <linux/interrupt.h>$ o5 Q1 Q7 }  s6 W# i# z$ q
#include <linux/io.h>
4 J) E# ~' I) i9 o' s#include <linux/sysctl.h>1 r$ R" d/ ?: B! v% m5 N
#include <linux/mm.h>, Z- |  F9 {' p, i6 k" c
#include <linux/delay.h># U/ K( u" x: Z5 _9 ]" p6 `
#include<linux/kernel.h>. O. A# ~1 Z9 C+ J
#include<linux/fs.h>( x) k( a) q$ s7 E2 i
#include<linux/ioctl.h>
: ?4 F: ^) J, k! ~/ U/ Q9 {0 ^6 {9 S' {#include<linux/cdev.h>
# o8 d  U1 S; z! h#include<linux/kdev_t.h>
$ V$ i; m' p  ?0 o#include<linux/gpio.h>
5 _- m6 |1 ^0 R+ n& b#include <mach/hardware.h>( t) M6 B8 x9 _2 z
#include <mach/irqs.h>. q. u; X8 l+ n+ e! W$ u

/ M7 c. r- |! G7 ^$ Z: F#include <asm/mach-types.h>
8 I, N  A% u- U#include <asm/mach/arch.h>9 u3 o4 P" p- w! M; R7 _
#include <mach/da8xx.h>
$ B4 d7 _. R  |+ D2 k1 A) v#define  SYSCFG_BASE   0x01c14000
* |: P8 o3 S) q#define  PINMUX1_OFFSET   0x124 6 ~: h7 D; V4 D
#define  PINMUX18_OFFSET  0x168 7 [5 X! h: l' T% L8 m
#define  PINMUX19_OFFSET  0x16c
+ D& p" b) S, O% ^$ n#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
* Z3 _! ~3 l2 x6 G4 d( L  T+ V#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
) g! I7 Y& o6 b#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
2 j3 O$ E1 T" d6 Z% Q" o' s" r#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR9 Q8 U# ~* J# ^& ~
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR3 P0 k! A- ?( o. f& F
                           
, y$ K& s% L7 E5 j. ~" o$ U#define DXR_ADDR      0x01D11004  //MCBSP1_DXR# }! R/ {6 u( S6 R1 u& n
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR5 ], }5 L% Q% i7 b  D$ k- d
//PSC
* |# U* N) P. `1 |#define  PTCMD_ADDR   0x01E27120  . g' m* r8 N( m  m" T
#define  MDCTL15_ADDR 0x01E27A3C" f. L- c3 X% ]3 X1 [% m
#define  PDCTL1_ADDR  0x01E27304
5 n, X" }6 e" N& w7 F//GPIO8 direction6 o. M/ X; N. H+ K2 r0 R* k
#define GPIO8_DIRECT  0x01E260B0: w, j0 K+ h# c  f
#define GPIO8_OUT     0x01E260B4
- W  Y+ ]0 ~  ^( t5 u#define GPIO8_IN     0x01E260C05 u, |- `! |2 \

7 k/ B+ E. B8 ^//#define MCBSP1_RINT    99              
% l  K% c4 N5 q8 \. X//#define MCBSP1_XINT    100  ! w( o# q8 d4 m
static int MCBSP_MAJOR=239;
% A7 P( i7 E0 T! n7 X8 cstatic int MCBSP_MINOR=0;
' F! x/ I7 k" j6 Wstatic int count =1;+ Y$ J1 F( Z" _0 o
+ ]* k- s: j! }. X# `7 a
#define MCBSP_NAME  "MCBSP-device"' l; U' Y. i0 e0 v/ F# B, V* Q
* m% `* Z8 d5 d1 q. ?, Q$ V
static struct cdev *mcbsp_cdev;+ c3 M, o( t. |
static struct class *mcbsp_class;
7 J. u* ]' n9 V6 J4 B7 }, zstatic dev_t mcbsp_dev;3 d: a+ v1 B3 ^! I& i, E# r& ~
unsigned int DRR_data;
! x5 F( ~8 Y4 A- Gunsigned int DXR_data;# j7 R4 {/ y0 h2 f0 T
static int mcbsp_open(struct inode *inode,struct file *file)% L" n2 ?% A1 H4 ~" x' m
{. o- G( Q0 {1 ^- k: O. V
   6 ^" F4 G1 I' _
   //interrupt enable,initialized/ _) t7 T; q7 b& s4 G
   unsigned int temp;
4 W" \2 {' D8 T& U5 t   //SLEEP_EN(GPIO8[10])---05 B/ j- ^; \% ^
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 l1 `1 o1 h0 U# U! R   temp=temp&(~0x00000400);
$ L! L3 W, l! t) h  W6 ]% x6 s; u   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
0 w/ i! H1 e% ?3 v8 d9 J  //RESETn(GPIO8[8])----0----1
; {7 ~! O- ~$ z- O9 G. |   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( @- |& T2 Z$ V8 @
   temp=temp&(~0x00000100);
3 N* Y0 A$ m: z9 w7 i3 `   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 O) P; Y7 c. \. c! y# p3 t   udelay(100);
, n1 T3 N) {2 A  C1 G" d2 W! D   temp=temp| 0x00000100;
+ u$ f& O9 B4 ^0 F0 ~1 S# _0 @   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 @+ @/ D# e" B; A" u0 B) U   udelay(100);6 X9 C3 Z# n: V3 Z
   printk("open success!\n");1 ~- U/ y' O% _# M# w
   return 0;
* o5 c4 x8 X! a/ l! W: k( k}7 w7 A) f3 c1 o/ H8 u, U
# V8 |, I% v( {- Y2 S$ r
static int mcbsp_release(struct inode *inode,struct file *file)6 i& P# s, T9 v: P  ~* G
{
" M; E' X+ s3 ]! U6 ]0 M& H( ~& R3 v   printk("release success!\n");, \; |1 O- Z8 s0 o8 V! S9 @. L5 `
   return 0;4 w- T# x2 t, i, v2 i
}
$ S8 |) C- |, ]
* B; H. E6 I, R4 A; W3 t& nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)) e. y. {" i4 C8 Z+ K- |
{8 Y  M* @! L  Q. V
    copy_from_user(&DXR_data,buf,len);" ~6 O5 J" ]! e7 d0 [6 G7 N" C
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
6 [1 @  }% w" H/ O' a( M) G- ~+ C    return 0;  F" ~. y2 Q* B) |: j
, _9 \+ N; P& J3 a4 r& @& L
}+ A5 U9 J6 v# J1 l9 G* D

+ y& i, r% W0 C' k6 f' _0 }static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)8 c( E: V- k. @0 I
{
, _( K* Q. K1 u1 H5 m   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: Q; @. @0 N6 r
   copy_to_user(buf,&DRR_data,len); * N; }5 X( Y! ~) v. Z$ d% A
   return 0;* @* g0 h* G( L6 Y* R- d
}8 F( f+ M: D: l2 g0 g! S8 k
% a1 d/ h8 J& y1 s& \8 S

4 o1 v7 T( g* e8 q+ ]3 gstatic struct  file_operations mcbsp_fops=
+ G! Z  G  t+ a7 v1 U0 S{
% }6 Q3 q3 P* h3 A. M9 d; f9 a9 A9 D- j   .owner=THIS_MODULE,
) P) u- c/ z: r7 \   .open=mcbsp_open,
9 O& W$ E9 r) {# j9 ]$ F   .release=mcbsp_release,
" [  l9 x; V5 t3 J! O- E' _   .write=mcbsp_write,, P$ [# I# D. j9 z
   .read=mcbsp_read,( @  S( L6 N2 v& w3 J, C
};5 _% U) ^3 h* l" q1 _
static int __init MCBSP_init(void)( h3 L( g+ Q* N" ]: ^: M
{# M/ O# x' W6 Y  ]7 Q: F( w
   int ret;
6 @: e4 c* g' s  s: f; D; O   unsigned  int   PINMUX1_REG_old;0 ^. b7 z% [( G( q. w2 @; i
   unsigned  int   PINMUX18_REG_old;0 d! }0 i. C# W4 u9 l
   unsigned  int   PINMUX19_REG_old;: t1 x7 @; t1 k- r
   unsigned  int   temp;  " e, B2 _1 H. h& M! h( O' ^
   if(MCBSP_MAJOR)
0 |2 `; [& \" s5 m* A   {# J$ w+ Y& H9 a
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
! f0 b* b" L6 u9 C: D      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);6 K; g  Y  A. ~6 N  P! M
   }5 L9 g! E5 O3 g- [3 ]
   else/ Y* @7 [! k# \) x( C
   {/ J" E; T, @7 x% b1 q! Z
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ U4 [1 y8 \# Q& ^2 e4 @
      MCBSP_MAJOR=MAJOR(mcbsp_dev);, b8 M4 h8 e  X4 `0 N$ W
   }
+ I! n# ?' K7 l5 J# `& g! T     R: U- |, i' R- |" c
   if(ret<0)
( P  k0 @" U  u. E9 ?. g9 I  W   {1 q* g) j* H# R) j* D' @
      printk(KERN_ERR "register chrdev fail!");  L, e' u( \2 ~) L! T0 V+ k
      return -1;
: R3 ?1 }9 T( R; I   }
& g; m( U) X  i& m! w& r5 x& Q   
2 b/ ?  C  P7 J# z, J   mcbsp_cdev=cdev_alloc();
% i( W% @+ r* ^: V0 W   1 B2 R/ O; b# \; ^; W# w* b) T
   if(mcbsp_cdev!=NULL). j# M6 d  O& b6 E) m0 ^
   {
) R# r( t  M, a) V; C6 S      cdev_init(mcbsp_cdev,&mcbsp_fops);
. q  Y) r8 Q1 S; k      mcbsp_cdev->ops=&mcbsp_fops;9 I4 g# Z' D" E5 X" _9 s
      mcbsp_cdev->owner=THIS_MODULE;
9 [: f- V0 I1 J( G+ M# T  B7 X1 d8 {7 D      6 {! M; v# `& H# e8 Z
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! t/ D( C+ U( k+ a% F% y          printk(KERN_ERR "register cdev fail!");& C" M$ k; U; c+ ]7 E/ K$ s5 H
      else
. L/ {+ h( @- {8 Q; V1 h/ t8 w          printk(KERN_ERR "register success!\n");' i+ l2 A6 s  i  x) A# V) b
   }+ o$ T5 ?! U' g6 H
   else' ?. f* m9 V1 k4 j& T' Z: E
   {
  I$ t' r) T! D7 H; m. @, Y) b      printk(KERN_ERR "register cdev err!");; K9 P! h% I5 ]  u0 r- [3 X
      return -1;
4 v/ [, d: `* G( O- j; x5 j   }. g- e  t6 q4 N
   
1 S& o: {6 k7 b0 U( m: H  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);0 y' O# I, k5 {0 P, t/ h
   if(IS_ERR(mcbsp_class))
: S$ i/ i, D/ H$ C   {( T) d5 ]  Z7 g; k/ s: E- n. h
      printk(KERN_ERR "register class err!");
* o9 F8 `& w! Q. [& v4 [/ q   return -1;
" H! I( A1 |4 R( r" B) N3 |0 N   }
6 a& G  Y5 o* Y( g: ^, W" h( \   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);4 T5 h* X! S& @& ^
- n4 Y' l0 r: c5 O: \
   //PSC
) Z5 ~6 I5 @. F& {5 `9 T   //add Enable MCBSP
/ f; K' Q! q8 f/ p3 h0 W   //test
! V% X$ c" i- l3 }) d4 H3 B$ d   temp = 0x80000003;
- R9 A7 f" L8 M' S) J   writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ k6 d4 p7 K+ B, B4 S1 \; w
   temp = 0x00000003;+ J) d# p2 u8 J7 w, i! B
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
9 {! P9 b4 Y  B; F# x
# X) Y0 V5 P% V9 I! E6 s( I6 |  P   temp = 0x001FF201;' N2 ]. `* O% N) Y3 S/ `4 O
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));9 M# ]7 `. c% k( \/ V) \
   
# ?8 |! y1 k6 h' ~. |0 p/ y/ w   //PINMUX  
2 q1 v# X1 H+ S- i& m/ S, `   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
  k+ K% u+ T6 K& Z0 [   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  8 L9 U- k. u" G+ X* z
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   / F' M) Y- ?7 Q- C
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 A, q) ]9 V7 e3 V7 s   7 Q. }+ B# g0 C" [. U* Z8 d
   //SLEEP_EN,EPR,L138_SHK1,L138_RC! q' r8 y3 M0 E4 e
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  + i- _0 h' m- g5 h! _
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   - {( l( p; P( y; R3 X& c
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
1 q/ `4 a2 {6 |
: e$ d  q$ _$ e( i1 ]# J$ }/ z   //RESETn,L138_SHK2
' z, K, B4 h9 @1 o( u  f   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  $ F, @0 c( ^* w# W- U1 d- d
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   & F6 I0 X8 t# g) C& Z
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);0 K) W9 b0 z) F% L' U  e9 j

) V2 x6 C  J( e" D # q+ G2 T$ e7 \+ [$ T
  //SPCR Register- f% f  @# G5 e5 b2 t9 Y
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 c+ \7 |# h5 e# s, z  temp = 0x03000000;//(DLB=0)
2 C! l, a# e# a/ a* U. I // temp = 0x03008000;//(DLB=1)7 Z9 n' w3 h" V3 Y5 M# a
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
- ^, w, X, F) @$ w5 @+ J, K  temp = readl(IO_ADDRESS(SPCR_ADDR));  x* {$ s" G3 X; F9 T1 v
  printk("temp=%x\n",temp);) T0 k; V! V# E/ ?( `7 H* h
& A5 n7 C( p; _% M
   //PCR Register. W, l; K' I. B$ F+ u
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; h& y9 Q8 q: Z7 @4 K
  // temp = 0x00000F0F;9 @% k# m) ?9 Q. J$ q
  temp = 0x00000B0F;# p7 ~1 T4 v( H5 o
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized   P- X) P3 m& E! I# p
  temp = readl(IO_ADDRESS(PCR_ADDR));8 W% j( ]# _; v  F
  printk("temp=%x\n",temp);  1 g$ Y6 P! P# a6 A5 M, \( ?, B% _
   //SRGR Register
; K$ `3 s% t* n: D8 {   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==114 p- K4 w: y1 ]7 U# |
//temp = 0x301F000B;: ^9 @9 n$ g, B" ]
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
4 _! q5 F5 t  F8 v* G  temp = readl(IO_ADDRESS(SRGR_ADDR));
$ f9 c- A+ ^2 L% A, X# [' E  printk("temp=%x\n",temp);6 o2 b4 i9 O, `9 K, H
   //RCR
6 D  ]# G: L/ r   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* P$ r' l6 l) t! y+ z! p- N- q   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
5 Z  ~  ~; g2 W  s9 L& ]) z   temp = 0x00440040;, P; |7 @& O' I
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
, Q' P0 o) c3 o9 i0 `; @   temp = readl(IO_ADDRESS(RCR_ADDR));7 L' D  `- S: D! }
   printk("temp=%x\n",temp);
; M; q1 @, x9 ^9 n  u( H   //XCR
! b$ c+ Y* s) u   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
- W3 n# I9 g8 B% b0 c   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
& N. {) T0 I* n+ c/ l) q! \+ [4 N. l: h   temp = 0x00440040;$ b0 N! o* e' I$ |' t" D9 a
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ! w# x: Z; U1 m" ]3 Z- ]3 ?, |
   temp = readl(IO_ADDRESS(XCR_ADDR));
* B8 B5 p0 A6 v% u   printk("temp=%x\n",temp);) u9 N7 Y/ |5 g% S
  udelay(100);
$ O$ A4 S/ ]; `1 }4 a  a: d% G  //SPCR Register3 f! L) R4 j: h% o! f) ^, Q: \
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
: j7 ~& c& m6 j2 F7 O' ?  temp = 0x03C10001;   //DLB = 0 VS DLB = 1( x3 V- ?) o  x& ~, S; x
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 g2 l5 \/ ?2 g* [  temp = readl(IO_ADDRESS(SPCR_ADDR));
& c+ i- y/ ^8 O5 n  d  printk("temp=%x\n",temp);0 c; _4 T/ i. o2 L
  udelay(100);" a( p' K; r: x/ S0 W+ b2 z
" \/ M6 i3 R; X
  //set GPIO direction) Q# _4 A& z$ K2 c
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));9 i1 Y8 {' {/ {1 L# Z5 U# Y
   temp = temp | 0x00000100;//EPR----input, \: m! r0 _8 |2 S$ M0 @
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 k. K' g6 A. ~/ y* q# K5 V% ~   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
2 H! }  @( n( y( _ * O& B; \& n: y/ F: b
   return 0;
$ {/ E8 r/ p1 ~! c}
3 [& b9 H3 o* p' d5 B2 D3 i8 hstatic void __exit MCBSP_exit(void), ^# }, e6 {3 d% L6 |
{% }% q7 P5 d( e* n" a
   printk("mcbsp chrdev exit!\n");+ ]! @( s5 i' S
   cdev_del(mcbsp_cdev);" y2 W' a6 H5 F( d
   unregister_chrdev_region(mcbsp_dev,count);' e2 F- A4 b6 a6 E' J" W' J6 t
   device_destroy(mcbsp_class,mcbsp_dev);
+ u9 |+ }1 s2 O- s  [5 u* n; Z) H   class_destroy(mcbsp_class);6 J9 s  P" m# T! Q
}0 F; U8 u+ {2 ~1 K
module_init(MCBSP_init);+ \  Y9 R; z# I
module_exit(MCBSP_exit);/ N+ M2 M% R/ R1 q0 B: m2 l

- Y( i+ ~2 L: b9 j+ u" mMODULE_LICENSE("GPL");
% {3 G# }( M7 b' F( k7 o+ Q# `0 c, d+ G2 P0 ?; w3 m0 M
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 s& Q& K" n  W) k% w9 J$ t6 u4 A: D" [我的应用层的测试程序如下: W' ]4 o. c9 r9 P
#include <stdio.h>$ H! X1 w7 o* ^* Q8 \
#include <string.h>& |7 ?# E* k/ M5 a
#include <fcntl.h>
( P& u& f5 g$ x% i#include <unistd.h>
9 H( v, s4 y; [+ z* X7 E8 X#include <signal.h>+ q! l+ d6 A  f8 O
#include <pthread.h>       //线程% V. i/ W; R! A' U7 j# _  Z1 l
#include <stdlib.h>3 D* j2 L1 t* F2 n
#include <pcap.h>          //捕获网口数据9 M! x+ F( g8 \; ]
#include <semaphore.h>     //信号
, W0 {/ E/ a, J) f0 C#include <sys/types.h>     //消息对列
% g; S2 I, s4 B* i) y  N3 N#include <sys/ipc.h>       //消息队列5 f1 h( Y; O, X1 S3 W7 C
#include <sys/msg.h>       //消息队列3 C! ^4 w, X$ o5 j$ G
#include <sys/select.h>
& d# B$ v5 Y0 R% S0 K#include <sys/syscall.h>
1 w' q' @' J/ c( @6 ^9 D" T#include <sys/stat.h>
' R0 f/ |6 O+ V/ m" o4 D! h#include <sys/mman.h>
* h! q' f- @* R1 K9 S9 |#define msleep(x) usleep(1000*x)( f" A/ F: F. e# [  T  u
$ Z2 [. S8 @, X5 Q7 E" c3 W
int main()
) a5 p. {9 o& k1 X) E  v% K* f/ o{
- p" Y  h1 j( _& k    //MCBSP,ARM与AMBE2000交互设备
% @0 B; ]9 M$ ~4 c) w1 Z int fd;
0 U0 l2 y6 W1 x% J unsigned short data_write = 0x5555;
) I/ P- ]+ C+ V, e  e* n unsigned short data_read = 0x00;" q7 C; D: |" c
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);" f3 f' [) g: z& ?
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 F0 `6 I+ N3 z/ G6 w/ h    $ }- I: v$ G2 X, b, J- c
  if(fd < 0)
3 O/ p% X4 ?4 M# q1 m2 z: p, Y  {
" D4 b! g4 I0 }! A/ @     perror("open failed\n");
& q4 _. K% L) H; o9 I: F$ B     return -1;
/ y  Z% {8 r, M$ T  }
3 C' D! `$ j: D& l1 n4 J: Z  
) Y1 d: M1 Z; M' d7 {3 S  while(1)
$ t8 l' Q3 }# [; ~  {
! Q0 w& C! T! C- ~/ W; o$ h" d1 k   6 n7 I4 N- y6 Y: n% b/ G
   //AMBE2000每次读写是24个字为一帧
$ t: O+ r/ ~6 A* u0 n: [5 `2 B   //写数据时将数据在底层存储起来,等到中断的时候再发送
3 y3 _& ^, q5 i! T& ?' p7 u   //AMBE2000输入数据是以0x13EC开头的4 F9 F4 {+ B8 w: [8 a
   write(fd,&data_write,sizeof(unsigned short));1 j. B% F( B: T) G* S. g
   ( V: [3 y; ~8 Q
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  * ~: h# l, \5 k/ _% S" _, a
   read(fd,&data_read,sizeof(unsigned short));! Q& r! K" T& Y% h5 r- v
   $ E0 B, E* Q( H# z, E5 l4 Y3 f
   if(data_read == 0x13Ec)8 Z/ F: U- M& ]% u" }
   {, C- Z! g/ m: f9 I
   # L" T* h% z+ i+ h" w" b  B) B/ \
    printf("data_read = %x\n",data_read);$ X1 B0 a. p) D
   }7 v9 s# Y; Z1 ]' L+ z9 x
   8 Z3 |9 a4 j' q3 S
   msleep(10);
# q2 W7 Q- @9 i( K  6 D: n. [8 a1 ?! v3 O! d' {
  /*7 [) e% ~7 F) f1 q+ b+ F% a
   ioctl(fd,1);   
4 C5 c: J; `6 d7 u3 [  c6 y: b+ e sleep(1);
: S, l) @8 l! ?; b ioctl(fd,0);
" l6 {. L' p! F/ B: Y3 i7 t sleep(1);
) f5 K+ Y4 D% N' U9 C$ c4 _ */
7 H4 R8 n+ _3 k% p" C0 m7 z  }   
4 m% h* c& F0 f% h  z7 R$ f return 0;
1 Z& s% f$ L+ i0 ?( K# r) v
$ N  o" a6 w, S6 R. y7 _3 V% ]}" D4 _7 @# q0 y6 k; i
& l/ Y: G  y7 E$ g, y# m
多谢各位指教,谢谢! 急* w$ J9 i9 ]* f5 C( T, \

, y8 `. t% p! \5 L  b! w& W9 C
' ^4 u& Y) S/ |9 `  k8 O) J2 y/ G1 l

' \3 x% l+ ]& M0 E8 U- g  y- C$ Q9 v- v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 04:49 , Processed in 0.043553 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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