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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: " o6 l( `* i+ x9 {$ l
/*
5 @' W7 _! Z- d * Copyright (C) 2009 Texas Instruments Inc9 I+ J' U  M6 `. a6 v& i
*% o, ]9 Q4 i" {% V$ g
* This program is free software; you can redistribute it and/or modify
, v/ {0 \* m" x& L. u& g * it under the terms of the GNU General Public License as published by
, K: ]  K" P% K6 @$ _6 e, a * the Free Software Foundation; either version 2 of the License, or
* _" a: P3 T6 E- c$ ]9 e' V# G$ b * (at your option)any later version.3 T! Y6 D% F+ E, T
*' f6 ?$ r2 D1 s8 {  m
* This program is distributed in the hope that it will be useful,
4 g' `. c/ k' u! t" ~$ ^/ V- ? * but WITHOUT ANY WARRANTY; without even the implied warranty of8 W8 v/ r( I3 K& Z* C$ Q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: |: @9 O" w# w/ s( P8 h9 \" G
* GNU General Public License for more details.
; o% T: G  m! [( O- D6 a* d *3 T' \# A; ]( K) g) y  F- k1 f$ o0 K
* You should have received a copy of the GNU General Public License
: l! z7 s3 l; s8 ]; M5 Z * along with this program; if not, write to the Free Software
  R3 }. \# n; K6 R0 D; G; y6 x * Foundati
- F; r* }, N! I, l) l*/
5 ~) {, ^" f- K' F5 F  e# [#include <linux/module.h>
9 A, M4 p: W- N$ w. C4 Q#include <linux/init.h>
  T! l  I% y9 L) |2 S6 S: q9 u4 p% [#include <linux/errno.h>
/ p# `: K6 p! E* w, {#include <linux/types.h>- k( }4 U6 D. Q7 q+ M2 v% r7 A% {! s
#include <linux/interrupt.h>
. w9 M. t& ~0 u) M#include <linux/io.h>) L+ ]# V% g. x0 L7 @
#include <linux/sysctl.h>8 Y; ^7 Y0 d7 X: C
#include <linux/mm.h>
8 y" {9 z: t* i+ }( W8 L) I#include <linux/delay.h>
- h4 J# q3 @2 ?) l& v: z) M#include<linux/kernel.h>
3 A  O+ `8 e! T#include<linux/fs.h>: ]% k1 {9 h/ k$ l+ G0 U
#include<linux/ioctl.h>
4 o& ?2 I7 t* z, X#include<linux/cdev.h>
+ l( W. x& l! ?, \! w#include<linux/kdev_t.h>
8 Q8 o' E/ d8 O7 m#include<linux/gpio.h>
. t8 H% O7 c9 `/ f  p#include <mach/hardware.h>
5 b( `3 P# }1 _$ N#include <mach/irqs.h>
, ]6 n4 ^& n4 p8 P4 m: z. P) O0 ~* ^
#include <asm/mach-types.h>5 W& @& c) I( a0 S, W1 }/ _
#include <asm/mach/arch.h>+ B6 w' g1 @4 m
#include <mach/da8xx.h>
0 z& {: \! F7 U8 [1 o0 H& `- o7 G#define  SYSCFG_BASE   0x01c14000- A$ x: p7 }0 q
#define  PINMUX1_OFFSET   0x124
( a# e2 Z. u+ L4 R, ^#define  PINMUX18_OFFSET  0x168
' j! `* w: b  [' p1 O#define  PINMUX19_OFFSET  0x16c; \: Z9 W: }+ z# F2 j
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
" c* Q5 I# X3 W5 G#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR/ s( B& q- j1 z' \# S
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR* h: A) l# s& Q5 d# L
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR: K' f' m. L* x; V. |- y  j, ^' b* a, |
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
/ [% C& W; f( x5 |1 O) H& z0 ^                           
  I* O) M" r! P3 _0 S! h- o. r#define DXR_ADDR      0x01D11004  //MCBSP1_DXR; K: i* {% H) ]* f! J
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
0 V' S! u6 }# _* C4 m//PSC
, G, I' H4 k/ w4 q#define  PTCMD_ADDR   0x01E27120  
9 W. u  L! Z& z% T& I#define  MDCTL15_ADDR 0x01E27A3C0 t* n2 v6 _5 P/ Y& F. u- J" w0 Q
#define  PDCTL1_ADDR  0x01E27304
; S6 h  g/ V5 v8 S//GPIO8 direction0 G" ^8 V3 q: I+ f' A$ r
#define GPIO8_DIRECT  0x01E260B0! P) O; b+ q4 Y/ C1 ]" C! M3 j
#define GPIO8_OUT     0x01E260B4
9 S: u+ f3 f( T$ E#define GPIO8_IN     0x01E260C0
4 a; w0 [7 I: G. Q
& i) l  N/ V. T//#define MCBSP1_RINT    99              
. B- Y$ v  G; O% W, ?//#define MCBSP1_XINT    100  4 |2 F$ a/ s1 c9 @7 `2 L
static int MCBSP_MAJOR=239;) [0 X7 O% [' ~: M9 [" @
static int MCBSP_MINOR=0;
$ j% E! K; [( H: n1 l) cstatic int count =1;8 E8 p6 F& g. x) }) W+ G+ t0 ^

& j/ ^0 W% B" O5 I#define MCBSP_NAME  "MCBSP-device"6 S7 O3 y- ?3 s; |0 Y) F

3 r- W. \  R, W3 L$ W( fstatic struct cdev *mcbsp_cdev;
% j9 z9 v4 L2 G2 Jstatic struct class *mcbsp_class;0 X  a  d; |# X+ G: d* |, m! f
static dev_t mcbsp_dev;& d+ e8 |3 `  Q, Y' J5 c0 ~
unsigned int DRR_data;1 d# W* i4 q) U, v: \. E
unsigned int DXR_data;5 t* N: `' W, Z/ H7 a+ g
static int mcbsp_open(struct inode *inode,struct file *file)# L9 U. K2 X  g0 ^
{) v9 w+ R2 u& s6 t% s! c
   5 G/ p% v* B0 ]2 B/ \# o
   //interrupt enable,initialized2 O& k1 t% M. X! y( L
   unsigned int temp;# N3 X# w! P+ z0 \
   //SLEEP_EN(GPIO8[10])---0# ]! c( o& s7 S3 z4 O
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 I: \- `$ b9 I
   temp=temp&(~0x00000400);
" o( z) x* i3 g, @- a   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ \* k* l7 Z- u  M2 s  //RESETn(GPIO8[8])----0----1( g: A& [& p" W1 C, |0 E5 d
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 B# s! \2 @( [% C$ j   temp=temp&(~0x00000100);! A  x" b4 s( K2 |4 E" Y& N
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0& Y" r' G* |/ u2 Q4 W  C
   udelay(100);
* I" y: _; G+ @; G3 K: J. d" y/ L   temp=temp| 0x00000100;
. y, ?- W9 g# i% L, o8 m   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; J' g$ I: Y; z; _3 J- p6 X
   udelay(100);
7 v! D4 H" M, G   printk("open success!\n");+ Z9 [7 X, \) J3 m! y" S& }
   return 0;
6 A% r+ H* `9 K6 S; @: N/ ]}, e; m, _3 c# z8 _4 ?; ]- e
& J+ w( G' S! f8 w+ v& F
static int mcbsp_release(struct inode *inode,struct file *file)1 i9 F6 q; {/ O* s& ]
{5 b- n, I' X- W" ^
   printk("release success!\n");  P5 M" E5 `& x7 ?! D' s( O( s& o& B
   return 0;
! B! }& A4 F  K+ R6 v# F- X+ P}
0 q8 s" X5 E% L8 @0 h
" T( j7 Y# G# B$ U0 Q$ i7 hstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; D8 \2 e9 z, T6 p5 _{
) k, s9 g, C) g8 x    copy_from_user(&DXR_data,buf,len);
& V/ ~* l5 k1 i1 x0 J    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
" R1 X% F- Q0 h8 Y0 U    return 0;+ m. [7 E0 F9 [' \5 b, T6 O& b
* P& _( q1 c% W% ?- v4 B8 t7 `
}
" e# \8 p* ]& \7 M0 ^- l1 _8 m
& F' ~8 e2 y: Y8 l5 ^static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
4 F$ y0 b9 p8 L" {) |1 Z{
7 `7 ?4 U- S, F! J- C   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));3 l& m$ S7 w) \  T- C7 m
   copy_to_user(buf,&DRR_data,len);
