嵌入式开发者社区

标题: McBSP时钟、同步、数据线不正常 [打印本页]

作者: gaocaimary    时间: 2014-10-16 10:58
标题: McBSP时钟、同步、数据线不正常
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
' e+ D" Y7 P% w: Q8 B; G/*( i+ {) u$ x/ d) v
* Copyright (C) 2009 Texas Instruments Inc
! `, O* L: T1 ~" M; } *
0 u0 |* l- A3 H: ^ * This program is free software; you can redistribute it and/or modify
3 G0 n3 d9 i7 f4 ?0 U/ t# T * it under the terms of the GNU General Public License as published by
3 ?" S$ O* R! L8 v4 A) H * the Free Software Foundation; either version 2 of the License, or7 ~6 L# e% Z4 E+ r% T
* (at your option)any later version.
: m9 g4 j3 F5 t5 v3 r1 w1 r8 w *
. n4 C, b  ]/ z4 f/ s& b0 N" I * This program is distributed in the hope that it will be useful,
; k/ L3 l& I# V  n2 h * but WITHOUT ANY WARRANTY; without even the implied warranty of
7 _7 e. [3 I7 J * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" H$ k1 s' \9 t& x+ ]) K: a
* GNU General Public License for more details.
  Z, U4 M4 Y  q$ s) g *
- y# ^: f6 O3 r* O * You should have received a copy of the GNU General Public License
- q* B! j  e) D& i * along with this program; if not, write to the Free Software4 C$ }- U; S5 a& C# Q: K( o
* Foundati4 W& P' S4 d, n  G3 z9 k9 d; B% H3 Z
*/
7 x+ j& U2 w; B& t: O#include <linux/module.h>
. H& i/ z; i( W! a#include <linux/init.h># d' \+ o( Q5 k/ v
#include <linux/errno.h>
; I5 \9 c, C7 w. Z) a8 _) C, {' U#include <linux/types.h>
6 h  ?# S# V: {#include <linux/interrupt.h>( G2 E/ [  X" x0 P4 [1 N
#include <linux/io.h>- n$ {1 o' p0 c- G) N
#include <linux/sysctl.h>& V' a, W3 y' R: |2 d6 X/ Z
#include <linux/mm.h>7 N9 r0 D2 a# [. A( ^  u8 Q' [
#include <linux/delay.h>
! L2 D( t8 T6 t4 C#include<linux/kernel.h>6 ?& P# h" Y$ r. a9 T. C' e" N
#include<linux/fs.h>
, j% H# J, }) D2 ^#include<linux/ioctl.h>8 V& F1 F+ O6 l' w
#include<linux/cdev.h>
, N9 [/ K. U9 [#include<linux/kdev_t.h>3 y1 l7 x/ d' l7 n4 |
#include<linux/gpio.h>
7 Q6 a+ w, [7 @6 d#include <mach/hardware.h>1 o0 a) |; x# r6 d( u' G
#include <mach/irqs.h>
# a- }% j8 o% S
9 T+ I4 {' d- H% s#include <asm/mach-types.h>
: X! W$ g+ b  v+ N! a2 g#include <asm/mach/arch.h>2 F: T& Q; D/ R4 B# U4 @' H0 a6 ^# T
#include <mach/da8xx.h>
# s/ @7 [% l6 D8 h9 i7 e3 v8 K#define  SYSCFG_BASE   0x01c14000
/ y/ s$ c, r3 `8 K  J#define  PINMUX1_OFFSET   0x124 2 }# t! |# |) @. v& Q
#define  PINMUX18_OFFSET  0x168
& \* w: h% ~; Z7 @: P#define  PINMUX19_OFFSET  0x16c
* s0 ~3 j9 J* x#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
9 k* L6 x1 ?7 E& X: j( \#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR3 D7 V$ I  \; {! I# O2 s$ t+ Q
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
: M4 D  e, q3 b. l7 v" I: z. P#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR, M* W$ e# _1 Z
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
. ~3 m) S/ f% k+ V- {                           
3 P) e% c2 o- s% w* j4 a2 t#define DXR_ADDR      0x01D11004  //MCBSP1_DXR' M  W& C% S% @- ~- i' y' L
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR. H: {8 b4 |" R
//PSC
$ U% U- Q( u+ i7 a8 g& f2 v' r* p) b#define  PTCMD_ADDR   0x01E27120  % F7 \8 @5 H& _& w+ n) P* m
#define  MDCTL15_ADDR 0x01E27A3C
! m( E, q* D$ t, k) j" U" L#define  PDCTL1_ADDR  0x01E27304% n2 Y( V5 ]3 m  N! ?
//GPIO8 direction
$ ?+ P% x+ S! o' z3 J9 \#define GPIO8_DIRECT  0x01E260B0  p0 ~& w5 L# I6 p8 l
#define GPIO8_OUT     0x01E260B4
/ w3 r) S* x$ r( a0 n#define GPIO8_IN     0x01E260C0
8 ^8 g/ _% ?  o! F* T" {; d/ Z/ ^/ f+ y7 ~) Q/ d
//#define MCBSP1_RINT    99              9 [/ c9 M8 n# g1 h0 i; ]0 E0 ]
//#define MCBSP1_XINT    100  $ ^4 }* W* p0 l8 W' F
static int MCBSP_MAJOR=239;
7 M( v1 n4 \4 `/ `! @+ [$ estatic int MCBSP_MINOR=0;7 [) _* c0 k0 c/ H4 l% ]+ Z
static int count =1;4 w! e: c' c, @3 i% o( N  R

' N, C) ]5 f9 b2 _5 a7 ^8 D! E8 L4 G#define MCBSP_NAME  "MCBSP-device"! d6 ^7 G( n: a2 n/ c4 A
  @/ T. ~# E8 m9 l8 y2 T' m! `
static struct cdev *mcbsp_cdev;! M, J0 ]% m  Y+ x2 C/ `
static struct class *mcbsp_class;" s7 ~! c: I0 @" {6 R/ x
static dev_t mcbsp_dev;
" n& i# u6 N8 G& xunsigned int DRR_data;
% q% ~' ]- z  G/ O/ }+ dunsigned int DXR_data;
0 \0 P: P  Q- U# a4 o' Kstatic int mcbsp_open(struct inode *inode,struct file *file)
5 s# S! z6 d( W$ P{) {1 \' z$ g4 Q, i
   + D1 J! p9 h8 B7 r
   //interrupt enable,initialized3 f' n9 t  E% k) b
   unsigned int temp;
) v6 V1 j" q" O   //SLEEP_EN(GPIO8[10])---0. R4 {" _7 `6 y! `3 X2 E" x2 a
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 @# z! {9 }% c/ X, V% `/ [
   temp=temp&(~0x00000400);2 ~- a) n- r5 K* N0 C8 T9 [
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
6 a! r1 U7 c0 h) ~6 x  //RESETn(GPIO8[8])----0----1
2 ^3 S  j% }7 [& ?5 e2 h) B   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- T; Y9 `( p3 I% B5 u
   temp=temp&(~0x00000100);
, [( ?1 d0 C$ g: Q- }& O2 F   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 `1 K5 s% x0 A" J% I/ Q2 I   udelay(100);
1 J* y! @. T$ s  g   temp=temp| 0x00000100;
" T( c1 h1 Q- Y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1$ L: P8 n7 W  ?$ _1 J
   udelay(100);
6 s% H4 j' [- D2 s( J, {6 E& R   printk("open success!\n");
9 E( R) k# b8 i3 f9 V9 \2 g) X! w   return 0;( t  h' Y: \& t7 ^9 I4 W
}" J2 y: Z0 o4 w2 ]' C& q" W
% j7 U% o# z9 F6 L* E; I
static int mcbsp_release(struct inode *inode,struct file *file)
! d) s, ~& F4 ]; W{+ L  h* a$ l/ _& v  A
   printk("release success!\n");6 s* U! E2 z- b0 Q0 s
   return 0;  m& c7 L1 F# k% s
}
9 X/ s# V8 R* i$ l: ]; U4 E' }- n5 B# b' v8 G
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off). q- Y5 S& v% s- k: L) U2 O8 l
{
6 ?# `  ~  l( q, L( J    copy_from_user(&DXR_data,buf,len);
$ O* [  @; o3 l" k    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
* l8 R( l" ^; ?# Z. H* ?' h    return 0;
8 @: l: w2 a# a$ Q
$ Y# _2 f8 {* g}" h: t5 k$ W3 J3 i
; O! |8 E  w0 i0 P9 c* \. K
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: S1 c: y# w6 ?( x3 l{
6 y8 x/ f: A2 Z   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- q" \% y  C) o' {$ t2 U   copy_to_user(buf,&DRR_data,len);   d. m. d/ v: _& |
   return 0;* |! h, Z) Y% f4 J3 c/ Y
}
! ]2 |( w+ G# s" p; n. u
$ ~# _6 H& h% B. ^( z: s
& w+ g; z& `# h# p, qstatic struct  file_operations mcbsp_fops=5 A! ^' \$ |" A
{
- t1 k  ~+ ?4 K' R3 s( Z   .owner=THIS_MODULE,6 `  s/ O0 l0 i) ~0 K0 A6 B
   .open=mcbsp_open,  P  }3 n0 O2 a0 P4 ]
   .release=mcbsp_release,2 }4 g2 @# p, @" U! l9 B  q
   .write=mcbsp_write,2 T3 B# s/ E- V2 f! J5 b
   .read=mcbsp_read,) X% C/ p3 {" s3 a
};8 u6 x3 |) n  G0 G" a( T
static int __init MCBSP_init(void)$ q1 E+ f2 }, O( o. m
{/ s3 l3 j/ O& o5 V1 d: i
   int ret;- [2 U: Z3 X2 b3 M7 j, i  S
   unsigned  int   PINMUX1_REG_old;! U8 e4 e; [- ^2 L8 R, a2 X* l
   unsigned  int   PINMUX18_REG_old;9 Y7 E. s7 C& J" E
   unsigned  int   PINMUX19_REG_old;; E* Q0 r8 Z/ ?: z
   unsigned  int   temp;  1 h+ K% Z! A) r2 k) F
   if(MCBSP_MAJOR)8 w1 P2 x7 i+ ]6 H8 f, A+ p
   {) z& e% j3 P6 }+ A2 M# N
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" g9 z+ E( `  _( w! p5 H      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);" x/ g& A6 G: C7 `4 L
   }
' c9 W, Q' _- r7 P) L   else
, p/ E6 B5 ^: \& i0 a" U   {1 U; y5 D* z/ W: X# K/ j
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);' N" X2 Z6 Z; {2 t2 [" G
      MCBSP_MAJOR=MAJOR(mcbsp_dev);2 s6 |7 z8 \3 N% A0 p
   }/ p) i3 \4 z( [
   : l! ]0 o/ y- U
   if(ret<0); H0 Q2 w5 o) s* q/ o8 c! f( K# i
   {
) C9 `5 {# {& v9 |8 e4 B      printk(KERN_ERR "register chrdev fail!");
7 {+ M, X$ [/ X      return -1;! \0 {4 A, e. {0 K
   }# ^; [% w$ G. s$ X8 w
   1 j7 p& t1 F9 `4 F) w
   mcbsp_cdev=cdev_alloc();
; j0 Q2 Y. R$ j0 b   $ c. ]- c; Y; ~0 o
   if(mcbsp_cdev!=NULL)' O, u# A3 j: }5 W% C$ C0 C
   {
% T/ O+ m% H) p5 z; S. K1 _: @) D      cdev_init(mcbsp_cdev,&mcbsp_fops);
; v" V. ], C/ y  B9 u3 W      mcbsp_cdev->ops=&mcbsp_fops;+ }! a2 f& G. x* p& a
      mcbsp_cdev->owner=THIS_MODULE;
1 U3 w; x% B4 M0 K- ^5 U      
7 {/ R. E5 E- |1 M" f, L      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
* W9 ~; }3 a% p1 u$ [, F          printk(KERN_ERR "register cdev fail!");
* b- s$ H8 K* W  ]      else- O+ p" T; V1 O: p. b$ Z
          printk(KERN_ERR "register success!\n");
' L/ s2 {8 M1 t0 T( k2 g0 p3 K0 r   }
# H/ ^( @1 [* g7 n: V   else5 b; G' |, ?! r+ x
   {
7 X' ~( j$ s& w5 z      printk(KERN_ERR "register cdev err!");
4 k3 x/ ?7 G$ q4 O      return -1;  ^' l0 I! R7 N+ m5 u5 L+ v& ^
   }8 V) P% j9 b0 b- }. {. X  s
   ( t2 P- d6 ?" \/ }# V& l% g: `% ^
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) h$ B6 F7 C; w6 _2 d$ B& P: H0 c1 E
   if(IS_ERR(mcbsp_class))8 p, U& k1 `- I% F2 Z
   {0 c; N% I0 [, P, v
      printk(KERN_ERR "register class err!");( b: S0 m# E- a, D3 _
   return -1;0 l# T' m. a6 }$ v- @5 ^( N
   }3 \+ c$ G% b2 x5 Y8 g$ V$ N+ l$ d
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, Y3 T7 B# ?, i" ^! {, ]/ \9 k8 r
   //PSC' I: s; @/ B3 i
   //add Enable MCBSP
1 T0 h5 c& z, n* y- g/ A. k# K$ C   //test
2 _& X& x7 @) e' l( D   temp = 0x80000003;! ^/ e3 E+ X. k! Q
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));  k. M' |5 B6 x; U5 {! m4 K2 H! I
   temp = 0x00000003;
% y* f+ b$ Q+ a, ^% r# N   writel(temp, IO_ADDRESS(PTCMD_ADDR));
. E6 r/ h8 ]" l5 f$ Q
1 T0 I' \% L! \$ H( W* k   temp = 0x001FF201;; o: _# y0 D- Q3 j$ W  K2 l
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));+ u3 p+ C0 J" S1 r: m% D9 [
   
' H& k' m0 x7 X% a& t, @* Y1 j   //PINMUX    d  }; e2 E3 U  D3 R2 ?7 X5 F5 p
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
, y( n+ W" U, m3 E  f' m( u3 r( ~   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  / @! |* j+ p# V& b; K  b+ V9 [& }
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
: T! U; q8 N7 j1 J6 i' @) h) ^& ~   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( h/ i$ W0 b% b+ H, T( u2 s4 m8 k& _0 Q   
: |6 @. _6 x$ U8 W   //SLEEP_EN,EPR,L138_SHK1,L138_RC
& l. W- B- @3 o( a5 ~3 I& B   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  % K6 n8 |/ I) L& R* p: s# t
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
+ K, ]: w* i4 o) b0 U9 H   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& u# C: N/ ~, @1 P2 }1 e
+ h" k4 X) F* z; \( P   //RESETn,L138_SHK2
% S: `% u. e8 @& b% j  a% Z( N   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  # Q6 B( Z; _' a" ?8 i, E. C
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ' Z+ q& Z8 I5 v$ P
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 Z6 r- @. ~2 }' O& W , `+ G" a4 ?3 k2 |) P; |! z

& x$ _( {9 Y4 u6 V3 m0 ?. p+ W  //SPCR Register9 d; z4 B0 }6 S7 w; a0 E* P3 D) T' K0 [
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 K( W# `6 x* M2 K% q  temp = 0x03000000;//(DLB=0)5 E- p' W7 c) E, u. Z
// temp = 0x03008000;//(DLB=1)0 O+ x6 Z& N  j8 ^/ _
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
* f4 V) q; }$ q0 A7 W" C  temp = readl(IO_ADDRESS(SPCR_ADDR));( }- b. j" p) P0 F% D& r
  printk("temp=%x\n",temp);1 u6 ^6 a: P1 V5 m- S3 T
$ t! P8 ^  a3 g% M5 |* V; t
   //PCR Register+ t9 i! t8 d* ?4 h1 Z$ K# h
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( P' X) _$ @1 C" M6 m* ~5 t- o& ?( V  // temp = 0x00000F0F;
8 Y8 r4 a; p2 q% }0 H  temp = 0x00000B0F;4 g3 J' G! i2 P! U/ v  s! |
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
4 }/ y. B% L% ?' ~4 `- f2 G  temp = readl(IO_ADDRESS(PCR_ADDR));8 z1 H0 _! p+ d" L9 L0 Z
  printk("temp=%x\n",temp);  8 R: ~0 U' T3 Q3 {
   //SRGR Register% N$ N/ P7 ?& M: |
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
7 t: [8 R2 ^1 y3 P! v$ U //temp = 0x301F000B;# x: y5 M- G- K- j% V% N; R* l( g
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
7 ]( A- ~. g5 ]6 L  e& a  temp = readl(IO_ADDRESS(SRGR_ADDR));
1 a6 d) k4 E* h/ h& g3 ~! ~9 Q; Q  printk("temp=%x\n",temp);' N9 v$ B. U" J$ ?/ ~
   //RCR
- v1 A! a3 o, L" ]   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! j! P4 R- R; w
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; A! x/ d" Z2 I1 k
   temp = 0x00440040;
5 D* [( ~  }+ D6 g9 H6 n   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
) S4 ?$ j( _8 |+ U" }3 @3 Y   temp = readl(IO_ADDRESS(RCR_ADDR));7 l0 d+ ~# S1 l
   printk("temp=%x\n",temp);+ F- }6 y9 j' j( e* w  u: b% Q
   //XCR
& g/ w: b+ X% V) d: [3 k5 j* w3 T   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
3 M& J) `1 p) x. B% ~   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
1 Q% J2 m- O) N   temp = 0x00440040;
$ O; o* X2 w8 [# v  ]   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
0 E6 {( k4 f. e/ c   temp = readl(IO_ADDRESS(XCR_ADDR));
$ b9 {  s. a. I+ D# d$ u/ _4 {8 a   printk("temp=%x\n",temp);, M/ P( V" X9 P# W2 }
  udelay(100);
" j" y3 t2 c/ B% _4 f2 R  //SPCR Register- n; u' l; Z9 j6 G* }9 p% h
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
3 G" x6 m! y% v  temp = 0x03C10001;   //DLB = 0 VS DLB = 1' E8 ]. l. L( Z: J
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled7 \& c' I) O( V
  temp = readl(IO_ADDRESS(SPCR_ADDR));
  M$ I" B' t  ?( H; S  printk("temp=%x\n",temp);
( [/ t7 W- V# Z- U, z  udelay(100);9 K5 U, v; u, l  Z
5 q8 h9 a" v7 g7 D- M1 |. Q, Z
  //set GPIO direction
+ \) E- K' L3 N   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));1 f! T) Y; B; M- a
   temp = temp | 0x00000100;//EPR----input9 g' A$ M& p( E
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* |' w1 A3 t  w" C2 ?
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 F/ F4 v* G" g! `  R7 X 4 Y/ M+ E3 Y+ J$ a0 R" F* q. t. n
   return 0;$ |8 P8 P, L7 J, @' u( x2 }
}: Y3 s4 p3 L; n: f# d+ n
static void __exit MCBSP_exit(void)
# y, a3 J0 A' M$ O0 i{8 U# U2 K$ q) X0 u" S8 f  _
   printk("mcbsp chrdev exit!\n");2 P% ~0 C) l) n9 |% a% e7 F
   cdev_del(mcbsp_cdev);
) T9 i/ W2 h: c" v( S  K; C   unregister_chrdev_region(mcbsp_dev,count);
! D1 h6 S+ U% B# z   device_destroy(mcbsp_class,mcbsp_dev);
" F$ Y# Q( O; a1 M9 Q4 {   class_destroy(mcbsp_class);6 x& y0 H$ ~+ t- X! H
}
$ w& y1 S( C" {% L4 A6 N# kmodule_init(MCBSP_init);
1 {5 I" j! s- E. U9 o, e' a0 N0 n" bmodule_exit(MCBSP_exit);5 z; P" X. `5 f2 v  e

6 t3 c: `5 w5 O$ ~MODULE_LICENSE("GPL");
& Y& e. s  d# K. V' M
, z- w; k. C9 D8 f) ?( U4 g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
- s  F7 W0 @$ `0 ]我的应用层的测试程序如下( i9 E7 W/ H. v9 G. f: N
#include <stdio.h>% j# T) X. q  Y# A# h6 S  e: O
#include <string.h>$ ]- b0 U, X: D+ D+ S
#include <fcntl.h>2 m( j; F" z# Q$ M: o; O9 w
#include <unistd.h>
& x* Z3 u1 @6 g9 C3 B#include <signal.h>
2 r4 |/ ]& f4 I) e% r' R#include <pthread.h>       //线程; B7 P/ o% y8 F
#include <stdlib.h>
, ?9 S3 i6 u8 S1 @7 V) H! p% u. q#include <pcap.h>          //捕获网口数据5 \; V" T( M% v6 n0 k
#include <semaphore.h>     //信号3 w: z4 Y- A: Z* M2 {/ O' e. ]+ p
#include <sys/types.h>     //消息对列
1 L3 u: b" R' d; `#include <sys/ipc.h>       //消息队列
0 J+ T/ l# t, H) u#include <sys/msg.h>       //消息队列* J1 i& Z" W( h+ L& E' R. m
#include <sys/select.h>
$ K' y9 [% w9 }2 r# l3 e; B#include <sys/syscall.h>9 g1 Y3 J  ^: n8 `  `3 u
#include <sys/stat.h>/ X( I9 Q8 I2 j9 [/ K$ F* }' f1 w
#include <sys/mman.h>9 \( Q, \1 q( o% |8 N/ q
#define msleep(x) usleep(1000*x)
2 T5 _) c- |5 a" a6 x
  E) ?5 ]4 O+ ~( V) Xint main()
