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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
5 J; B+ u! `* P2 d( ]/ R/*
7 [- d8 n% g+ X; _% R * Copyright (C) 2009 Texas Instruments Inc
, q5 D" A  R9 ~! ^: Y3 I *. i1 B, F7 I/ c4 q
* This program is free software; you can redistribute it and/or modify
( K  {- w& `" i+ P * it under the terms of the GNU General Public License as published by0 f% K1 `7 A2 n$ l* l4 u/ y
* the Free Software Foundation; either version 2 of the License, or  D' g( v; e& ~7 C% L7 O) w
* (at your option)any later version.
' I; g- `+ ~# _( {0 G5 N- S/ A *
) O0 h" }1 b: i+ N8 y) i0 ~ * This program is distributed in the hope that it will be useful,* C* `% B- O) _  Q/ f
* but WITHOUT ANY WARRANTY; without even the implied warranty of
: ^& S% Q7 e4 X1 d& ]0 A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; Z1 C: X8 }3 C. A- Q3 m
* GNU General Public License for more details.
3 W( N  U* E9 U, H9 c/ `- ]7 \" m5 t *
" H3 |$ o: @* \6 o7 Y, o9 v" p' R * You should have received a copy of the GNU General Public License8 c$ Z( H+ f) z( M
* along with this program; if not, write to the Free Software
5 v4 C) Z' n1 d% P; ^7 o * Foundati0 j6 i- p1 h. y+ k! r$ E
*/) R( N5 D$ v% ^' i9 F  V4 s, G
#include <linux/module.h>
  e! `1 w/ B% k( U" i/ o+ O5 q#include <linux/init.h>
& e+ t1 A" O( k* ?#include <linux/errno.h>: J: @8 x  J$ y+ g/ t
#include <linux/types.h>
' c* d- p& g/ ]- H2 U#include <linux/interrupt.h>
% K; M9 ^& g5 h+ v6 h/ S+ S#include <linux/io.h>2 G7 k, H6 \5 B; y9 T. ?) j7 a/ L
#include <linux/sysctl.h>) N' m: e# P0 b: Q
#include <linux/mm.h>/ W- u. Q. q+ A" d
#include <linux/delay.h>
2 Y# s' ~* N' p6 t3 _#include<linux/kernel.h>
8 B% l% i" u4 T9 t' L6 r3 I#include<linux/fs.h>
0 x0 D# }4 `2 m) m0 o" v& i#include<linux/ioctl.h>. i9 r- H' u% \/ U. X/ Q
#include<linux/cdev.h>
, [: {0 I5 s5 }% f" i1 j3 |#include<linux/kdev_t.h>& N/ ?  t% O, t0 a$ h- y3 W
#include<linux/gpio.h>( O; ?7 X' f; I. \4 H
#include <mach/hardware.h>
5 d' [8 J0 f9 c* Q' `- N6 r! y#include <mach/irqs.h>3 J, s7 _) D0 @  V: P4 y
0 K! L1 i7 B, |* [
#include <asm/mach-types.h>; v- `: i7 u; ]/ y2 u3 |
#include <asm/mach/arch.h>
+ P( M# s/ t' \, Q& h1 [2 x#include <mach/da8xx.h>6 ~9 `6 c& x! y: |
#define  SYSCFG_BASE   0x01c14000
& M2 T& ^0 h  J, h#define  PINMUX1_OFFSET   0x124
4 V4 K" D! X( y, }. [; w3 L1 j  M+ f#define  PINMUX18_OFFSET  0x168 5 ?; {5 H+ |# `
#define  PINMUX19_OFFSET  0x16c
( L4 X9 f9 J8 l) r4 J#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
" N1 _! c9 B% x#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
0 Q% q: c, c6 |% f/ ]#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR( ~$ {$ {2 ~$ `, p* u' f; D7 F' d
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
" E4 v) l& n! j#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
% Y4 P; Q! I  a( \- D" l' ~3 }                            " U0 r$ m( y7 n9 V
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
+ E2 x5 i' O+ |#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
( s; a0 }& M/ P" o/ d& I//PSC
9 h! {# ?0 V* F#define  PTCMD_ADDR   0x01E27120  
) L# P% y7 j  o# o% \; {% @8 V#define  MDCTL15_ADDR 0x01E27A3C8 y5 Z0 u3 a) \& o) t& f5 `. x
#define  PDCTL1_ADDR  0x01E27304
* \  N3 ?1 |9 s! T! z8 F//GPIO8 direction
" _, N6 y# z8 U. m/ T#define GPIO8_DIRECT  0x01E260B0
; S. t& W' }9 Y9 O( |; D: }#define GPIO8_OUT     0x01E260B4
3 X7 ~0 E( k% }/ C! m7 y' {#define GPIO8_IN     0x01E260C0* S( d0 ^" K( M

1 M' I$ ?! E9 c1 y//#define MCBSP1_RINT    99              1 C; d. R+ j' S- A* o
//#define MCBSP1_XINT    100  0 f, O- [- s" o) s( Q' R
static int MCBSP_MAJOR=239;
. p" V$ O+ W# s$ R9 V9 @static int MCBSP_MINOR=0;) {" |) o8 \  s. y. b: V* Q& F
static int count =1;
* l' E- h2 a- y1 E2 k  ~, Q1 G  V+ r. k
#define MCBSP_NAME  "MCBSP-device"
& p7 o3 F$ U: Q2 T: k$ U* J
* y: M3 |& j! l9 o+ c' b" [2 }static struct cdev *mcbsp_cdev;
' z. w1 _( N( h& P' M* Y( Zstatic struct class *mcbsp_class;
' p) [* b) p! nstatic dev_t mcbsp_dev;
( _$ x) S% r8 F/ P, Y! q8 lunsigned int DRR_data;6 Q# N* m; x( p# q
unsigned int DXR_data;8 f4 l( [6 T, n' Y6 G! D$ u! U
static int mcbsp_open(struct inode *inode,struct file *file)
* C7 p+ G3 f6 D, A- c8 H{
' p. E- s) N, e( Y' S' U   
' h( Q1 D: E0 ^# _   //interrupt enable,initialized
+ n3 B( }3 t. F- e0 P5 H   unsigned int temp;
& t. t; y: S- D  v2 x4 L7 t   //SLEEP_EN(GPIO8[10])---0
1 a: Q+ x+ R: C9 V   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 P" b* r+ W( a. B+ I5 l% s
   temp=temp&(~0x00000400);9 V& a8 K. W7 v0 r' Q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
2 y% G' L) [2 w7 r  //RESETn(GPIO8[8])----0----1
) Q! ]* E3 \0 |   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) V! l* s4 X1 N: h  m. H  [. a
   temp=temp&(~0x00000100);& b" A) \! X. J- J  K  a" @$ P
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 `* h( B; G! Y
   udelay(100);# t% E. T* W7 y
   temp=temp| 0x00000100;
9 ]  j/ ~0 l1 L  l' W% |& V   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1  L1 p1 Y6 P% r* l) L. _
   udelay(100);
9 e1 x1 m0 V  {) x6 h+ R   printk("open success!\n");  i" O! m! ?. H- H) H
   return 0;; C' s% B: Z9 @: D; C" s# U% s
}: o! R+ ]1 X, X8 L- Z: D# E

* u" }: S! T* h) r4 {3 a* F2 |/ cstatic int mcbsp_release(struct inode *inode,struct file *file)' s$ w* G. s: ~( G/ v5 |6 K
{7 R5 Y0 q  Y. j! E4 _6 f4 t+ w0 J
   printk("release success!\n");5 H; D/ u9 d$ J# J) E5 s
   return 0;: t6 {) M" I! E- ~- D0 ^6 [
}0 ?" u$ H" J0 ?$ \- r
. m$ G2 f7 ]7 z6 C! P
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* k( K  B9 W/ d" L+ [
{
7 |& g( x% R6 w" E& U    copy_from_user(&DXR_data,buf,len);
/ ~, T) A: U: d4 ]  I& d. c* f# D    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       # H; E+ W1 R" d" t9 ^/ z1 ?
    return 0;
$ E( w& }/ D+ r+ ~8 W 6 N- v8 z' E$ W: Y
}
! n) U1 y! V# z4 c* {% l' X2 F! h, y4 {: N; t3 @. G  f) h
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
, V. d/ c) c. `( ~6 x( D; l1 h{ / }6 d9 j1 B8 i" J( z7 s( }
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- Q- f  m1 P  {5 g( g- i   copy_to_user(buf,&DRR_data,len); $ N1 b  h9 f2 I5 b7 o) `% e
   return 0;9 o. L; N( s% H/ V3 @. n9 v4 d
}
1 N' W4 L/ N( [# ^+ C; f2 |# @
6 N( B. Y  ~$ P" z; E$ b% I, K. [1 U* s3 |7 R
static struct  file_operations mcbsp_fops=& G' w; G+ l) X; A' C
{
- _& U( T& K" m- G( O7 _   .owner=THIS_MODULE,
% u7 p% P0 X( K! u2 M   .open=mcbsp_open,- G  e3 d" Z5 R2 W" ~" t
   .release=mcbsp_release,
! r  c# F# o. G   .write=mcbsp_write,
& q4 q; [5 N- k4 h- o, a   .read=mcbsp_read,7 n0 A0 V, r- q$ s3 y1 U: k) j9 Y1 c
};3 v! v8 A  I2 G7 T$ f' b6 ]
static int __init MCBSP_init(void)
) Y$ {" C0 P  a/ T{
; w" w9 x: ~* M  C   int ret;
5 u" |7 e4 P; G( Y5 H   unsigned  int   PINMUX1_REG_old;, R1 S* ^. Q' M: o/ W  x
   unsigned  int   PINMUX18_REG_old;! e( j5 X9 |, @; P9 D  K! a% G; H
   unsigned  int   PINMUX19_REG_old;
+ w3 c( L! Z. l' S+ i' C' R   unsigned  int   temp;  6 F) f1 c: n% Q$ N6 c
   if(MCBSP_MAJOR)' q+ h* l$ v$ r
   {# S1 t# m9 m8 v6 k8 c
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);& H# o4 ?, p  J2 a
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
0 x5 x/ l% N3 W  b6 g8 Z   }
# R7 k5 k7 V1 }' `! B   else# g' O% {% P, D, w$ c% u' b% q
   {  L! C: ]# g- i. B: {: W* D
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
6 T$ {% [; u; j- L3 m$ p      MCBSP_MAJOR=MAJOR(mcbsp_dev);
- e( Y) q4 t8 K$ w% S& H/ r   }
5 i2 C6 a- ?1 q" a     ^1 A  X( c. @7 T# j( r
   if(ret<0)/ V5 H# o& ~( a3 \; q& f
   {
  P1 M9 [9 k3 D) ~( O0 ~      printk(KERN_ERR "register chrdev fail!");
$ [# r4 ^3 C7 u. e# {8 f. I3 K8 f7 Z      return -1;
+ e5 w) W& Y9 n: A3 p   }
  y$ q& Y8 A* v- s  H   
: _& v1 b; z1 N& R2 u   mcbsp_cdev=cdev_alloc();
. M- @% ~& I: |" C& W- K3 E   
# H+ C5 X  b- x+ b  q( Q( B* a   if(mcbsp_cdev!=NULL)
% N2 l: p3 U% F: m  V+ i   {
/ _% X1 o' `& s% X& d' \      cdev_init(mcbsp_cdev,&mcbsp_fops);
9 Y" z3 b+ i, L: n1 Z# E      mcbsp_cdev->ops=&mcbsp_fops;" b4 m/ I9 N( [6 P" [" x
      mcbsp_cdev->owner=THIS_MODULE;+ k* t  b2 G( x4 R
      
4 B* i. V' g  D: P% j, N% w# y      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) `% t9 H" p7 P2 ]. a          printk(KERN_ERR "register cdev fail!");5 j2 i5 P3 }+ E0 U: y3 J
      else; y6 U' n2 [6 ]8 P& A1 `  Z
          printk(KERN_ERR "register success!\n");) K5 `5 A* I2 I4 J  U) R$ P
   }1 k* W! Q+ T/ [% z
   else
4 }) A- s1 k. t5 C   {# C* R& A9 H2 [
      printk(KERN_ERR "register cdev err!");7 O. Y" I2 `, y( d1 V  O9 ?
      return -1;
" R5 O+ s2 R* {+ h3 N; t6 I! w   }* H7 x& I. R  b' O+ ?
   9 N5 r8 J+ b' Z
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 A/ u/ O, W, C& r/ e( L   if(IS_ERR(mcbsp_class))
6 D. n$ v" {7 L- {( z   {
/ n) X) J$ L0 j/ M" g      printk(KERN_ERR "register class err!");
( u$ O6 Q( h  G  Z  x; p   return -1;
% C) S; Y; U; w$ I; _   }- V% @- I/ U9 e
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
2 G8 \/ x. p; g. M, W! V7 Y6 F( h& o; z4 \6 m2 \# q
   //PSC
" s& C) W" C0 d# N) d. p   //add Enable MCBSP
' i5 a( M3 P) V& m2 w$ E   //test
8 A5 @8 K& W0 y9 ~1 v6 r5 y( G   temp = 0x80000003;- N, r: [+ E, A- `
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));2 Z: ^, t! X* n
   temp = 0x00000003;3 x3 P/ Z' x0 [! T2 ?
   writel(temp, IO_ADDRESS(PTCMD_ADDR));! x( F0 H% P1 k" r- L* W* K( j2 ]
" C) ?& {0 S8 J; G# A& C
   temp = 0x001FF201;7 V* d* J7 S2 J3 D6 u
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 L5 P& v. b+ v: J3 K4 k$ A   $ x! q) l5 k6 T, x. w- E
   //PINMUX  
+ j& E" J% t4 Q+ j   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
0 S8 n$ \; @4 ^0 ]$ e   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
2 E. A1 a: w% ^) q* V   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
! L2 O4 p) e8 d: r# W* M   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);6 G: [# K! H9 p5 X+ j6 W
   
: `4 U, _) Q7 L; r   //SLEEP_EN,EPR,L138_SHK1,L138_RC6 K( r1 z. \  U; h
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ' G8 ?5 ~. V- e: d7 p- v- E3 w
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   & E7 {% @  \) q; `( _9 X: }  b! A7 e
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' q0 I2 L+ M, |& }1 i7 ?( T 0 q! u8 _7 C3 G$ |; \6 u
   //RESETn,L138_SHK2
+ _. k4 S7 a+ B   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  : G5 q( P! X1 w% J
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
& N, v7 m; C- J# f6 u# l   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) j5 g8 Z+ i8 z: q) B " B7 Q' m0 N* w4 |8 D# x

9 g8 A+ ?% ~; Z  ^+ x  //SPCR Register: M" Q3 z: W* W; B/ u& D
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- L$ P' [1 Q, n0 ]  T4 j/ d
  temp = 0x03000000;//(DLB=0)4 b% ]5 J9 |9 h/ @1 b& M
// temp = 0x03008000;//(DLB=1)
$ ~( A; R, z- J0 Y4 G5 [5 ^  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset9 [# y8 U- w' p2 x, y
  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 F9 |' u- z) g% p) ~2 Y  printk("temp=%x\n",temp);
6 ^: C" }( U" j  U# R * o3 q* [( Y* U
   //PCR Register
& Y; m  l* H4 s   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-08 f# T1 o4 a# S6 j1 o: O
  // temp = 0x00000F0F;
( c$ V+ f% p" W: J  temp = 0x00000B0F;' V/ X" L; s1 C* O# F
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
" E8 O: B! q7 S  temp = readl(IO_ADDRESS(PCR_ADDR));
$ r/ o+ P: y; B, o  printk("temp=%x\n",temp);  : V/ s, y& N# o' W* A5 [
   //SRGR Register* c7 q' D  ^- t% u) d8 `4 `
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11  S! y  T2 {* Y& E1 H
//temp = 0x301F000B;" H' ^# d7 J" ^0 K! Y1 n: F* D) z
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
& s9 k  B6 A' x/ I9 X0 z  temp = readl(IO_ADDRESS(SRGR_ADDR));
$ X+ h* h4 A6 a  printk("temp=%x\n",temp);: Z* ^# a4 k% U/ u: ?( o% w
   //RCR
3 X0 u* @2 i. V0 |   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,. {+ v/ }; l8 V7 d0 u7 J
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-01 p# A- Y4 [9 e/ r) J' W+ A, j" e
   temp = 0x00440040;, j, o9 O. Y5 B2 Z6 M( ^/ B: c! j
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
7 l  I! E( X/ S. o   temp = readl(IO_ADDRESS(RCR_ADDR));
) X: v% k% P8 K, |   printk("temp=%x\n",temp);
, W; I2 L& R" f3 W) s   //XCR9 a( n# }' n+ k. u; h- k1 f5 j
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& z% X: A0 k9 |$ t3 x# @   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% }( _! O8 H3 E
   temp = 0x00440040;+ k1 n$ k5 T9 f/ X" ]
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   7 F+ I% A  r: m
   temp = readl(IO_ADDRESS(XCR_ADDR));7 R$ w" [1 R7 q; o9 A- i* x% k1 k2 A* Z
   printk("temp=%x\n",temp);" q# U, ]  ?7 m' N8 q( i' ?
  udelay(100);5 v/ x" A) K/ c$ ^
  //SPCR Register
5 k; M' d0 n/ ]& E3 w  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! Z: I. i( V$ V- z3 f8 A: @6 c6 C
  temp = 0x03C10001;   //DLB = 0 VS DLB = 16 h/ z( M* E( Y! z8 T
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled0 a8 F6 m) ?/ r# j
  temp = readl(IO_ADDRESS(SPCR_ADDR));& J6 X" e% C8 {
  printk("temp=%x\n",temp);
0 X% Z- z1 h% C- I  udelay(100);
# U, X1 V2 I, G7 ?: n$ N, z& |+ m/ L: \( b6 Z$ V& m1 w. p$ H
  //set GPIO direction# O) J& d( M' x) o
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));5 g6 d+ W2 |8 L5 k4 N& T& G
   temp = temp | 0x00000100;//EPR----input
: M5 ]5 ?1 g3 k) ?   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output5 C$ n7 A+ F* Z- K7 e0 z
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ! E8 v/ m% L1 C$ E" v

1 `. s! _0 ?4 z( W8 I8 |   return 0;4 s) U" Z$ `3 ~/ N% {( l7 _; X
}
3 e" B2 X9 r$ q1 Vstatic void __exit MCBSP_exit(void)+ u) a8 y. B: k
{) h$ D& P4 T4 H: ^9 L4 L, v
   printk("mcbsp chrdev exit!\n");* t- o: ^$ A" h4 s9 c3 U- j
   cdev_del(mcbsp_cdev);, W9 J7 z0 U0 v1 x4 a6 k
   unregister_chrdev_region(mcbsp_dev,count);
/ _$ i$ v1 V* o4 [, H( F8 E( |8 @   device_destroy(mcbsp_class,mcbsp_dev);: y* b( M2 e: @+ T% Y
   class_destroy(mcbsp_class);- j1 U7 k/ t  h
}
: ~0 Q! X2 S7 R; Gmodule_init(MCBSP_init);: p/ {/ c, w. n& n2 W- }  o
module_exit(MCBSP_exit);( a+ P. E' {' K$ P* M. J2 {" Q
2 [. g! P8 `! D) \6 L
MODULE_LICENSE("GPL");
5 d& y# {! P, @5 f3 Z6 z( g2 f+ d* l: H0 O1 m0 t/ K5 R
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
& D2 o0 t  u- H4 o! V我的应用层的测试程序如下; y# S' z: u: d9 `" I
#include <stdio.h>
0 D  p- S: U! u& U#include <string.h>, X/ ^; @  q+ T) A4 d7 v( Y
#include <fcntl.h>
& N" I2 f! O( B$ a#include <unistd.h>, W8 R1 X( U3 G5 `  T# v
#include <signal.h>
, J* @4 }# b8 N5 T( E9 n7 W#include <pthread.h>       //线程
3 M6 }$ V4 x( M6 h#include <stdlib.h>
) y$ ]& I: A) a/ ~' K( P: M#include <pcap.h>          //捕获网口数据
2 d6 ^: U( `; [1 U1 F#include <semaphore.h>     //信号$ B0 K, _; C! A9 U$ X
#include <sys/types.h>     //消息对列
/ H" ?/ c1 V, n- v/ L' l! O#include <sys/ipc.h>       //消息队列
  d2 k/ j% e: ?% p: d8 {8 D#include <sys/msg.h>       //消息队列, ]0 I' b' Y! i! S+ f
#include <sys/select.h>
& G& S0 d" X# L' z, X, m#include <sys/syscall.h>1 E6 J0 `: S% r
#include <sys/stat.h>& [7 {3 F" [: {2 J- \* q- J) K, e
#include <sys/mman.h>; ^7 h+ M( K* y. f3 R+ A3 j  j  o
#define msleep(x) usleep(1000*x)
: Z4 y7 o# H. [8 l8 O) U3 G0 c! ~+ }; D* ]$ e; |% E( v
int main()
* F' y- {, ?' M# @{ ( m6 y1 X/ X, l' U5 R0 D1 @! G8 h
    //MCBSP,ARM与AMBE2000交互设备0 ^! z- y% q. x- |" Y* O
int fd;
/ o9 [$ E/ s7 w0 w# ]' K unsigned short data_write = 0x5555;
, `: r( A1 j3 \ unsigned short data_read = 0x00;
8 l0 @0 d' B- j8 Y% U$ n; j  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: p9 R* I- r4 {* F: M( U- R //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' |9 u* {/ u7 ]  l. p. d. d
   
5 J7 s% W, f6 C# i  if(fd < 0)  o5 x6 s* ~$ ]2 U
  {
) C. q7 u+ @9 o9 d6 q     perror("open failed\n");
- d% Y% O* Z3 {2 ?! a     return -1;1 H. B& k% o8 \) H, ~, o3 S: o
  }
! Z) \) h+ K  g$ `% A; e: q9 x1 z  & O6 {4 R$ d* o$ z* v# s0 _
  while(1)  }0 V5 [, T' \
  {" Z  U3 M' ]# |7 b( K) O
   3 o) `! |& B6 U( m
   //AMBE2000每次读写是24个字为一帧- v4 w! K& D' X, B( X' n6 g9 \7 X
   //写数据时将数据在底层存储起来,等到中断的时候再发送+ X7 p' @$ y2 N' ]' f' U( [$ A
   //AMBE2000输入数据是以0x13EC开头的
; l" ~, \& Q6 v" z   write(fd,&data_write,sizeof(unsigned short));
" P5 c9 c  Z! G* A' O8 W3 n# P   
% G- E# \$ B6 R( f/ i* S- I   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
' R/ O3 H, w2 e' ?% p   read(fd,&data_read,sizeof(unsigned short));
7 |' u: c1 T9 o1 P' }0 ^" }8 c   
2 J& u- c- N3 k" ~8 i& k; U1 Z   if(data_read == 0x13Ec)
5 u; C) {% W! A, t' I+ Y   {( G/ x. u) I! V( Q! B- @
   # R4 w8 L) F0 g( Q- L  v3 M' n, R7 m
    printf("data_read = %x\n",data_read);( l% {9 D  ?0 l/ X
   }
* b9 x3 R& @- c* X  B0 i: i; w   # u( |. E: \! R4 Y8 x8 c
   msleep(10);1 j+ v1 |: r9 Z& L+ p
  
4 r2 \! Z1 |  F6 y, C9 K- t; M* s  /*
  m7 z9 z7 [7 q; V3 Z) ^+ K   ioctl(fd,1);   . N. c2 }# O6 k# l/ u! E5 l* p
sleep(1);' r, n" n# w6 v) t; ?$ o
ioctl(fd,0);; f. A) H4 k1 F% G" W
sleep(1);; Q1 R1 u/ }- f+ g# d
*/ ! v/ v- |+ _' N: ~, u
  }   3 Y0 @6 @& b6 \
return 0;0 o3 I/ s; o; Y  l* a% M

/ }+ L8 j4 Z& B: A}
" O6 a6 i1 ~) l; [0 V& t' E% u9 q  |% R9 |6 L, ~
多谢各位指教,谢谢! 急. h. }# w6 O" b# E7 N  a

; g$ e3 r0 u! {, j* t& [$ n! X; R  U
2 k" o' C6 _; T

) y. W8 H6 U" P: I/ S  S) t( n* |3 n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-22 22:22 , Processed in 0.048214 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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