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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 1 w. R; e& f5 D8 _# x
/*
9 z8 i8 ?: y0 q" ?9 @' n9 l * Copyright (C) 2009 Texas Instruments Inc
1 u( ^7 F+ q  f *
' X: D4 O. p; S9 v1 h6 K, R. I * This program is free software; you can redistribute it and/or modify" o, e$ g  Q% c$ i
* it under the terms of the GNU General Public License as published by
1 l. d0 `7 f& D% N! T# f9 } * the Free Software Foundation; either version 2 of the License, or& w0 i- x6 X( t8 B
* (at your option)any later version.
6 d; \6 G- n- ` *
! N5 T$ \' B1 g * This program is distributed in the hope that it will be useful,3 Q! o, F) M7 _" e) o- R
* but WITHOUT ANY WARRANTY; without even the implied warranty of7 U! m, ]" `9 ?: G4 q: ?5 i! k
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the' @; ~) y8 f6 v9 W0 J1 C3 I% r
* GNU General Public License for more details.
$ j' D7 h0 X) S* b. h- [4 q *
' i/ R6 B0 m# I# Y6 }- Z * You should have received a copy of the GNU General Public License
/ Q/ [) K$ z: H9 \' I * along with this program; if not, write to the Free Software
6 V* [. A4 S) c& k * Foundati
7 p, T- ]5 S& Z& y! V*/
; O  `2 i( Y( s5 r. |#include <linux/module.h>$ _: N3 J  U) e5 C
#include <linux/init.h>
3 I$ r  g; E0 S% {#include <linux/errno.h>+ {' |$ `6 J/ f- c* S
#include <linux/types.h>  Q/ ~. M2 U  A$ t* a
#include <linux/interrupt.h>- x6 ~' B- P! a$ z7 A
#include <linux/io.h>$ I- x' F! j. \$ ]$ F
#include <linux/sysctl.h>
* Q, P. g) n4 ]* k7 e#include <linux/mm.h>- X+ J3 }5 v/ r
#include <linux/delay.h>
5 `. M* O! D' N, H" X#include<linux/kernel.h>7 n) G6 s% {& f% H
#include<linux/fs.h>& R6 f# @; a1 @9 i7 p5 I
#include<linux/ioctl.h>5 p0 M2 [; T& T
#include<linux/cdev.h>
0 t9 ?0 X: p- I; }# d6 ^* w7 {( ~#include<linux/kdev_t.h>6 C6 J# g6 M# }8 u1 m- C
#include<linux/gpio.h>. }! s0 p( K1 M& ^$ w& t
#include <mach/hardware.h>
  @+ v- @6 A" x5 O$ [5 P#include <mach/irqs.h>' x& Z/ [: w' Q# ]

- @  T( F) H$ h  Z: k6 K#include <asm/mach-types.h>. K  s+ }4 z, u# ~; V
#include <asm/mach/arch.h>
2 B0 H( O0 X9 E: m7 X2 e' H/ M#include <mach/da8xx.h>, m, F) \1 s* q4 o. L; m. n
#define  SYSCFG_BASE   0x01c140002 t* I: o7 @% V1 R3 w
#define  PINMUX1_OFFSET   0x124 % C# I+ G2 r. ?8 u9 |' {! U% P
#define  PINMUX18_OFFSET  0x168 ; j. u. e' E! ^7 s1 ?' p' X
#define  PINMUX19_OFFSET  0x16c- y3 l' Y( u9 j' T* I' _% G& g
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
' G* N- K; h3 p' g* [2 \5 i1 ^#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR  h$ t# U8 ^1 J1 A* P
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
: _% O5 \5 @+ B" d#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
9 G9 M* j! v7 B2 P- F# M4 y. t#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
! W% c4 i4 z% t2 e0 v& z3 P                           
, X& ^; I# G5 i! a# ~#define DXR_ADDR      0x01D11004  //MCBSP1_DXR0 L( {1 t( d6 U9 ^& {9 Z, q: k
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR) Q  _" I6 K) T
//PSC
8 d) h! l& x; H  f( g#define  PTCMD_ADDR   0x01E27120  
" e) L/ a' z1 r: T) W#define  MDCTL15_ADDR 0x01E27A3C5 f' E- \/ K% _6 c
#define  PDCTL1_ADDR  0x01E27304
5 A: J  b! y2 o, I//GPIO8 direction
6 k1 z/ x- `: p* ~#define GPIO8_DIRECT  0x01E260B0
- E0 Q$ o* Y& X0 ?/ o% Y1 f#define GPIO8_OUT     0x01E260B4/ ^; T! W- Q3 _" z5 l
#define GPIO8_IN     0x01E260C0
. g8 s+ f, ~3 O6 l: {1 a" S0 X; j' B, B2 Z% y
//#define MCBSP1_RINT    99              
# ^9 {8 F$ q4 G2 d  I$ F" w3 A//#define MCBSP1_XINT    100  9 B# g3 g0 [$ v8 Q. g) Z4 z' x
static int MCBSP_MAJOR=239;
9 W/ I( x: i; `. Z+ Istatic int MCBSP_MINOR=0;
* O# j3 |2 j8 O! Q: }static int count =1;
! `, g; A0 k* U
- G- f0 {( ?+ R- k; \#define MCBSP_NAME  "MCBSP-device"
5 W2 G2 F5 R5 r! p& K2 L2 S" X* m% V8 _2 g
static struct cdev *mcbsp_cdev;! _0 h  ~# P6 \
static struct class *mcbsp_class;
0 q. x  x" y# ^9 xstatic dev_t mcbsp_dev;3 i* [. W- ?8 k' q  E$ @1 x
unsigned int DRR_data;
8 N5 C0 a# \7 g" T+ {2 _) `# Tunsigned int DXR_data;. x6 t" U. t3 [$ L/ X! [
static int mcbsp_open(struct inode *inode,struct file *file)# V" D5 w6 m# V/ m0 w$ L
{
1 b0 |2 ~& g, U( T4 `   " K4 J! T3 }* ?- {
   //interrupt enable,initialized
, k) W% E0 O7 R7 i   unsigned int temp;- @3 O0 A3 l1 l2 N* _* C' T0 Q1 m# H5 v
   //SLEEP_EN(GPIO8[10])---0) q' Y9 d& f6 z( E
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 a, @! F0 ?4 `8 v
   temp=temp&(~0x00000400);1 v0 ?2 z- ]% I' B, i1 j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
2 \. y0 H- }/ a0 ], @8 h5 \  //RESETn(GPIO8[8])----0----1) G+ `6 p1 u" q$ h! s3 G
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 [7 v9 L7 G& o4 ~5 v7 ?- A8 P. {   temp=temp&(~0x00000100);6 A2 C6 Q' e9 m1 }, n0 H( d
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---09 w5 f( ?( S+ K  A9 x& T
   udelay(100);- \- R# P9 y9 D1 p
   temp=temp| 0x00000100;
2 a7 y6 E' u8 O" v   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---15 ?) s8 w+ y1 y$ P9 d0 J4 q$ m6 a3 S
   udelay(100);0 S) T# ?  B4 A' P6 \
   printk("open success!\n");
- Y9 U3 }" a; }; R   return 0;
& R' X+ r) `! x. R) z) [}
8 {% h) P" v* @9 Q5 \4 B; t' |+ l5 U; F" j8 h" A
static int mcbsp_release(struct inode *inode,struct file *file)
! t) d$ d2 n: g/ j# i& `- D* }{8 V5 O" w9 v5 G" Y# M, s% {
   printk("release success!\n");
8 B, P7 H6 S0 f4 ^' Y/ V   return 0;
  T1 S, |! @9 q' W0 H}
2 m  j! v) h, P0 J# D' l" S% M( M0 X/ Y6 N% U/ {$ ?7 n2 U
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 g0 r' n* W, c* }7 h{
9 ?, z5 k5 w' S; ]    copy_from_user(&DXR_data,buf,len);% a8 f' F; a# h" j! ~$ V
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
# v9 X/ u) ?6 g* p    return 0;+ r% E$ t9 B* }* ^$ {2 Y2 n+ Q
( U4 j# C5 S' D" U& e$ _
}0 A) g/ R& k' M3 q4 ?0 i3 q: @

' c4 c. t9 F4 l7 v( O! F6 p0 p9 ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)/ ?! P2 T1 c7 K: R0 L4 }# G
{
- ^( Q( D0 U- [3 l! O   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' f5 p: c" M6 L4 m7 z' K4 |   copy_to_user(buf,&DRR_data,len); % f  }! B' ?4 I; g- X9 _
   return 0;$ l$ B8 m; w5 e) C/ B
}
1 j$ ~9 T( Y9 y. M6 P) j* q  X# ^+ B! d+ f9 a; U5 r8 v; p3 S

3 U1 A( k! F/ f$ z$ a+ s* {- Nstatic struct  file_operations mcbsp_fops=% W, R1 d) I4 G
{, Y  r8 C5 Y% k: W) Q# S, |
   .owner=THIS_MODULE,5 |& v9 K; s1 O, |. [
   .open=mcbsp_open,; G9 Q: _6 k+ x% L1 n3 H  i. b; B
   .release=mcbsp_release,7 W8 A$ Z9 u! m& K7 I0 @* _5 ]
   .write=mcbsp_write,# U# J2 s9 i" G: g6 U8 C. h
   .read=mcbsp_read,
# _( e$ y/ |: V: Y3 S. y5 @};
& _- ]* X5 q/ I* j- b& \, Fstatic int __init MCBSP_init(void)2 Z: ^& e3 \: n2 E
{
2 @  S* ]9 {& U$ Z' c/ A# q   int ret;
( J/ e( {3 n4 \# [   unsigned  int   PINMUX1_REG_old;) i" c/ G5 S. \" E8 L) t
   unsigned  int   PINMUX18_REG_old;& M0 x( m& X' L: X, C
   unsigned  int   PINMUX19_REG_old;2 L- Y+ R2 z/ q0 H
   unsigned  int   temp;  
3 n1 ~2 E3 L3 b' N1 a. r# p- n   if(MCBSP_MAJOR)
- J  h( A5 p" A7 T! Y2 d, N   {% }$ R+ l9 e, y
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);2 \# }: F( R5 u5 h6 u/ l& Y% r3 Q
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);$ x- Q+ F& d, N! ]! c# u
   }
5 c1 ^, C2 ?2 u- B   else
1 g- L6 g! |% m/ ?, [% Z   {! x  j  k6 s5 r
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);+ W+ x. c/ ~# e& x* |
      MCBSP_MAJOR=MAJOR(mcbsp_dev);) O: I: F; s- J8 C6 {1 Q/ m
   }. X( Q" v8 Q' g3 J
   
1 ~: o/ v5 R* ~- c   if(ret<0)6 }6 t+ A: E* s2 L
   {
& ?/ V' j( N) `" N+ z& h      printk(KERN_ERR "register chrdev fail!");3 J- d6 k0 X% V2 ?) [
      return -1;
# T/ N- V- h  c9 a. d% B   }* U/ d5 [- c5 j' g4 F5 f- {
   
! s" s3 c, f+ U  w6 ?   mcbsp_cdev=cdev_alloc();, H5 E: m; r1 j$ t1 d0 V
   
/ h# J- r# a3 ]( U& C   if(mcbsp_cdev!=NULL)4 b: I& `9 y: Y: |8 @
   {
- l9 A3 ~# ~' t7 }7 Y) g2 E      cdev_init(mcbsp_cdev,&mcbsp_fops);
$ ]; _- Q  c2 H6 s$ O      mcbsp_cdev->ops=&mcbsp_fops;: W  Y/ J' [; L, q
      mcbsp_cdev->owner=THIS_MODULE;
6 Y% p* X' q) [# k0 T  [+ I* [      
* e0 x4 G# @6 ]' L' _* P      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
% L  T8 x2 |4 G' |0 k  i          printk(KERN_ERR "register cdev fail!");
' i' k7 P+ \  A1 q9 B      else. _# s3 Z8 @+ Y8 _
          printk(KERN_ERR "register success!\n");
- S  ?; P0 x4 t9 j# ~6 E+ s5 o   }
# ]" `7 }6 _& \/ H6 h- E   else
- m  X0 P' ^! ?   {
% d, d" F8 W3 B8 s      printk(KERN_ERR "register cdev err!");
! H1 y, E* q8 y* c4 z( J  Q      return -1;
/ C" u' b% O9 I3 Z7 }) E$ f   }
4 p1 j5 e) X" z4 L4 V   
% f0 V4 r# N. {3 ~, t" j  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
* w5 O. n2 p# M; o1 v$ H8 j8 M& `   if(IS_ERR(mcbsp_class))
5 _+ _* a/ Z1 d  V7 s   {
, |  ]; K3 P& X5 D/ w      printk(KERN_ERR "register class err!");& s1 N8 C. w# F
   return -1;  S. S- J' K' u* t/ _3 B
   }2 i. @: f! \2 C: q/ f; ?7 V- H, Z
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);8 R" C9 x# G5 S( P0 k, t: f4 o* u, L$ _
6 \! ~5 [3 _$ d8 ]# a; a# Q  Q
   //PSC
7 Y/ q5 k& g: h: i; Z1 _( W) o9 J. F   //add Enable MCBSP
: h  I2 ?7 U/ a# Y   //test
, U* C' g- D# k  }: H8 [   temp = 0x80000003;
/ X0 k/ K5 j4 I   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
2 p! C6 O! k2 |4 j8 Z* L   temp = 0x00000003;
% z9 N2 _; ^% I  j% w0 b   writel(temp, IO_ADDRESS(PTCMD_ADDR));
4 E+ H) w1 ^9 @1 i+ K! }
) I; F8 ^- N1 b   temp = 0x001FF201;- x  q+ o. _" ], i7 w9 M8 ~9 @" ^
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));: X9 H) e8 ~6 W- R  Y
   