" Z! p' ~3 R) d7 I. x$ l{
+ T6 c8 i- Z, i8 T3 Z7 F    //MCBSP,ARM与AMBE2000交互设备
  m$ d+ ?/ _& H! l2 c% G9 M- R5 d int fd;
. d% h$ D; Z+ e# x3 Q( u; O, [0 N unsigned short data_write = 0x5555;8 W# x! h: S' L: c7 f/ O- l% ~
unsigned short data_read = 0x00;
; n* l3 W* s1 t. I% a% }* ^1 ?  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);0 v0 r; R3 [3 J
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
( c& B) _  M6 ^$ Q   
' j8 I' C$ N7 W+ K  if(fd < 0)- J4 L9 S! E" W9 p/ U; o1 A9 @
  {. O4 j8 E, ^( d2 C9 N
     perror("open failed\n");
; o" j0 C3 M1 i+ p( k0 N     return -1;
4 L; C' N/ _/ f' O( h: y; O  }% a( u4 }2 t% s$ n5 R8 d2 D: s
  
$ v; v: I5 ], L/ X  while(1)0 U* N& ?% {$ A- }) t9 h3 w
  {- k; t1 {8 D- A
   
0 _; B- ]$ Z+ F* s   //AMBE2000每次读写是24个字为一帧) X2 h5 e$ ~0 Q0 p  i0 m' E( {
   //写数据时将数据在底层存储起来,等到中断的时候再发送
/ h7 g% e) P' B) \) j   //AMBE2000输入数据是以0x13EC开头的2 i  Q2 z6 p0 C+ H8 S  B' L; R' P
   write(fd,&data_write,sizeof(unsigned short));
, H3 z  N- d+ P7 B. S   
# W' f8 E% ]1 l1 ~& L* u   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  $ m, ?2 c6 l, U$ g- c' c2 ^0 j# H
   read(fd,&data_read,sizeof(unsigned short));
, }% \$ F. O) o$ Q   1 N; m! O7 N0 ^: ~) g
   if(data_read == 0x13Ec)
