嵌入式开发者社区

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

作者: gaocaimary    时间: 2014-10-16 10:58
标题: McBSP时钟、同步、数据线不正常
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
. r: P- ~5 r' b& c/*7 h  \" X( W9 H) R" [7 k
* Copyright (C) 2009 Texas Instruments Inc! L. Y1 s6 p, ]; C
*
6 E7 A# T0 L/ G' e9 v. A) ? * This program is free software; you can redistribute it and/or modify, n/ E" a7 l* S' M) p( x
* it under the terms of the GNU General Public License as published by
2 V. o; s9 o" s8 y& y' o * the Free Software Foundation; either version 2 of the License, or
8 Z. k: H. c6 j) {, K * (at your option)any later version.$ f* o/ J5 ~3 [* l6 k
*
8 H& q5 H9 F2 u( C5 [8 a, X3 k4 y * This program is distributed in the hope that it will be useful,( i; u; Q( R! I8 a. ]/ u
* but WITHOUT ANY WARRANTY; without even the implied warranty of
$ ?+ ~. c' P$ m4 n. N7 T4 L * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 }8 R& H) T3 B0 N' Z * GNU General Public License for more details." W1 A, s. w' I/ V7 U0 _, k
*
/ e3 U6 z( Z& M) a * You should have received a copy of the GNU General Public License
! y" ^5 h. U, ~. Y( v, T * along with this program; if not, write to the Free Software
+ {0 l% b. L: F' x * Foundati
" ]$ _+ Z1 K8 s' v/ |0 ?% e: v*/- H2 |9 ^- W0 @+ h4 B) c4 z
#include <linux/module.h>
- k" ?6 Q# y! f% e! O#include <linux/init.h>/ M9 W9 K9 _) ?) N1 I5 O
#include <linux/errno.h>
9 p* G6 U0 ~% {2 p- |8 B#include <linux/types.h>4 I2 R9 \$ |, V# y; r
#include <linux/interrupt.h>; s4 e* @% q0 H9 d, V
#include <linux/io.h>+ v' E& Z# ]$ k; @) H
#include <linux/sysctl.h>
1 E2 f' \/ n5 U' T) o0 p#include <linux/mm.h>* {6 c. D& h  m* i; t5 }
#include <linux/delay.h>8 E9 D% c3 H: P7 S: P
#include<linux/kernel.h>) ^$ s. q4 p5 V
#include<linux/fs.h>
8 b! L! v0 B$ v& Q. G0 i' }( D9 [#include<linux/ioctl.h>$ M! ~& Y9 d6 e+ F
#include<linux/cdev.h>7 B# Y5 [; k6 |) u- ^+ G
#include<linux/kdev_t.h>
  O# j  r3 V; Z4 ^#include<linux/gpio.h>: @# E/ W' h+ I* ]3 e2 m
#include <mach/hardware.h>
- n3 q% ~- L) L$ T+ {( H#include <mach/irqs.h>1 E% |- p+ Z. J% T" k. I6 r

: W0 B. X/ `* M* E- L; T" S#include <asm/mach-types.h>
" s/ @. ]3 U7 b#include <asm/mach/arch.h>/ V" }. s! B0 }, X* D
#include <mach/da8xx.h>
2 x) `2 `% `/ Z' f$ x/ o#define  SYSCFG_BASE   0x01c14000# [. ], F3 _5 k/ U
#define  PINMUX1_OFFSET   0x124 % I; R  |% @& {  H8 n7 Z6 N* D
#define  PINMUX18_OFFSET  0x168
3 S# M/ ]7 e; S5 b' L, K#define  PINMUX19_OFFSET  0x16c
- i, b3 r; b: A#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR# K  ~  B" X2 a6 }9 y. }: j2 J2 A
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR% d. R. x& |) q3 C9 C: ]5 P7 [
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
5 R6 x0 C. v' v$ P( ]#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
& h3 Q) M" a) F; Y# N3 a#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
" H. k% H6 w$ l. N( M                           
- v) i, P; I% o2 O* o4 S: T& {#define DXR_ADDR      0x01D11004  //MCBSP1_DXR8 ~6 V$ s- _2 ~$ H: ]1 g& C" I
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR  S( r6 d! G/ ?3 t4 c
//PSC3 n8 m/ `" m2 i: P: W
#define  PTCMD_ADDR   0x01E27120  
8 G+ H+ N0 ~7 d9 R  G$ J#define  MDCTL15_ADDR 0x01E27A3C3 k/ u4 C- P$ G# _* g
#define  PDCTL1_ADDR  0x01E273043 L) o, _9 Q6 J: y; \" r
//GPIO8 direction
# `3 F  o& j- V6 Z# q#define GPIO8_DIRECT  0x01E260B0
) n, R/ [' o' V; L4 H8 L$ m# B- u' Z#define GPIO8_OUT     0x01E260B4
' {3 o' K' q' R% d$ |+ h#define GPIO8_IN     0x01E260C03 }4 {  f6 S; N

; {6 G: p& K: g) _//#define MCBSP1_RINT    99              : `) h; X& Z4 Z' Y+ |
//#define MCBSP1_XINT    100  ! s: M; R" Q1 b6 t9 [' `' w
static int MCBSP_MAJOR=239;: J0 V2 r  s* l- N! V$ |+ E' ]
static int MCBSP_MINOR=0;. {) o) g2 m( Z0 p
static int count =1;: U- l2 [) d2 h5 B9 P
* ?: H+ I7 q! O3 K+ h* h
#define MCBSP_NAME  "MCBSP-device"
) S0 n' p* F) P. F) g
3 U- m; w0 K5 r/ E5 K* G1 hstatic struct cdev *mcbsp_cdev;" {" v( U3 j" C4 y5 N) a
static struct class *mcbsp_class;) d9 p$ x/ E" D# L1 k
static dev_t mcbsp_dev;4 H1 y9 G6 H/ ^4 h
unsigned int DRR_data;& T, _$ V. K) [" G7 f, d. o; c
unsigned int DXR_data;
) j. e5 W- I3 c2 O  W" Hstatic int mcbsp_open(struct inode *inode,struct file *file)  W5 e! A% @! D! n; m7 o' o
{' o: y0 ]9 ]& M/ G, x7 N, C7 n; W9 I
   
8 K; n' l4 @6 w  {   //interrupt enable,initialized
5 o% [; E! w$ R; n3 ]8 ~  A  V   unsigned int temp;
0 c% ]9 A+ j0 \   //SLEEP_EN(GPIO8[10])---0
/ V7 E$ h1 ^: u& s4 h   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ l7 M7 l& |  _7 Y
   temp=temp&(~0x00000400);- _, k8 H& ~* z8 a; G5 E* ]
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
7 D1 m( A) B  j! |0 U5 @( C3 s  //RESETn(GPIO8[8])----0----1
. B. i1 F6 a+ G( P' u   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));% ]6 ]% I2 J. v" t
   temp=temp&(~0x00000100);
+ Y6 k' {) n2 m' p2 W% B# M8 Q7 K   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. F: }1 X/ y. Z8 n. @& V
   udelay(100);2 q7 d, v# ]6 U
   temp=temp| 0x00000100;
; _! J$ L3 q# `: S* q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---18 ?8 W7 l8 ~2 G$ r
   udelay(100);
  a4 @- u- L0 w8 y1 s) z3 M   printk("open success!\n");
; r" |5 V% W- H  b. p+ f& J   return 0;, u  @) h& [2 L6 D* ~( g
}
" e8 T8 N$ w% _  |
! h/ Q( ^- X( @! pstatic int mcbsp_release(struct inode *inode,struct file *file)" z  x6 t8 p; g7 o! x# g: i
{
! W# i" r2 m7 }+ V4 Z. ]2 k   printk("release success!\n");
7 x9 p. y6 t. l6 U; e7 ]   return 0;% x* Y' Q( g, M' |9 r
}1 w5 r7 Q  x  {% A3 F; A

3 r) Q3 @# l: m! s" h0 Cstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)- _( ]1 n. C( W; X4 n. P' v
{
  t5 W0 J# i& o$ |    copy_from_user(&DXR_data,buf,len);
3 R7 g1 }# y  t6 D. ~    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
4 D7 o: D/ r" p' ?: V2 [/ C% Z% S6 z( e    return 0;! w3 L2 n. t6 T8 F$ G+ g: V5 q$ r

. Y- w$ z# S8 u# @$ W7 g' f}* D2 g2 {  {3 i" J7 \& v+ G: H6 x5 K
  {7 t% |6 B2 D
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
- r4 v7 o8 D* n% I0 Q{ 7 @9 y! |9 K$ ]6 D
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
6 [/ q+ M* `6 I; C   copy_to_user(buf,&DRR_data,len);
) C8 ?6 g- R- L% m   return 0;
2 L- r* k/ r1 k: s, S$ g  N6 r& o}0 N+ P) O9 Y- n8 [9 @3 S# t9 g
1 h. u: Q8 J5 w7 `- Y1 |9 }

$ R  Y- X9 [  ?/ u2 S) l5 p0 r+ Pstatic struct  file_operations mcbsp_fops=. G% g- _- ]. R0 n
{
3 k8 \# j1 g( u5 i   .owner=THIS_MODULE,* q. I7 p6 P7 Z( O
   .open=mcbsp_open,; J/ \7 l  ?( p3 ~+ Y5 f
   .release=mcbsp_release,) m1 D3 e1 D2 n2 g% M3 N
   .write=mcbsp_write,
0 b! ^: V) R7 |/ b$ |   .read=mcbsp_read,/ `, ~; H$ Z/ B1 a7 M8 _
};
0 V8 [6 \/ S8 ^' bstatic int __init MCBSP_init(void)
1 w- v1 W; S3 K6 {{. I4 q2 R  E3 a5 h0 ~% E
   int ret;
. g+ K0 w' ]- E1 c" |   unsigned  int   PINMUX1_REG_old;9 |& W$ G! X# y" b. Z
   unsigned  int   PINMUX18_REG_old;
1 b4 S0 o0 w- [   unsigned  int   PINMUX19_REG_old;
: Q* j6 g; G9 E3 }% R; r   unsigned  int   temp;  
- D# J, M& v& A0 J8 l  x; Q   if(MCBSP_MAJOR)
. R' O( X  y9 F* N9 @   {$ {. @! M4 N" u% F) x  B
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
( e3 N9 z8 z: T6 B5 U$ j2 L; Q: a2 h      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);8 L) |: K+ }" e9 S8 l' F
   }
9 }) E# }* B+ m, r   else
  Q. |, q* Q3 ^9 U8 K, M) F6 P) j   {
( Q* G0 w! R5 E) J' q1 j0 H1 Z      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
% ~; H0 t% `. r4 ^4 m4 S' B; T, c      MCBSP_MAJOR=MAJOR(mcbsp_dev);" h6 H2 C7 Z' C: f+ g& \0 F2 @% J
   }
1 ~& H5 O, ]" _   
0 K# |8 I# n* i- o" S   if(ret<0)9 J- R. ~& b1 c/ }# R
   {) g4 a& K; y& R% n) U! K
      printk(KERN_ERR "register chrdev fail!");: s, V0 X6 d9 ^! q( Q& z
      return -1;
( a1 M1 @( i6 D" {3 c, v   }. b3 u& S+ N4 H' E% z
   
( s1 m2 h5 N% c+ p' C   mcbsp_cdev=cdev_alloc();* H8 g! z8 Q# U! @; F
   + s7 ?4 `3 W' e9 d7 C4 A
   if(mcbsp_cdev!=NULL)& a6 A; f4 B  d% G
   {* q+ M' a3 {, [  r
      cdev_init(mcbsp_cdev,&mcbsp_fops);2 [: k4 E8 P; `/ K2 D; E" O/ H
      mcbsp_cdev->ops=&mcbsp_fops;
9 r' c0 n* q" j( w9 J, h      mcbsp_cdev->owner=THIS_MODULE;
) L1 `4 F  {' x2 E9 l      
! a8 s$ }2 `8 j      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
+ O3 G& e0 F, P          printk(KERN_ERR "register cdev fail!");' c4 c& k: \" L. L: I# s
      else
/ b8 T& z$ Q& m5 `- x          printk(KERN_ERR "register success!\n");
) D1 U5 I( c( v# q   }8 F- D  j' Y3 X1 m& D1 r1 L2 w
   else8 i8 p# v, Q* F0 D
   {
  u& p( P% w( u' ], z' U9 B      printk(KERN_ERR "register cdev err!");
: y; Z( [3 t1 J! E5 L: r, z      return -1;5 }% \! F3 Y' X7 Q6 `5 }! M
   }3 Z2 w& Q* j  }' _
   
8 B! J% y  b9 x( ]0 h* {  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);6 Q! I& x. W# `. X1 y# d# Y5 N! K+ L4 P
   if(IS_ERR(mcbsp_class))5 r0 B) X5 A- o! _/ V+ ]
   {
" f- b, }; }  b: E! _      printk(KERN_ERR "register class err!");' d/ }+ g, X0 I& ^
   return -1;$ _# |: a' ]: l7 ?0 v
   }  a, w! C# T2 d4 w( N$ i* h$ R- ?
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
2 X+ \0 q, [% r" l) z7 B; K& D3 b
3 C0 G/ t. _5 L   //PSC5 q6 \5 Z3 @2 K
   //add Enable MCBSP
3 u& w  t# h' A1 l5 T6 a, g& z! f   //test" |, Z& n& H4 I; T
   temp = 0x80000003;5 D" v: u, d  c* I, u
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
7 I2 c7 l" S2 M& q9 q   temp = 0x00000003;+ H9 o2 S6 B7 A- m
   writel(temp, IO_ADDRESS(PTCMD_ADDR));( q5 b1 ~  e8 Q4 `3 C0 R5 t
! K5 z( p; n9 v# p+ g& j: X( S
   temp = 0x001FF201;. Y2 B& [+ q: Q( [
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));: y. T# Z( A; N! L3 J" f9 H
   
% e  K% Z% i/ c. v: v9 E) w   //PINMUX  3 t0 m! |* S, A+ S9 ]3 R+ \6 i( |
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR," b7 H- K8 R/ g+ i5 k
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
  A( }: w" U1 _5 K/ R! g   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
7 {! \9 y* C9 @   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 T) u5 B7 G3 |- K4 I4 |   - E0 E1 `8 C# S* |# E( `" [. K! J
   //SLEEP_EN,EPR,L138_SHK1,L138_RC: l0 y% U& E$ F% @" z3 G; }+ @
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  1 r! h5 @+ k$ [- b' |, x
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   - }, v. [$ f0 {* Z' S! K
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);8 i  C. ]# X- v, L
4 J% F" X0 w/ f: c. ]% _$ L3 @
   //RESETn,L138_SHK2
7 G; R. K2 x  v$ Q( l4 A   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
5 ~/ W& F8 k: m! [0 n, {' N   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   8 i6 ]  |8 k& ]  }: p" G% ^
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 L+ f) G: r4 T2 t
- u6 J8 t- Z, X4 Y" H0 j 1 U( I5 T. {. k6 F' Z
  //SPCR Register
0 f% N6 \$ A: N4 D4 W$ p( a# \  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset7 [$ x5 G7 K- E# s+ g
  temp = 0x03000000;//(DLB=0)6 A) \4 [; u7 X1 J! ~) M  ^! P& E
// temp = 0x03008000;//(DLB=1)9 E4 G5 C( W9 o3 i
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset5 \* O' i( K. q. \
  temp = readl(IO_ADDRESS(SPCR_ADDR));( Y: f2 F( k3 K. G' @+ c: n3 g
  printk("temp=%x\n",temp);
# Q1 f9 ?1 B0 l2 J
& N; T; x) }. ^, j   //PCR Register3 M" p( V+ j# Z& c( T( U5 p9 B: n9 b
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
# ?1 R3 ~3 n# b+ b. l+ O0 ]  // temp = 0x00000F0F;; R$ s, }( v! {, m8 [! {% O: j" H
  temp = 0x00000B0F;
( \/ }! M& P+ L  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
2 R; T- j  x& r+ `, B+ }  temp = readl(IO_ADDRESS(PCR_ADDR));" G" b# a2 b9 P% U
  printk("temp=%x\n",temp);  
# w* X1 [5 m$ A( G- Z  H   //SRGR Register
3 R9 y- P% }9 c8 m, b- F5 X   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
* p/ s$ E( q9 [ //temp = 0x301F000B;
! J3 {, [0 T9 N; H# X$ W/ G   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 4 W4 ?! x  c, \1 u( t$ L+ o' u  ]
  temp = readl(IO_ADDRESS(SRGR_ADDR));
% q! g6 p& ^$ F3 h5 L" |1 r  printk("temp=%x\n",temp);
# @. `$ i. A8 [  U   //RCR5 c$ N* ?/ Q7 r
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,% _1 p1 X) j1 k" q8 Y
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
4 T6 h% x, l; F   temp = 0x00440040;' q1 s7 W1 C0 y! l$ J) h( Z) c$ n
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
/ v) ?+ h8 C% |+ G) `   temp = readl(IO_ADDRESS(RCR_ADDR));* c3 _) |. g" z8 U/ V) Y( p
   printk("temp=%x\n",temp);: C# D6 \, X& c" R; m
   //XCR
) K( \2 A6 S8 B   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-14 O2 Z5 [, o8 a% I1 @
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
; a- O. ?- [' ~7 b3 z# d5 Q   temp = 0x00440040;
% f4 G3 s/ b& D* K$ ~( s   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   : s3 K% d( t' i+ ^. N. Y+ i( u- D
   temp = readl(IO_ADDRESS(XCR_ADDR));
) b+ x) F! X9 g7 H0 D& r# b   printk("temp=%x\n",temp);
* v# `  ^/ p. c/ @  udelay(100);8 w' [, X. J0 j# u/ w
  //SPCR Register5 T- r0 _' i6 G9 B7 J& _% _
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1( D- l! _; H( a9 v2 D$ U" |
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
; e- q4 ]# N$ J# A( N  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
) S% {% z& Q2 f; ?9 V2 k  temp = readl(IO_ADDRESS(SPCR_ADDR));2 p$ a: s# ?* B  E
  printk("temp=%x\n",temp);
( v$ p7 K  B5 }# f! y! i  I' _  udelay(100);
; {/ }4 a* B6 Y) j6 X
( Y- G7 b6 r8 l4 j  //set GPIO direction
* C' ]  T7 g/ C- ^   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
+ Y6 x# i4 P* c9 f+ E- ~   temp = temp | 0x00000100;//EPR----input
4 E. ?! i, I9 I' V   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output2 J4 c% @/ ?/ {' t) `
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
' C2 H% M2 a' K( o3 a4 A) A % B, m% U* V" f. A- N" a/ W/ i+ D
   return 0;
$ M, e! h7 [: y2 u: Z: W}2 z" k6 W0 o; V2 a! T$ L
static void __exit MCBSP_exit(void)3 N& M: ?+ @: @% \
{! b2 ^( y. t$ G1 s% ^' c
   printk("mcbsp chrdev exit!\n");$ o: W# `- m- [. I! b" A2 ]
   cdev_del(mcbsp_cdev);% X4 M% V" ^5 u- l. R; D
   unregister_chrdev_region(mcbsp_dev,count);
' L/ Y) F( Q5 b  p   device_destroy(mcbsp_class,mcbsp_dev);
; t1 @& p. ~. G6 P7 ^   class_destroy(mcbsp_class);- l6 b- n7 P) W! ]
}) ]) h( a: Q) I& T3 K# w8 _
module_init(MCBSP_init);
, W2 U1 c) z: w- R, G/ Y9 e7 Dmodule_exit(MCBSP_exit);" ^8 K3 X! K4 {! d7 y4 z
3 ]6 Y3 `( n: |" s1 m8 b
MODULE_LICENSE("GPL");
& b9 D9 R- G6 R# T3 [0 X/ d1 F7 [1 `1 A; ]% d5 G
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。8 y3 V. v3 L# L' U8 l, Z+ N
我的应用层的测试程序如下
& I9 m! j9 q' x" e1 e* \5 D' X& i#include <stdio.h>1 [" B. k8 a6 C6 h) H
#include <string.h>
% }' {4 V) L% V* M; A) i/ O1 @" s#include <fcntl.h>
6 j9 \% `8 E/ u9 g1 c( y! ?( v#include <unistd.h>7 H2 |. X6 @3 j) F
#include <signal.h>
; y6 U3 P& R/ r; K  ^#include <pthread.h>       //线程
: P1 }7 p/ Q2 O" Z) J5 `#include <stdlib.h>
! L& C+ ~- x; z' `#include <pcap.h>          //捕获网口数据
- j! I+ F, f% \! c& v#include <semaphore.h>     //信号
7 W! v. N, O  [1 Y0 J) t! R  a#include <sys/types.h>     //消息对列
7 U) {$ O. h0 R; _% q#include <sys/ipc.h>       //消息队列
4 ], E  [- M9 a+ ]$ n#include <sys/msg.h>       //消息队列( I+ Q. a' c4 ^1 C  a3 h
#include <sys/select.h>
. n- e  s. u% A( o0 U5 V* k#include <sys/syscall.h>
4 Q. R" ~! b1 I#include <sys/stat.h>0 \  j" J1 L) Q5 ]+ O9 D
#include <sys/mman.h>! L2 M1 q% P5 a" @: a! ^
#define msleep(x) usleep(1000*x)
# Y8 a6 T9 p& ]
5 I4 {: k$ _1 T* c$ sint main()! K% D  \1 O# T, c  v' M
{ 5 v) z( Z3 _& M' a: j+ i
    //MCBSP,ARM与AMBE2000交互设备; n" s( |7 N# Q# v) I
int fd;% w" n$ E* t" t7 X
unsigned short data_write = 0x5555;- c9 I$ \5 Y; Y! h0 @
unsigned short data_read = 0x00;; s2 `' o5 C- J* w9 E
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: _2 Q0 q) n9 \) p4 g; |- o //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
8 q4 l( E2 P) B* e    8 Z, K- e% ~% t7 m3 a: ^/ F: x
  if(fd < 0)
" }3 f( B. V) x: m' E  {  ~; Z8 p& [  j5 E% P1 i! j
     perror("open failed\n");5 Y$ j* t  B* h, A
     return -1;- p. X  y$ f$ `! e
  }
/ ^; Z/ a4 D9 a    n) U, O% W, b8 F$ x
  while(1)