4 k6 d' V. V3 }  g   return 0;5 u5 V( }  g0 h0 F$ ~( q2 w
}9 ?1 e6 v7 {% ^0 L) f$ T

9 Z, @0 B) e% U2 n' E" |
  [; `3 M# K& A% \9 ?static struct  file_operations mcbsp_fops=* Q0 b' b: g, c7 X0 b. m9 t
{3 l$ d, Q7 x5 K
   .owner=THIS_MODULE,. M2 r3 t. l# v' N
   .open=mcbsp_open,& w" h, ^# W7 t0 h2 u' z5 M- v& m
   .release=mcbsp_release,$ P) i/ z6 J; q4 H
   .write=mcbsp_write,9 C! |7 l. I- j- Q" {
   .read=mcbsp_read,) B- \6 E" n/ N# W
};! o6 A! z: v5 f$ _
static int __init MCBSP_init(void)6 B# r5 {7 Y3 z
{$ _9 ^' F- B, s, U0 x/ L, P; K
   int ret;6 Y  ?) F0 y- K2 F  p$ A2 o
   unsigned  int   PINMUX1_REG_old;( E/ N8 E9 ?' O9 S( e4 Z; |. [
   unsigned  int   PINMUX18_REG_old;/ o& L+ A8 G8 M1 W9 p% @
   unsigned  int   PINMUX19_REG_old;
/ U' r6 b/ V/ M) {$ k# r   unsigned  int   temp;  
! [& j+ ^2 V; n& u   if(MCBSP_MAJOR); l) r2 }" ~: c- F
   {
) g" T6 C, |6 y; y% m& q      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
, i) ?7 i% @2 C      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
. l6 I0 P' y$ h6 E7 S. Q4 T   }5 e% `  g$ ~0 ^! n' I: N
   else, z9 v: f3 b, j! z  p5 u
   {
: ~' z; r& \! y' A3 ?! Y1 y8 Z- ~& W      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( [5 v- f  q4 @4 D* y) `7 V
      MCBSP_MAJOR=MAJOR(mcbsp_dev);$ C# l8 R+ }8 k
   }
- J8 d  U6 g, `4 O% r" m   
! `; b- Z, b% v4 k/ c& d& M% j   if(ret<0)
/ g+ v! Z+ x' t2 I- l( F/ W   {
7 S; X. h& l/ D      printk(KERN_ERR "register chrdev fail!");$ [, V7 l$ l8 F5 ~) T" A0 t
      return -1;: d5 o, n' M7 c* _1 ]1 x. o
   }
2 b0 D+ ?% }! r5 A  k2 i7 ?" X   
" N$ L% j( v3 x   mcbsp_cdev=cdev_alloc();* V2 h& {  K. k  j; M; d
   
: m# X( e* Y8 o+ f& A5 ^5 Q! m   if(mcbsp_cdev!=NULL)5 P1 b: _+ [1 ]: F
   {
, n$ X# `/ q9 f% q8 L1 A      cdev_init(mcbsp_cdev,&mcbsp_fops);
* }. s- @. l1 P# [- ~7 T% J+ z2 J      mcbsp_cdev->ops=&mcbsp_fops;( [( m. x9 q: K  v' F- O* \- d2 Z
      mcbsp_cdev->owner=THIS_MODULE;# N; Z( W! x' m- D$ k1 P% Z
      5 q8 Q" ^) s2 m% ^5 S; l
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( u. }5 f9 G" S  b, q' z8 V
          printk(KERN_ERR "register cdev fail!");
* q/ j1 K9 a4 P6 f) R8 E      else
& K0 t/ ]. l3 H          printk(KERN_ERR "register success!\n");" E* ~- J2 u) k! r  w+ Z
   }5 [- P8 V0 ?! _9 y2 r/ b) @4 p
   else