3 a% G; C6 m9 l8 S+ d   {
0 @+ S0 v+ [& `( O2 n   
" x% V$ T, M( ?- E& l    printf("data_read = %x\n",data_read);# g0 m# i. X/ C& c+ [2 t% }
   }! P. C- F$ |6 A! l
   ! h) o1 e; p' C0 q4 D# J; N1 ^; Z
   msleep(10);7 x/ i9 Y: }3 T! f7 ^
  
- g0 H$ s5 l2 @- b& S( p0 [2 q) q3 u  /*; f9 z) P  y6 e/ L- A" E
   ioctl(fd,1);   
) _1 ?. J, Y2 {9 s4 v8 @% N3 u sleep(1);* U& C+ H- M" K. \
ioctl(fd,0);
6 D  c( g. {; S7 `. w4 O sleep(1);/ p, e3 O7 U9 x
*/ # K& \5 z4 Y! G) {9 s& t" W7 ^
  }   
. \7 B8 A# ^( u return 0;
+ [# Z% n7 h  b0 J& j * k2 w" |% P* G  E  t
}% B3 k/ D2 O% o

* y# i* `2 t( h) X多谢各位指教,谢谢! 急( ~2 n. Z) b6 ]0 E+ w7 P$ u/ T
- E2 k( n9 R; `% b

' B3 ^: L0 X) e) J6 G" d. ?8 n. @# c" p

- W4 b  I. Z( A
8 k8 @/ B& p; \% z1 C




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4