. ]" X5 r. T- ]; D/ W, Q   //PINMUX  & T& b& [4 J, \* `
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* j: ^8 r6 ]1 \& Y- \
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  $ Z% S% ~+ e- B& Y9 F+ {- ^& T
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   9 v# e& d9 N; Y  O; u' M
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
  K6 b  s& |  @   , e3 X# O$ ]* a1 ?$ q
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
( N3 b6 a$ N8 q# [+ v   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  . a- k8 l( s) a
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
. d0 }! T( z# m$ u) Y- H, J   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- ^  ^8 d* k* x" v " }: I- u9 i$ l
   //RESETn,L138_SHK25 Y' `7 |- V! c2 S& A2 Y( f
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  + V, S7 N+ P* r; o
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ' S9 a5 c' o; m% e$ Y) X5 C
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
6 l% J4 x7 I, P& i  H* g$ u. ~ 2 t% \2 L+ a1 ~# O$ X
5 M  Y2 {  T( f6 f& Q% q/ p3 o
  //SPCR Register
7 ^* k: R! v) M& \$ O! e  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
0 {, G; X! T6 t8 B+ p* N, ]  temp = 0x03000000;//(DLB=0)
5 x0 X2 b8 N/ J, \! a& I9 \ // temp = 0x03008000;//(DLB=1)+ j( m2 {6 O8 U& B8 O3 S1 y( u
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
0 Z* J  A  m" i: |6 `* G. p  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 I, ?6 p3 W2 q' k  printk("temp=%x\n",temp);
+ l* r" ^  H* T  J4 \0 _
! b( a0 ]2 O# t/ x/ w" c   //PCR Register
( x* c# K5 D# d6 w7 ~  Q   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0- ~- p3 Y& v" L; u% n) J2 Y! ~
  // temp = 0x00000F0F;/ w% p7 P) @* Q! V
  temp = 0x00000B0F;
+ C' t. a9 @3 j" G+ S  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
1 f! i+ k- I2 ?5 X" i& Z) X% C6 u4 L  temp = readl(IO_ADDRESS(PCR_ADDR));0 O) W8 D! R8 A: |& P
  printk("temp=%x\n",temp);  
" a0 q- O  U1 K% d   //SRGR Register" \0 j; a. ~: y
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. o. S, A5 w: E //temp = 0x301F000B;7 t0 |' Y' X$ k/ @
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
: o! e, ]8 W! ?/ \8 F  temp = readl(IO_ADDRESS(SRGR_ADDR));0 R) v) l3 \; C6 d& o
  printk("temp=%x\n",temp);% `' o. t8 ^# l
   //RCR
. b/ e. X4 `5 I6 w3 @6 L: Q$ F# Z1 X   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,6 k' ]+ s( F. Y; j8 n
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; G$ @! {! z- b7 [# Y; _7 N" `, V
   temp = 0x00440040;
& v- w' V5 q) q   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   " L6 O+ z, z4 {
   temp = readl(IO_ADDRESS(RCR_ADDR));+ Y$ h; u0 G9 M5 z
   printk("temp=%x\n",temp);
# T, I3 ^' u, e4 d   //XCR
3 [+ o8 Q  k5 R7 z   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
  R; [$ Z. H4 t# M" z' z   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; ~9 S8 \0 V$ U0 G. G. z
   temp = 0x00440040;% j  ?) D) ]' k! T4 |; @3 P  r
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
+ R6 n4 \4 ?/ h2 B5 c; o   temp = readl(IO_ADDRESS(XCR_ADDR));
# I/ K0 c# x& }  _   printk("temp=%x\n",temp);0 ]5 `! @! k, r
  udelay(100);7 d$ q) o4 _2 ^2 q" D! c5 c
  //SPCR Register