: v3 P2 U) Z5 }- z   {# p; c6 z6 W1 Q! y' Z4 z
      printk(KERN_ERR "register cdev err!");
! Z& X! I& \$ O3 ]. c1 d      return -1;
: v) G+ O; w: q: l  W   }+ c' w/ D) j( n1 r0 Q, ^6 l& B
   : X, s' L" O9 J2 T* q
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
( ]# W5 i: t9 k   if(IS_ERR(mcbsp_class))
5 p3 ~0 M" H$ X& h+ X1 t   {
" B& t: `: p2 t! C+ U' ^  ?; G      printk(KERN_ERR "register class err!");2 H6 c  [+ V6 J9 T) n1 b
   return -1;
' p+ O! v. n1 F6 i0 k   }4 N( l8 n, K# d. e
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 t" f, T) V5 E3 l$ W2 l5 i: H# v$ h1 z4 q6 ]
   //PSC
4 ^, q* F3 |, p   //add Enable MCBSP
* L8 U* C( i7 D  @, ~& F  {   //test
) Z; H$ m* w3 P, v. ~9 F   temp = 0x80000003;
5 j. {% O* S( ]. `: k   writel(temp, IO_ADDRESS(MDCTL15_ADDR));6 E- R7 D* p0 P: v3 E" j4 E: H
   temp = 0x00000003;4 z# i+ |3 p. w2 B; T; Q; p" o
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
6 h. z% N& C" M" h
: ]: f5 a' }8 }8 @& j1 _   temp = 0x001FF201;
% G6 u2 i% |/ Y  ]   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
. {: P0 E9 v# _- b; t   1 l' s  b5 @$ z/ V5 O" O$ Q3 M
   //PINMUX  
9 c$ ~# P( n- `   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,! K1 ~* T; G3 D9 @8 A. r5 n
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
/ v; }% n1 E# u6 S4 U9 ^* a$ v   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
& u+ n* T$ B9 ?; G% m, O% B# m   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  k: i' B8 V! n; H) z
   
1 a% p& t- {' ?  `; V% j7 J4 m   //SLEEP_EN,EPR,L138_SHK1,L138_RC
7 o: F' r7 H. W4 q   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  $ v5 Z% b, b" T6 m8 B5 G4 i7 Q
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
) w' q) K1 J1 a9 O% i   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);" m) ~% a3 ^7 n" S4 |

  G- K8 a9 z; C  K/ N% y   //RESETn,L138_SHK2
  |( w0 s1 S% a+ y- M8 D& X. R   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  % N* o, p' W% Q! d0 U+ h
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
9 M& m( M) p/ X5 ?7 j5 V   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 c3 k. r, z8 W  w" d: J) g1 |

( O0 b( o9 j! d( ]! e1 O4 j, S4 d
* p1 U* U2 w% h  //SPCR Register
8 j" O0 R, t& k& N  J; j  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
/ ?0 c0 K  ^$ n# v8 q+ z& M( e  temp = 0x03000000;//(DLB=0); y* C( Y% E7 j7 _+ j3 W
// temp = 0x03008000;//(DLB=1)
/ P+ [  r" S# _* \  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% x1 D  D. u/ a2 n! R9 b  temp = readl(IO_ADDRESS(SPCR_ADDR));. H+ t: G( }! G
  printk("temp=%x\n",temp);- X5 t# p1 y% S
1 c/ o- }' ~  I) Z+ `/ ]! o( {
   //PCR Register
" p) @& ]+ u: f5 [% q1 |4 ?7 C6 R   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
+ e  U# g. @% Q: O9 O  // temp = 0x00000F0F;
5 E8 {! Y: t, c5 U0 S  temp = 0x00000B0F;
( ^. v0 h2 a% K, w  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 8 R. ~4 }. l5 V2 C
  temp = readl(IO_ADDRESS(PCR_ADDR));0 }. u) u2 Z& L
  printk("temp=%x\n",temp);  
' T. y9 r& B3 r9 {9 S- z+ h   //SRGR Register& f9 D0 a4 X% w. O. r! y( j, F
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
- R; }, M, y$ h( ?/ K, x& E) ~ //temp = 0x301F000B;
% ]8 x' _+ y- P' ~) e1 v   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 2 ]0 Y' Y8 o; T6 L( F1 H
  temp = readl(IO_ADDRESS(SRGR_ADDR));% O" H9 A/ O5 q$ v
  printk("temp=%x\n",temp);