% U9 V7 B" D/ _1 P  {
" }' v# J3 B( b   ) d' k3 H% U( Q: j) V
   //AMBE2000每次读写是24个字为一帧
& ]1 A0 t2 N+ ^6 [* l; q   //写数据时将数据在底层存储起来,等到中断的时候再发送+ G, s, s4 T/ A
   //AMBE2000输入数据是以0x13EC开头的4 J5 D  M. q+ h7 b, W# j9 b+ [
   write(fd,&data_write,sizeof(unsigned short));! S: Q! K* n" {( A
   1 i, v# u# ^3 M
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  . V* l4 a% `$ N2 u/ p: z
   read(fd,&data_read,sizeof(unsigned short));
/ p6 G$ {; C  {: n/ r( w   
( g# c4 j% v  h2 o9 E   if(data_read == 0x13Ec)  l+ j& d% W  E
   {; z2 H9 N# W# g6 F! K' w8 m
   
& p0 G9 w# z, {) h  x$ v    printf("data_read = %x\n",data_read);' D0 P& v1 }; U/ n! h
   }+ N* g7 \8 q& K+ j2 S0 s
   - O7 ]+ f5 R1 [5 }
   msleep(10);
# ?! _" f, O3 k8 c: @  - \+ K4 h0 H2 n
  /*
. G& P) z8 I6 H2 R  l" c8 w% u& n7 E   ioctl(fd,1);   " I8 a1 i, P3 q6 z5 o  l
sleep(1);! v! x* w* j% H8 \2 r2 E
ioctl(fd,0);0 g0 R0 w0 w- u% @( }' I
sleep(1);
( D* A) W" K( V* ~2 n8 e+ E */ ) ^4 X. M4 S1 W
  }   
; q( I# ~4 x9 l return 0;: v' ~1 i- Y) @4 E

" y. m2 f, ~* G" C}7 _' l! _) S! {9 u2 q# `
: p! h) Y; ?6 [0 ]; K1 E
多谢各位指教,谢谢! 急
4 S2 o/ \5 x2 v& i; l$ V: Y2 @# @" h& Z  ~* n
9 F5 D' V/ d8 p: Z: T0 M$ `: Q3 e

! u4 s5 Z$ K. [# K* z# v, t' A  `8 e0 H" w9 t3 v
8 U) a6 N2 w6 f$ y0 |( b





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