% t: F, E: l' N8 ^  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
: Q' h# t1 T  b3 z' x& n  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
( s, S' k. F+ i6 t( [; b; [6 `0 b  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
# ^4 u0 [  p$ r$ S( ]  }$ x  temp = readl(IO_ADDRESS(SPCR_ADDR));
# _. V, o5 E1 x  printk("temp=%x\n",temp);
% C# L% ~0 \  S: G% w& c/ F  udelay(100);& x. ~. @; S% k6 s
+ Z3 x0 s( t8 U( N8 a% F$ F5 [
  //set GPIO direction9 `# e# P1 X4 N* [9 e; G7 P0 O
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
# ]. d+ T9 C1 F; t" q4 I1 ]   temp = temp | 0x00000100;//EPR----input
9 S  R4 x% d( s, k. K7 {   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output: r5 i2 k# a+ O' ]
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - S% B2 j( \) B6 A; x/ K) v

& v6 P( Z% C* N5 H; B& v( {8 {   return 0;
) z, I- m  D) v+ W$ e}/ z8 P2 |- ?& D( o+ B
static void __exit MCBSP_exit(void)
; X0 z0 p7 V+ g{
1 g4 s8 n% H! t& P2 `( a, O   printk("mcbsp chrdev exit!\n");
% m$ c* B) U' T1 M# p8 I2 ^   cdev_del(mcbsp_cdev);0 o8 ^5 y4 \; f; [3 n' \& W2 s/ B
   unregister_chrdev_region(mcbsp_dev,count);
* m. ^7 f  |1 {, F& O   device_destroy(mcbsp_class,mcbsp_dev);
2 M  y0 n3 i/ }: |* l   class_destroy(mcbsp_class);: `0 i7 {/ @" a% y0 @" }3 h
}, `  z: |+ z9 D4 v, j
module_init(MCBSP_init);
: p0 N. c, s  I! d* g7 `module_exit(MCBSP_exit);% T+ g1 w- f- S+ {5 i) A7 @% C" B
$ f) Z6 J% K0 S& e! {1 Z
MODULE_LICENSE("GPL");, X3 @5 u; i, K8 _5 B) t

% I4 H; o. g" S& }+ L" q6 H& g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
/ E9 ~/ i6 Z4 L' z  S! ~我的应用层的测试程序如下" g0 c8 j* M; Z7 R  }
#include <stdio.h>
' j/ d) w' i: v& [+ n3 ^+ b#include <string.h>) z5 f/ ~0 o% H) T2 H9 j
#include <fcntl.h>7 ~) p4 C% i& i1 P6 @6 V3 N1 K
#include <unistd.h>7 R. v5 X: L- l' Q( o4 v  ^
#include <signal.h>3 D  n+ d! F$ a% r3 u4 y/ L' D: n3 D9 W
#include <pthread.h>       //线程
! R$ N$ R! ?# A4 P2 d#include <stdlib.h>
) A1 Z5 C" @5 Z- O; M6 i! G#include <pcap.h>          //捕获网口数据
! W, y$ {8 p/ b4 j; E8 {( _4 j" W#include <semaphore.h>     //信号& p5 x2 v6 P/ a; k
#include <sys/types.h>     //消息对列
: P- `8 J4 s; Q+ J#include <sys/ipc.h>       //消息队列2 n* k) ]0 l' O4 {
#include <sys/msg.h>       //消息队列& ~* w7 h% b& t7 f% ~0 U
#include <sys/select.h>: ?0 B: D0 Q. _1 n: K* W
#include <sys/syscall.h>
: q, t8 q; M) ~. d) g7 e6 L+ x#include <sys/stat.h>
0 ?) O% V  k  U#include <sys/mman.h>
- b* i( G! u! [' r#define msleep(x) usleep(1000*x)
) L0 Y# W' S) {; d1 ]5 \2 m9 r1 U9 k1 z, n1 K7 f5 Q8 s# k2 a) u& _
int main()
$ B) G0 z( @, k{ / v9 K* [! m- J- w
    //MCBSP,ARM与AMBE2000交互设备
& ]* G. _0 ?6 E8 ^, Q, Q  _, R int fd;
) \3 L* o7 \9 X( d unsigned short data_write = 0x5555;
3 v- t0 [7 g7 O" Y+ L( I unsigned short data_read = 0x00;
) K( ~. w$ R" b! B: w6 y  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);; W7 V6 p: e% C
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 E% C1 q$ W& R: S   
: Q; ?) a( N+ Y& v. h1 U9 L* |5 W9 F  if(fd < 0)
- [. Y& Y: c: A- ]$ C  {4 ]6 S; V! F3 \
     perror("open failed\n");7 I* p5 |  ~& T0 E+ O9 J
     return -1;
/ q7 H; H2 p2 \% Y& S! T9 \2 o  }
- G2 t. N: O) x/ x  
. k1 i+ j* |/ n& h# J% }' I  while(1)* o1 j7 q$ B$ Z7 K& W& |
  {
: }8 Y0 j3 Q0 }" S1 T3 o   # N$ t8 P2 h4 u$ a! F
   //AMBE2000每次读写是24个字为一帧
6 `* E" _1 w. \   //写数据时将数据在底层存储起来,等到中断的时候再发送+ o$ v8 E, i6 I$ \( k
   //AMBE2000输入数据是以0x13EC开头的
. E. l3 z- H) Q6 F$ |   write(fd,&data_write,sizeof(unsigned short));- r- O( V% Y  s  r0 W1 S$ R6 ?
   * r; x8 j4 q" c1 @6 G% G' b. a* N  N
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
3 o/ X% ~4 C4 d+ d# D# `" [* T4 q/ W   read(fd,&data_read,sizeof(unsigned short));
6 G5 }( t2 U# q  o   
7 Y: t# j" z6 U2 W   if(data_read == 0x13Ec)/ H6 \, D) M  U/ F8 f! ]' H
   {
0 x$ v( I0 @* B1 W) x5 y/ i) r+ o   
% }3 R% s, |- g5 G3 h; Z    printf("data_read = %x\n",data_read);
& d; {' b4 m! l  m" B   }
  l, k% ], e1 D) m3 @   4 w/ Z6 u, l/ @& r# G; S$ B/ i. {# R
   msleep(10);2 C, ~( x- ^' b! B' e
  
5 N2 z' i) l- I- W% u  /*5 w6 b0 H) U% D( K/ u1 [- K
   ioctl(fd,1);   
. B( @5 N' a7 W7 [ sleep(1);2 _( b; p6 \, ~! U# P
ioctl(fd,0);- J$ G- @. d0 z* o8 [
sleep(1);
& b+ U& D" |- y. W! [* ]6 i6 }! g */ : p: C$ Q) Z6 r  y) e2 t+ L
  }   
7 L) R& ~4 D9 l/ D return 0;
, k% x( o# e' k, l. E2 s
5 G5 M6 n! j- b3 S, X0 \}( A9 m9 d; N6 S4 W& }5 F$ t* m4 z

$ D5 E! U. g$ ?' V' F多谢各位指教,谢谢! 急5 J% ^; V) w, ~

( {( g3 Q2 f  a1 J3 V, @% ]- ^: H8 `; y( \% {1 J
6 n! W$ R( l0 X

9 w6 t2 k3 h- D/ \0 s- B! Y: Q, F' ?) x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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