1 K# y3 M: ]7 l! F   //RCR4 w9 i1 e3 d2 @: K
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! B# x! R! F+ R( X9 d: q" Q
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
' l0 _6 l4 L/ u" `5 t7 z   temp = 0x00440040;
; i' ~( p5 u, U& ~! a) S6 B+ z   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   $ U+ \3 f3 C  V2 _% j
   temp = readl(IO_ADDRESS(RCR_ADDR));. `5 P; `5 G' b: J0 U( p$ Z
   printk("temp=%x\n",temp);
3 v* F4 d! D- M5 [! S   //XCR' n6 L1 Y; [5 Y4 o& I
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
+ G( l+ Z; h) `   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) \$ {& R/ S  i6 s7 n
   temp = 0x00440040;
; u$ L0 i' o7 p7 T$ Z: |   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
2 \% h+ x& f7 y( n   temp = readl(IO_ADDRESS(XCR_ADDR));
7 e: N) W. r6 B6 M0 O) C9 \; {6 j   printk("temp=%x\n",temp);
! w0 g; j. W2 G! C% m  udelay(100);
/ e  d2 v6 c8 r( E% J* e  //SPCR Register
* \; {6 s' |2 W* D- b& P) d  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1( F3 k! ~. l4 l2 M
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
4 ]3 }% B( a4 e5 k2 `7 H  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
4 Z! |8 S/ f! [# E  G  temp = readl(IO_ADDRESS(SPCR_ADDR));% W1 J0 Y! i9 ?0 D: E+ i- P2 T
  printk("temp=%x\n",temp);
8 B: J6 m! J0 J& b, {3 ~3 m  o  udelay(100);
& A6 B! ~- g' \" h8 p& Y1 u
* U7 [( e7 a2 f  f  //set GPIO direction
  e6 T* _7 b3 W2 O  R   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));0 j1 b7 E: ]8 C4 v& D+ U7 D$ `% a3 i
   temp = temp | 0x00000100;//EPR----input/ [* n7 B) c/ B" x4 M: k* ]3 K
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
9 S4 N( V- t/ r8 b' L$ t' m   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 9 H3 F  F% T6 B4 N3 Y7 o

- Q3 |0 \6 X; m2 ?   return 0;% J0 F# Y2 }2 l5 p0 @
}- T$ A9 H7 O2 E% n
static void __exit MCBSP_exit(void)' b2 J6 k, O- H! O2 h: p
{
6 s4 W- U0 C& \! j8 E) I   printk("mcbsp chrdev exit!\n");8 {) O( W2 b0 [0 D
   cdev_del(mcbsp_cdev);
7 A% V) F/ G! m& ?2 {5 A( n   unregister_chrdev_region(mcbsp_dev,count);% \, \4 f4 b& J
   device_destroy(mcbsp_class,mcbsp_dev);
- o5 r* H% Q' G( [8 |   class_destroy(mcbsp_class);- \% E; q3 v6 b# l( j
}/ G. K) ]; m' t
module_init(MCBSP_init);
1 z. ]# e" h8 i# c$ ~module_exit(MCBSP_exit);
% r+ k! _# [: l! u* Y- \" R
9 m, J# Z0 C( L. dMODULE_LICENSE("GPL");
6 |# E. t% q0 f8 R8 @1 t
) G/ g, ^# x7 \/ u2 R& q8 c% g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
1 p4 M( l2 p9 S' X/ L! i, W8 r我的应用层的测试程序如下) H$ E5 k' M( }& T' p* {
#include <stdio.h>+ |, \- J$ {$ `) l( v& O
#include <string.h>( X/ s# w) a  k4 g' m' ]+ U
#include <fcntl.h>$ f# `7 P8 I) ~3 Y* @
#include <unistd.h>
- ^4 _  j1 x6 O# R#include <signal.h>. b5 h5 Y- G) a4 v# {. s
#include <pthread.h>       //线程
! G3 Y* i. c; j! D# P#include <stdlib.h># z' e. s5 L: H+ P4 D% i. f
#include <pcap.h>          //捕获网口数据; }' h% ~7 `. ~3 H% C
#include <semaphore.h>     //信号
' s5 J8 t7 U3 y; X: h$ e7 B  J' H#include <sys/types.h>     //消息对列
+ Q/ b0 a1 I) K$ o2 q# \0 o- `#include <sys/ipc.h>       //消息队列
$ |4 R+ y* @) M( V6 y#include <sys/msg.h>       //消息队列
" p' ~+ b: U% f" [2 q) h# t#include <sys/select.h>- t) D) t! c- F& w# r, N! `- z% a
#include <sys/syscall.h>: R0 M& n, j! b: V5 K
#include <sys/stat.h>" D$ g5 V8 W+ c/ [3 J2 {8 u" D
#include <sys/mman.h>, O& U9 d, p& {3 Q2 S
#define msleep(x) usleep(1000*x)
# ]3 Q1 K, Q9 A
5 F1 p& B8 Z0 w0 X3 O$ Fint main()
+ h* y  e2 ~* L: p1 T0 {1 Z! o{ ! _( E8 ~5 ~  l4 x# X5 g
    //MCBSP,ARM与AMBE2000交互设备- F- Z: t- @1 C( ~* K9 ^5 N0 n
int fd;
; p; Z* n) c' e. x unsigned short data_write = 0x5555;  x0 |! Q% h# T
unsigned short data_read = 0x00;8 B9 i- G8 N5 a
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);" j5 f; ^$ K3 v# F6 w" r
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
& c9 W. g1 R: C3 n   
- M  e. R6 R' ?' {) d  if(fd < 0)7 `. f7 o) P8 S: P% n% k( w8 ?
  {
; P* c/ n+ f7 G7 j8 i: \7 R* [     perror("open failed\n");7 Z0 s- ~" L0 X' H0 t' |# w, D
     return -1;
0 g/ A6 h' V% M. t  }
, V% H( F- s, j* B  
3 [" S9 D3 t1 d( S  ]  while(1)# o9 ?: i$ g* b7 N6 \
  {
, M4 V3 |/ n$ J- i& l   . y. l' z2 g4 }( f2 O
   //AMBE2000每次读写是24个字为一帧* \+ X4 P$ m8 p% ?1 B
   //写数据时将数据在底层存储起来,等到中断的时候再发送
" c6 @: }. ?+ m3 S. I   //AMBE2000输入数据是以0x13EC开头的6 E% q1 @, d2 M6 O* s, g) ?; V- Q
   write(fd,&data_write,sizeof(unsigned short));7 T) h* U, P6 ~5 i: T8 [) ^2 i
   
8 L( ~! W1 [9 Z( z$ C- ?   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  5 C3 s' x; d. I. U' g. z/ ~
   read(fd,&data_read,sizeof(unsigned short));% r( Q7 G; w* Q( _# B
   3 x+ h6 N8 W* x; Q1 `! A
   if(data_read == 0x13Ec)
* h1 A5 C7 d3 V9 }$ l! X   {% b( _2 ?# j4 o: {  ~
   
& R/ J, J- {3 ]5 j, u    printf("data_read = %x\n",data_read);9 ?; n+ B/ g  O/ M3 ~: @
   }
1 `; q' E5 P* u5 j8 z2 q   4 _; A! n! e8 d
   msleep(10);/ y/ M! f* j6 f# z4 z/ Z0 ~
  % O" i+ V  w9 m2 g
  /*! h  ^! B5 ?1 }1 _8 x8 O; s- a' ~
   ioctl(fd,1);   
7 E$ w- Y( {# F: [* O sleep(1);
* ?2 M! o/ Q- l1 Y5 Q) k  l ioctl(fd,0);2 x) s; n5 h5 [+ y
sleep(1);# k* e) J5 t% Z+ }; t1 D! f
*/ 9 a5 ^' z" q" ?6 N& F. u
  }   % S, Y6 [' s& c* _2 ?* U+ {/ o0 U
return 0;& k- o& q+ _5 z/ }
' F1 M# i% v0 ?0 X: w
}  A  o' g  b8 K: T1 X$ z
1 J$ Z" i' |; j! I- b( ?) Q0 |
多谢各位指教,谢谢! 急
' `  P3 |1 p% g; i0 B& \! I: s+ R# A8 p" V: @% o) M/ M, L  a
& l2 u) F4 [  P# }$ p
7 f* j& Q9 D2 z$ Q7 y1 W- R
) V3 M. S- Q4 T

3 P. x3 v! a6 h$ w8 Z5 J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-23 17:44 , Processed in 0.054233 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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