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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: & Y" H* Q1 P$ e* b' o4 Y
/*( G/ \' Y1 d/ c$ D7 G3 G6 p
* Copyright (C) 2009 Texas Instruments Inc
: |2 ]% K$ b+ M8 p1 g& U *# r8 T) ~0 n) u1 {# v  r) i$ r
* This program is free software; you can redistribute it and/or modify
; W* c8 {- n3 d8 G * it under the terms of the GNU General Public License as published by$ b: p6 J$ u+ F6 m8 w, w2 M  |; r
* the Free Software Foundation; either version 2 of the License, or  x' \' x# G5 f/ i
* (at your option)any later version.: Z, e. c/ y7 E6 \* h0 q
*
# D7 G- _& r( c$ U  H) Y4 } * This program is distributed in the hope that it will be useful,6 Q& S$ d8 d" ~4 x0 F
* but WITHOUT ANY WARRANTY; without even the implied warranty of/ A5 Y) c6 d: s( H% f
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0 m( N* L) X( _$ c# ?& J * GNU General Public License for more details.
& h2 k" a+ v( u *! H- j6 X6 Z# h0 {7 a
* You should have received a copy of the GNU General Public License
! t# n+ M; o$ E2 ~! k$ T! ?5 y * along with this program; if not, write to the Free Software
; D" W1 Z% A9 N) k+ |: P * Foundati
6 J, W8 o6 ?8 G( f" z*/' c) \- Q' h0 R5 m
#include <linux/module.h>
3 `! o9 u- _7 i# j: d. X/ U3 ~#include <linux/init.h>, ?5 t/ x% Z6 G6 d( \) o
#include <linux/errno.h>
6 F2 n& P3 e- Z6 ^2 ~#include <linux/types.h>+ B; x" x* y; s$ C7 M' P
#include <linux/interrupt.h>
0 f2 w) E8 X5 @- h5 d* u5 ^#include <linux/io.h>
2 K- b. B  b4 D% A7 u#include <linux/sysctl.h>
' l. {. e: }' i" c  l& r+ p( M/ j: t#include <linux/mm.h>
% k' `  b/ ?/ q* R#include <linux/delay.h>
1 z- q) C3 O1 I3 |1 i% ?6 `  u' E& r#include<linux/kernel.h>0 y0 D# |* D! c
#include<linux/fs.h>
& f$ ~# ~# }7 U* o/ M+ d3 w#include<linux/ioctl.h>
9 c) P* D2 k' J& I1 z#include<linux/cdev.h>, V4 E! o/ c9 ~, m$ u+ M+ s& U; l
#include<linux/kdev_t.h># ~+ u/ J: @6 L- X) P5 }. K
#include<linux/gpio.h>
2 t0 O4 u4 p: G' q9 s3 ^% D#include <mach/hardware.h>9 Y3 `4 G3 |4 ]& A+ [5 ]. L
#include <mach/irqs.h>8 e- G! z6 P3 B1 l: S# D
: e( [! K$ O5 h# o! b
#include <asm/mach-types.h>
8 P5 ]3 S! ^; c4 j# `7 A#include <asm/mach/arch.h>
) y  p: H* |- U+ B% j! C6 o; b. ]- U#include <mach/da8xx.h>
6 T/ Z9 D# ~  d#define  SYSCFG_BASE   0x01c14000
7 {" g, U. L9 g* T#define  PINMUX1_OFFSET   0x124 9 b+ i+ k6 Z) `+ q" F) N: R
#define  PINMUX18_OFFSET  0x168
: Q7 e; p7 v+ }#define  PINMUX19_OFFSET  0x16c% O0 w% y( [; w2 \
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
8 A' P5 B- s$ A; V#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR3 g# C* E" q0 X1 |! A* k
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
) g7 h7 J. f, a7 p  d3 [#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
, y! g. W4 G8 c#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR2 i& w9 D* D+ K- w5 s
                            : ]  W% @: n3 }7 J0 K" j
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
# p/ o& l! z& _7 H, O3 f, y#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
' w( k: Y4 f; X* U- `8 V! ?! _1 T* r. c2 g//PSC& L1 p( @; X, |" h0 b
#define  PTCMD_ADDR   0x01E27120  6 `2 W& |6 M" C  L0 |
#define  MDCTL15_ADDR 0x01E27A3C
0 S9 R- n  @1 G2 I* T7 Y#define  PDCTL1_ADDR  0x01E273045 a( j8 H# \) [' |- r2 z
//GPIO8 direction: I7 _- Z9 p2 F% j( i. h
#define GPIO8_DIRECT  0x01E260B0/ v% y; v& U* ?+ P2 V  w/ D
#define GPIO8_OUT     0x01E260B4
$ O+ V* U; Y% X#define GPIO8_IN     0x01E260C07 L' w$ N' w/ U7 _8 N+ q
. Y, H5 d/ f7 V
//#define MCBSP1_RINT    99              
! V3 Y4 X; b, w( }; G//#define MCBSP1_XINT    100  
2 W' Q; N8 u$ s$ C( Ystatic int MCBSP_MAJOR=239;; _& C- G: p' U+ i
static int MCBSP_MINOR=0;9 Q) V) L8 _) L
static int count =1;
0 [# X7 Y: G+ G3 d* x; }$ J. o- I' F& c0 V8 T
#define MCBSP_NAME  "MCBSP-device"
* {/ d7 |2 }7 k  q# J
$ P8 M0 m! F- s. a! p. tstatic struct cdev *mcbsp_cdev;% G: Z% o/ U8 q7 {8 D
static struct class *mcbsp_class;5 k+ Q3 {5 W# a9 Q
static dev_t mcbsp_dev;, ~2 K3 b; m+ q& f) o( Q: W
unsigned int DRR_data;2 r: Z* e+ W' ]% j2 c1 E# q
unsigned int DXR_data;! h( H4 I0 N; w7 d  P
static int mcbsp_open(struct inode *inode,struct file *file)
% E6 d0 }+ q* |! \7 a* D$ W{
/ K0 F  P# a9 T& f) X( [8 [   & K- P1 w" [; S7 |, t
   //interrupt enable,initialized
; c! X4 a, |8 K+ N3 v1 |& |   unsigned int temp;
& w" S# i# ]2 E: l6 E3 r/ Y   //SLEEP_EN(GPIO8[10])---0* }* [. n1 g: m, `
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' ?; ~3 _# [5 o   temp=temp&(~0x00000400);
4 a1 i2 |+ A+ e4 S( `& q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: J+ @+ [( K) K6 ^4 I  //RESETn(GPIO8[8])----0----1; E* r; l. F5 q7 ]2 M
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 S- ~, b; }$ R' w   temp=temp&(~0x00000100);
2 A& l, @: p6 X/ D   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 Z/ j" W. i% p  T6 L0 I$ Q   udelay(100);$ F, v7 l: p) I6 C
   temp=temp| 0x00000100;" [% F$ ?# s" T7 A$ {  }/ x) J+ A
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
: L4 a/ @. k; \" l- M   udelay(100);
" p9 u5 Q$ K, D. p( D! q3 K0 E   printk("open success!\n");, S+ S) C2 h& F  G2 w6 p
   return 0;
& a- U$ P0 R/ l( D}
! V6 l/ ?- D7 M9 N+ x) W$ B; \
2 ]" j+ m2 I& @; O! t% lstatic int mcbsp_release(struct inode *inode,struct file *file)( l7 G) b4 F/ i
{) m( I0 \3 m3 Q- g' _$ `
   printk("release success!\n");
1 M6 P, N4 k& w+ v) {% k7 v7 n   return 0;$ ~% ~9 ^. f& n
}
* D" f, y) S) p6 b4 j) G  n" b3 h+ S7 d4 {
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 m2 q; m# y& D' M$ _4 c( B3 V1 t{1 z# s. {+ }* `
    copy_from_user(&DXR_data,buf,len);: B+ Z4 W/ e/ P  ]4 j
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
6 u) U# S5 x: T    return 0;
# `: G4 H' }* {. A5 y$ J: J 1 r* q# B4 d, ]1 ~
}2 p+ @2 M" y! {  N  u  M3 ], T

* S' u, o9 E0 I9 v3 M- _static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 Q+ x# {* H$ i{
7 m* \: L8 a0 m7 f   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 F! o+ q1 X3 g6 A; @8 h: P   copy_to_user(buf,&DRR_data,len); 0 A; D/ N  c- D! c  Y
   return 0;
0 j0 h# @; e0 _0 v: f}; d1 D  e; Z8 O8 A; ~1 v$ V

5 `2 i, j* M$ o' ~+ M
' C5 s' Z) j: Y5 P4 T# j# W* i# Qstatic struct  file_operations mcbsp_fops=( w' S, X7 F* H( Z. C4 L* c
{8 ^5 C3 }6 i9 D3 P8 i( F5 @0 t
   .owner=THIS_MODULE,* q% b2 M2 b% k2 l3 o8 M7 M* J
   .open=mcbsp_open,
6 z/ q8 X, w& Z+ T) D3 d   .release=mcbsp_release,
6 l7 G: Q* P; \6 i5 H   .write=mcbsp_write,$ q9 U  b. L/ ?" X: H) J9 K! q
   .read=mcbsp_read,
: c" _8 g7 v3 T  j3 p% a};3 D0 \! s, b0 Q$ w2 E
static int __init MCBSP_init(void)
- Z( |3 z* C# V/ |4 b{
' X. W% a6 T1 y" x1 i) G5 J- B   int ret;: m  \6 ~$ _2 [3 [, M7 L& l7 f
   unsigned  int   PINMUX1_REG_old;3 b! q4 `; B" ?4 U+ D# M$ M
   unsigned  int   PINMUX18_REG_old;
4 f# A/ K9 w6 j   unsigned  int   PINMUX19_REG_old;
0 \6 E9 M0 W  F3 k   unsigned  int   temp;  * E# }$ D0 a. n( |* C
   if(MCBSP_MAJOR)$ A6 o& ^5 i! C
   {
' A) [- N2 u; m) `, C/ m. v      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
( s1 Z: T& Q0 y: z/ H4 M& `      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
( }8 n( W$ R& B: ^$ F- {   }' f2 z. F1 V7 A: ?4 g2 o
   else" L# j% Y. c4 p* m: |  e9 G# W
   {
5 N# E' l7 b4 g% @      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- F/ E. v  q; F+ F9 T9 e9 Y+ a( P      MCBSP_MAJOR=MAJOR(mcbsp_dev);; [, U3 q" o4 H9 ?2 Q& Q( y1 z8 J
   }
3 H* C; h9 E" c2 v0 ~   
; J, Q3 D/ x, I! k- p   if(ret<0)$ l  i9 i, D' V& i! n/ w' y
   {3 S. Y2 q. S" Q* A
      printk(KERN_ERR "register chrdev fail!");
/ r( V8 l. ?5 U1 w# H      return -1;
; a0 p" u6 T/ q, y: e, A   }
! y) x. b  P) L0 }& h   
2 J7 r3 X# t3 @) E0 v2 O8 U   mcbsp_cdev=cdev_alloc();  v( M# O$ p/ k7 `4 |" `! j8 D
   4 d0 x# X' P  k& ]# s9 v: D5 ?9 k
   if(mcbsp_cdev!=NULL)6 H4 p9 E" a0 C6 B: o8 |+ f
   {
% J7 W: r& _, `1 T) b( O. n& V      cdev_init(mcbsp_cdev,&mcbsp_fops);) {0 J" W% q" N" w* j6 \
      mcbsp_cdev->ops=&mcbsp_fops;% }9 E4 l; l0 e3 w
      mcbsp_cdev->owner=THIS_MODULE;6 n$ Y6 A3 r1 m* M4 C* B
      
6 d3 B: G. ~/ q' O' |# Y& \      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
, y9 b# z% Q. D% O* {, |# X          printk(KERN_ERR "register cdev fail!");
$ ^6 b, p+ Q! g      else
2 S1 \1 z" y. h          printk(KERN_ERR "register success!\n");" s$ O! k0 H$ j
   }
9 Z% m. t- v! J   else4 q- F9 x7 b. |3 Z$ F' M
   {
+ p2 \. S8 L2 O+ i. Z1 D      printk(KERN_ERR "register cdev err!");
+ [3 A! T6 B2 q/ n3 |, I* d( r      return -1;
# Y7 D! l0 D# a& x9 S0 o0 `8 |4 m   }
' `& E" ^& D8 ~& {3 k   
) r0 E( V( v# v* G  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! k7 _) k; ]  S7 o; P! d; E% z
   if(IS_ERR(mcbsp_class))
! l  p9 F4 @; v7 m) T+ C   {' P, ]  K/ g" J- n, ?- j& d
      printk(KERN_ERR "register class err!");1 W) z# S- d" f' Q
   return -1;
* U& X- H: R. x/ X5 T6 c1 N   }) v# x" u" T# V$ Z7 C% V
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, d% X1 ~' ~5 |) w0 K- e# i+ \, X( B$ U5 m" ^8 ], G% X! u& E# m
   //PSC
2 w- x& a9 V; p. t- \; y   //add Enable MCBSP8 S  O, N4 p( @2 r7 X
   //test
0 i) U0 ~( y) ]4 s- Q# Q5 q   temp = 0x80000003;
0 g; f& M: H- t% c- _- l  u   writel(temp, IO_ADDRESS(MDCTL15_ADDR));) S$ }, i; k7 r
   temp = 0x00000003;/ {+ t% p$ S, B; _& s
   writel(temp, IO_ADDRESS(PTCMD_ADDR));6 E" O6 ]# `6 [- k# B6 F
' c  t4 X9 X. [
   temp = 0x001FF201;- t. V) K) ]3 k1 B
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: i% u6 T# |! o. @; t# I. ~   
4 J( ?. p1 _$ t; Z/ [   //PINMUX  
, m  R# R3 p! V# I) \% \. D$ E   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" U/ E! V" n9 q( J, v+ x   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
1 r- Q# r" J$ \; a   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
) _7 q% l3 R) ^: d6 q5 J   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);' ~$ i8 @; g$ @& g- r3 [
   
! L7 E' \  ^: }9 k& l8 ^   //SLEEP_EN,EPR,L138_SHK1,L138_RC
4 T/ j  \* b. ~# _7 p& w1 v   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
) ~. _+ `! V# ?7 ?/ l  r2 F* U   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
- b4 f1 J5 J+ R   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 S( H4 R+ W. ?" b ( ]; [1 n  y( ?4 t0 m5 I
   //RESETn,L138_SHK2, C' U/ [9 D+ F5 S: L# u# x
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
* v& y, L7 q# k- z3 |   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
3 O- G4 t- j2 E" a6 g* V   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% K+ o" t! }+ a3 E7 R& k0 ]0 M* k
1 q' i7 h# T) K" _& o- a! H7 k ) h* Z4 c1 q. `; H7 R* z
  //SPCR Register# g% G- y" r9 ~! a
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 E9 o! P7 R5 y& S/ V5 u( J
  temp = 0x03000000;//(DLB=0)3 E' Q* Z* E2 Y% [; T
// temp = 0x03008000;//(DLB=1)* s' Q# g; q" W" `
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
  o9 M9 U- Z$ I  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 p, a! J+ T1 g; e6 m2 D' J  printk("temp=%x\n",temp);
* T- s2 H. g& \* g
/ {. G! x7 ]9 B. G5 H/ M# X8 P- ^   //PCR Register6 c4 [, ^4 e* c7 J. z
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-08 C9 U: ?/ t( ?, ?: ^- B: v
  // temp = 0x00000F0F;$ b6 l! x' v% k4 f" u8 X4 a
  temp = 0x00000B0F;
+ q9 d+ `) q  D  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized * p* D" o# m3 D+ G9 r& P
  temp = readl(IO_ADDRESS(PCR_ADDR));
3 q2 y/ |, |3 p  printk("temp=%x\n",temp);  ! D! E1 g- Z: n+ n7 N! W
   //SRGR Register3 y! l7 ?0 e$ |: u
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
& ^+ y5 h  _3 q5 r4 G( \ //temp = 0x301F000B;9 n+ f7 k- q( b/ T8 A: F
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
# R9 B) e9 |% Q& q  temp = readl(IO_ADDRESS(SRGR_ADDR));
# k. l6 N' g& \8 D" e5 z* R+ o  printk("temp=%x\n",temp);7 S, R/ c/ z0 L6 L; O+ [/ K: A
   //RCR
" F$ x. W' e- h   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,# J& I; C9 \. n" G' g$ D
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
: _- E5 q* ]( A" @   temp = 0x00440040;. R' C2 g+ }4 q, y) ^. |& o, C
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
7 r5 L2 w( y, P( I3 q8 G8 \   temp = readl(IO_ADDRESS(RCR_ADDR));9 i- A" k4 }3 O) E9 t0 y
   printk("temp=%x\n",temp);" i. O  Q" i! q4 W5 N! D* g! y
   //XCR/ N) [; N8 k! v
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
% I8 h5 R- ^6 V. P* A   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0( K) B" M9 q/ _! d! w" U7 n
   temp = 0x00440040;
/ H: m+ B8 a0 J- n( o9 u" M$ Y   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   & H: R+ h; O4 c! @
   temp = readl(IO_ADDRESS(XCR_ADDR));
$ L7 \' w9 ?* U* h" \   printk("temp=%x\n",temp);3 f* w, A; Z( L
  udelay(100);
9 v/ o+ u' r' W. X  //SPCR Register/ @; a( _8 [: p' f6 ~( a4 Z1 U7 r
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1) t4 A% [! W) J- u; ~" f% \
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
* l+ z( H: c9 L3 w  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
. w" H/ k& L' y% k& d: J% I* f  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ p7 d7 y4 m% f' S! B& t5 \  printk("temp=%x\n",temp);
/ F0 @3 j" Z, P8 X1 @& }! W: F; Z  udelay(100);/ M) D9 p. p8 E
! D8 F; N9 m# Q; l1 v+ U( ~
  //set GPIO direction
! W" V7 f& t4 b; [   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- G# O' ^7 r6 E! ^1 W7 R: ?   temp = temp | 0x00000100;//EPR----input) X% S7 {' y& P4 P- O  ^9 b; h0 t
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
1 _9 G% K# |3 _6 O& m' v7 f   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # _: K1 V9 N7 ^

' I: F' X1 i0 R, l9 }8 ~! S   return 0;9 A/ ~* U/ ]" k9 Y* }8 ?
}1 ^/ I- X) ]4 y0 |1 z
static void __exit MCBSP_exit(void)
& p. M" J1 [& S+ y# ^! b{
9 v+ G+ I, J7 `. a0 O   printk("mcbsp chrdev exit!\n");3 A6 J$ H2 x& p6 e* j& a
   cdev_del(mcbsp_cdev);
5 V6 b7 \6 l: a. G   unregister_chrdev_region(mcbsp_dev,count);
+ f8 F8 t! G$ r2 o1 A   device_destroy(mcbsp_class,mcbsp_dev);
5 b7 o1 j' `2 o. ]  O( M   class_destroy(mcbsp_class);
. i% M+ g- a) x; S}" \. b) P  @6 r
module_init(MCBSP_init);
8 R+ ^) O) a' [) mmodule_exit(MCBSP_exit);
5 Z. }7 @/ c6 m% o  M- f9 z1 Z- s% _1 M, M! ^/ {
MODULE_LICENSE("GPL");- r+ w6 N" g/ }

% j: m3 Z4 M* \5 [# h我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。1 r7 f3 F+ W0 }& W
我的应用层的测试程序如下
2 V# @$ K1 N9 |' S#include <stdio.h>: w& S3 `$ d8 x% v
#include <string.h># ^! Y4 P5 p3 r8 z% d% A
#include <fcntl.h>' E5 {0 O5 J3 z% E+ p$ f$ I
#include <unistd.h>. q" h! o: N( D* G: c% o! \- ^
#include <signal.h>
3 ^  f$ d* _: U# [$ ]; ~! f#include <pthread.h>       //线程  Y; d( |8 y2 ?$ V; s% z- `! p5 K
#include <stdlib.h>/ w: U" v# P! J0 {( t% y
#include <pcap.h>          //捕获网口数据
; \- J1 W( N' B# L1 u  ?* e- H#include <semaphore.h>     //信号) h, B, l5 j% z7 ]
#include <sys/types.h>     //消息对列& \% z+ l5 d) C4 T& |3 D- e& z
#include <sys/ipc.h>       //消息队列& O+ r4 h, Y  h5 [
#include <sys/msg.h>       //消息队列/ Y0 d9 S0 o" Z& o2 O3 B2 y
#include <sys/select.h>
- q1 U8 g. S% h! ]#include <sys/syscall.h>
7 }1 @0 Y- R$ y( X  e2 J. q#include <sys/stat.h>
: {% p2 s& z! {" }% A' n#include <sys/mman.h>9 |, e  x. O0 C( O6 z' X
#define msleep(x) usleep(1000*x)
; `4 q$ W% }+ g- _' v7 O1 r+ C) C" f
  u1 A" [6 H( q5 ~) zint main()
- e; z" Q% O# k) o. F! _{
1 v( u' i) H/ B' k% z! U. o+ G    //MCBSP,ARM与AMBE2000交互设备! |4 F- @! O- l1 V8 M$ P1 ~
int fd;9 ?8 I1 U( l; Q; a
unsigned short data_write = 0x5555;
5 }" q$ ~" S  C0 l* V$ k unsigned short data_read = 0x00;
+ `& e' e9 y/ i3 f9 l2 i  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
) c5 _7 V3 a7 u- I6 q% v* C0 ~ //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);" K1 J7 x# ?% f% F" t$ p" m
    * v0 u( s! E" D4 r- z( @
  if(fd < 0)  r0 Y9 G+ g2 ]) w) G7 l
  {
" a: i9 n1 n  a' O( c+ j     perror("open failed\n");
* g0 t/ j  F  {6 M     return -1;
# P1 C2 g2 K% _  }
) R# b# T4 M+ a" J8 J) y  
' [, ~% _& d2 i  while(1)) i7 h. _# B1 E& [- Q5 q
  {+ w* V$ e, R7 R5 D7 J  Q
   ) c& p4 z  r3 ], e( [: g
   //AMBE2000每次读写是24个字为一帧
1 c& a1 R! ~+ O2 r3 m6 s$ g   //写数据时将数据在底层存储起来,等到中断的时候再发送) R3 l# O6 Y+ q5 g$ ?" I/ t
   //AMBE2000输入数据是以0x13EC开头的
# q8 L( v( H1 m* A* w! W4 c6 W   write(fd,&data_write,sizeof(unsigned short));+ j4 u; n3 f# t5 g( f( j! m
   
& W$ }: y5 W; ]6 Y2 W) x   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
+ V" ^# E& G1 r' O% i% a# d   read(fd,&data_read,sizeof(unsigned short));
& Y$ Z9 A1 I- _0 A, G   
) z5 z" r7 o' E7 q. V0 j) B! u5 v   if(data_read == 0x13Ec)) x4 S* K  s9 W! H3 a
   {4 l' s& x$ E7 a# \: |
   
6 z9 l# N6 X2 E8 A    printf("data_read = %x\n",data_read);3 ~. Z/ ]+ m/ Z+ b+ W
   }- m3 f# \! g% l3 o
   + B3 {$ H& ~0 Q* @  ?
   msleep(10);& T6 Z/ o5 z" s1 [3 G0 n
  
' _* L' p- c, h9 ^, ^  /*) r! H! E3 d2 p0 C. E/ R1 j
   ioctl(fd,1);   
# c/ U/ n7 y# E sleep(1);$ U! O, i( Y  @
ioctl(fd,0);
$ U0 J9 D9 j( ^5 j sleep(1);" X- d( y: }8 |  z- F$ p, R0 R, H
*/
* B7 Z1 X8 y' E5 n0 e& b, l  }   & w9 w! a4 H( @4 f/ U
return 0;
* M0 D0 f7 U! F   H+ }% }* m2 l" G5 ~& \1 \* r. @. T
}( q4 c) i5 [5 w. y/ G9 r

! p5 }7 \, e$ r2 c6 s& X- S多谢各位指教,谢谢! 急
; G$ l( Z; Y. ]0 e
: X; \0 E6 J. y# b* k
- J- k8 D. H+ Q3 T, [6 k$ j6 O! D; o4 R: [0 o$ M- K( ^

+ {2 H; O5 a" P" _5 g: j9 h* Q# f( o+ i1 h  C  u  G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-28 09:06 , Processed in 0.042751 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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