嵌入式开发者社区

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

作者: gaocaimary    时间: 2014-10-16 10:58
标题: McBSP时钟、同步、数据线不正常
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: , N) N, J3 K# y# F6 O
/*4 f$ ~) V- v8 R8 G6 Y% s
* Copyright (C) 2009 Texas Instruments Inc
3 e$ l5 {  E3 R+ K# I, ] *( E3 [) V( }* D  z0 N
* This program is free software; you can redistribute it and/or modify
4 J* c2 Y+ M5 J * it under the terms of the GNU General Public License as published by
7 l; E) h- u0 N4 e; D# P" Z. a) ~ * the Free Software Foundation; either version 2 of the License, or. g$ I* @* [1 r& Y8 P
* (at your option)any later version.# k& G1 l6 `& `! u0 w
*( C$ L% Q! {" i( S( N+ d  C3 {
* This program is distributed in the hope that it will be useful,% H2 i" N( z+ e
* but WITHOUT ANY WARRANTY; without even the implied warranty of
8 X9 j8 S# L& A* a7 f  \, [$ } * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the3 A* t4 E6 R& O8 W* R
* GNU General Public License for more details.- k9 i. V1 L: `
*- ~$ [! w- J& Y! h
* You should have received a copy of the GNU General Public License
7 X# @8 j: w) Q) y- o * along with this program; if not, write to the Free Software9 u# k+ h* p  F$ K
* Foundati
! l$ h+ S# o; W9 C*/
7 L+ u" Y4 C) v# _% `& Q, l#include <linux/module.h>
8 M9 N! E0 W# Y6 ~9 Q#include <linux/init.h>5 `9 X+ ?) B& b4 t  s
#include <linux/errno.h>
" {. r" P' t+ x* u' C4 _0 C( d#include <linux/types.h>
; \& B4 T6 U" z5 `#include <linux/interrupt.h>  Q5 {0 l' r( ?/ F, g. D$ y( `
#include <linux/io.h>' Y! s& j2 ^1 n$ a/ t
#include <linux/sysctl.h>
+ U+ L: L% `. k* w8 d3 B  ]! W#include <linux/mm.h>
" `. V- I. T& q. d& L5 M#include <linux/delay.h>
: B  ^' [+ J$ X5 A#include<linux/kernel.h>& c/ B9 c( w1 ?
#include<linux/fs.h>
9 k0 {$ ~. w/ K1 Y; ]1 E#include<linux/ioctl.h>) W/ c9 p( \- y* l$ b
#include<linux/cdev.h>
3 b' k( F# |! i# K3 [3 h) p#include<linux/kdev_t.h>
! ~2 |) s" V0 s. p#include<linux/gpio.h>
' q& C8 K# t1 H#include <mach/hardware.h>1 Y! a, M6 w0 E: Y
#include <mach/irqs.h>4 x6 ~! T  j4 V% [  Y2 D7 A
1 q) c+ N, X+ Q' c. O9 Y' E
#include <asm/mach-types.h>5 w% d$ U6 L9 H. W
#include <asm/mach/arch.h>
: ]* u& y$ S, P* {: [1 W#include <mach/da8xx.h>! G) {; C6 G- n6 s! D/ V
#define  SYSCFG_BASE   0x01c140000 V3 a- n- v- b- K0 u' j
#define  PINMUX1_OFFSET   0x124
1 \7 z$ Q8 u0 u3 S! h#define  PINMUX18_OFFSET  0x168
* W6 m6 I( g7 O2 G; o- n#define  PINMUX19_OFFSET  0x16c) g2 E. t5 z; n6 X
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR& f8 X  Y. E1 c' o  \* x. @
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR- Q" ]1 C! Q+ U& L" B; b6 P
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
0 J* v* I: P3 y3 {, U#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR6 F6 [- p* R8 S$ L  v- ]
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
, G) ^7 N7 g+ F! S3 l$ _                            " n+ H  f5 a. B% i7 N: N! U
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
* W1 k8 x2 g* E#define DRR_ADDR      0x01D11000  //MCBSP1_DRR: ~! |# q7 S6 v6 T+ T8 |
//PSC
# j4 U, P6 T! i" p#define  PTCMD_ADDR   0x01E27120  
& L+ p9 u5 _6 J6 x/ F( A#define  MDCTL15_ADDR 0x01E27A3C' P% W0 M6 `& \
#define  PDCTL1_ADDR  0x01E27304. `  V" Z+ u( K% ^, ~
//GPIO8 direction4 b0 f8 M& m# }! z/ u/ z6 z
#define GPIO8_DIRECT  0x01E260B0
! b$ U3 I0 F+ O' K#define GPIO8_OUT     0x01E260B4" t4 C6 ~! @2 V1 k
#define GPIO8_IN     0x01E260C0/ y% D; \) K7 C

1 v) i  v( W: i//#define MCBSP1_RINT    99              * f1 f' L4 P  t
//#define MCBSP1_XINT    100  * H: K; w+ C) y$ E7 w. n
static int MCBSP_MAJOR=239;
0 \: k; y. x) Y5 M" ]7 G: a7 Dstatic int MCBSP_MINOR=0;
# d! n, @( H- K8 l# b  D0 Ostatic int count =1;
- c3 d9 V& @6 T" N( J' Y8 `( d! g% |- C8 d6 g5 |- i! b
#define MCBSP_NAME  "MCBSP-device"
) _8 Y& R8 N* `4 v% j
! @, M' Z$ [) s. D4 {' Vstatic struct cdev *mcbsp_cdev;/ C/ z& @" G5 i% k9 }
static struct class *mcbsp_class;& U% b% a# g/ h# k) J9 o3 C
static dev_t mcbsp_dev;
1 `+ B2 [, R# [+ w$ Z! Yunsigned int DRR_data;
' ^2 ~" S! E$ b4 [8 ^5 munsigned int DXR_data;1 L% k. M) }6 d% |( _
static int mcbsp_open(struct inode *inode,struct file *file)
" C' ~. R) Q4 Z  g+ l' w8 V{8 ?. S7 I  a; h, _: t. N
   
8 a4 i# G' l$ k% o( P   //interrupt enable,initialized; Y  ^. D: H, b" A* ~
   unsigned int temp;
. x9 g1 _5 \  y" S- c! e  F7 u) u0 L   //SLEEP_EN(GPIO8[10])---0
5 s7 }6 G/ R, N0 J) x   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- A( d, r. F8 t2 A% u# q8 a   temp=temp&(~0x00000400);6 x0 W% n  T& w4 a
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" M4 [# Q; x8 t: `; O  //RESETn(GPIO8[8])----0----1
; p. F* ^7 Z. \9 ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 o& b" e& \: |# f1 @7 o" S4 R8 p   temp=temp&(~0x00000100);) e2 [5 P9 W- K1 a/ u" W+ i9 I! r
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 z& i, L% p4 |/ |4 e" p   udelay(100);
4 y: c' b1 ~2 X9 S( ]( X   temp=temp| 0x00000100;
7 W. Y" i' l$ {3 q, b- Z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
3 A) b" @4 g* D3 j2 d  v0 w9 q9 E   udelay(100);/ x2 d. r5 Z/ S% n0 U0 i& |
   printk("open success!\n");+ ^% m( @* O; ~. ]$ e* H% d
   return 0;
0 u" H/ G" G) u, _6 p  a8 U! y  [}" P7 X) W/ v) L4 T/ L( V1 ^  Q

" w8 ]0 j% J% `. b3 ~static int mcbsp_release(struct inode *inode,struct file *file)
& B& Y& _/ {  J* G& y{
, K) B! E' b* J9 T' f; ~8 _+ P: l7 [   printk("release success!\n");- W( |, |; y. n1 B
   return 0;
$ `& t& a4 _$ W% X) c9 w! X}  I% k( t4 m$ Q  F% _2 u
, f$ ?$ O! `  e% _5 g
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* @6 p9 h7 `) h2 y7 |/ k2 N/ H
{# u+ {) D' Z% `, H7 E1 N
    copy_from_user(&DXR_data,buf,len);
) B/ O1 x: \9 |  p    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
. ]2 X. ?# f* P/ r- B    return 0;
* Z9 G" W' s) J3 ?% x4 G
5 J, T- s. w* _}
9 o0 e) L1 Z5 t. |8 \3 C8 k, k
7 H: g; j4 m* `6 ^0 _- V* fstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 K) z, Y$ D4 d
{ 2 _5 C1 M2 n9 Q1 W4 O3 C  Z7 z3 J
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
6 B; h, N: V. L. }) D   copy_to_user(buf,&DRR_data,len);
" F9 q0 _0 f- x' z! E4 f+ B   return 0;) o2 m% N6 P! s" e
}
( h  p6 T# U! J
4 Y% U; W9 x" O' L+ y
  Y" Z' X3 w2 c8 o: Lstatic struct  file_operations mcbsp_fops=" b4 u% a" M4 U$ Q" o+ n
{) G" K% e0 L( p2 h* Z2 ~, w
   .owner=THIS_MODULE,; ~; ]0 O' a) j* }( o6 i
   .open=mcbsp_open,
: ?& b; }# h0 B' X: D8 t. O   .release=mcbsp_release,
$ w- H7 Y7 x$ x   .write=mcbsp_write,
' Y+ x3 O% m1 @3 P" n/ c   .read=mcbsp_read,! p/ @& ?! D$ f$ f$ Q8 y
};* G% Q7 z5 I" m" l" n% o( |
static int __init MCBSP_init(void)
9 F% e; z. d0 R{
; L" O; x$ \1 M) S( D3 V/ a   int ret;" a" n2 I0 \; g9 w
   unsigned  int   PINMUX1_REG_old;
) U$ ?. {/ Y+ Y/ Q$ E9 E9 ]4 {   unsigned  int   PINMUX18_REG_old;
' l, r" P4 N" ?: x: N7 g   unsigned  int   PINMUX19_REG_old;
- I1 Z) v2 @) g6 |* [6 ]# h   unsigned  int   temp;  ; Q" I) v( c2 b! |) Y8 ^: I
   if(MCBSP_MAJOR)5 c3 H! [& [& i& s
   {* X; v/ \; N2 d1 F2 u" O
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);' K4 F2 \, ~$ n9 h2 U, C6 |
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& F. h7 \8 O0 i; @7 |   }
8 N8 H# y+ G6 F/ X   else
! x/ ]4 B& f* C' v2 V4 E/ h   {0 Y5 Q' E/ S7 z. L
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);8 Z7 q1 e& J" l% D
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
& X8 I: F: W& D# o# J   }
$ }! Y- J. H) W/ @* Z  Q( f1 e   : z! Y; ?7 }% a3 H$ N0 `% r
   if(ret<0), o! d* {3 G9 H# E
   {& Z: U0 d. l9 V  [8 p' P8 f- d& m# f
      printk(KERN_ERR "register chrdev fail!");: g+ Z* A) K& b0 N7 Q; B( u
      return -1;
( z" o( H  x+ X( X   }! _& B1 w) E0 C$ N* V
   % }: _2 M$ P2 Q( o/ s
   mcbsp_cdev=cdev_alloc();
0 Q8 D$ E! i" y+ G' N. N9 r- E" z   
& Z# |/ `9 e- d0 T" ~8 ^/ _. X   if(mcbsp_cdev!=NULL)
5 _9 n8 j7 I! l1 p; x   {& F6 L4 j7 V% K% k' t! n
      cdev_init(mcbsp_cdev,&mcbsp_fops);+ R1 ?0 y% u0 v5 z7 D9 W
      mcbsp_cdev->ops=&mcbsp_fops;9 }9 W9 |8 M- x" \2 L& M
      mcbsp_cdev->owner=THIS_MODULE;. i* l7 t. U; L4 S$ \
      % h) U  K+ o7 F+ o; x1 t4 ?  n
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 t! B1 |3 ~/ G: ?& Q          printk(KERN_ERR "register cdev fail!");
$ V: N! E$ p* g  z8 ]      else4 l) t0 T% S& g/ ?6 V3 h+ w
          printk(KERN_ERR "register success!\n");
3 f  {! I* e0 R8 u4 X/ W% g   }: F' |# i8 x4 K! T% p7 ?
   else* O# r( R) a7 ]5 z$ S
   {
2 Y5 p, x1 z. b2 L      printk(KERN_ERR "register cdev err!");( v% x, m7 y, o$ E% o+ `
      return -1;
1 N/ w; e; h# ^: m! w# n   }
/ l+ o+ U8 n1 r- x) {- _   
6 k  a1 h: k& l7 D  d: |* d  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ F% k6 M4 n& u( u
   if(IS_ERR(mcbsp_class))6 p8 H. E! Y# t2 p5 c
   {5 f& k- e  k6 {- ?0 m8 U
      printk(KERN_ERR "register class err!");
' o# j' ^  w' Y& I3 D+ {& E2 r  E; N   return -1;- M( S) a& A: g, b4 Q7 C
   }. P# }: ~5 m  y
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);: b, a7 W  F# q+ V* _0 p

3 J" H/ j8 `* X5 s   //PSC
- w2 c8 U" j4 v* _   //add Enable MCBSP" A' K5 A$ o9 W
   //test
% Z. `0 B# N( t3 x   temp = 0x80000003;6 |! p8 f- B0 R+ y
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
4 D# ]# i' @6 _- w   temp = 0x00000003;
) Y3 p* Y( L# F2 y$ e9 l4 K( m4 }   writel(temp, IO_ADDRESS(PTCMD_ADDR));
# S" O3 h/ x& w& n: m% q2 N 4 p0 z+ s7 G1 x0 i: k& a( J) b( e
   temp = 0x001FF201;
: L, b6 S8 b- C6 F9 F0 z   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ y2 t7 w0 U5 |, r: z   
6 v/ M7 A- ~6 H   //PINMUX  
' A9 h3 l* ]7 H' R  p5 P- q   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
% @6 S% A; \7 h3 |   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
1 D) m) g+ p  ~0 V3 E4 c   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
8 P7 y5 V1 M$ \" N, c   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);) M  w! x# f: ?2 @! w
   
; j1 J* M; E# @' N  V2 q+ y9 s: b+ T   //SLEEP_EN,EPR,L138_SHK1,L138_RC
( @, ]! Z" J# m9 N+ {   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
( @- s' l. |% F- n   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   % [$ B; }3 R! C/ r( d0 ^7 d8 u- i' W
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: J: ~( O' {5 C0 s$ r* t& h& v

1 V7 b/ v$ n+ ]: b   //RESETn,L138_SHK2( t- [( f1 r" i: p+ H5 L
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ( e7 o/ x4 Z6 w3 [( H1 N# _
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
' y) g* j( ~$ a: W) h; U3 g& Z; ~   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);+ t! L2 M2 R7 i5 H1 u. J, i) X

3 d6 I6 a0 `$ b$ G0 u! Y$ ]/ k% k / f! S8 m, _0 c9 v* {& h) }
  //SPCR Register8 J: ?+ v1 S2 u  T, k$ M
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
1 c* n- g7 B- R9 e  temp = 0x03000000;//(DLB=0)- H6 Q) m+ v4 R8 d6 S
// temp = 0x03008000;//(DLB=1), u0 R0 i% X: Q. Q4 v
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset/ ]& k: f; A- y) z( _3 g
  temp = readl(IO_ADDRESS(SPCR_ADDR));, y2 M8 m6 P4 V
  printk("temp=%x\n",temp);
9 Q) |8 z, k3 K' P. x0 u
) j: Y: g" N0 B9 |' a   //PCR Register- W. c7 `* }$ i7 n7 e* E
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* O" E/ J" y4 _0 ]  // temp = 0x00000F0F;& u4 Q# I0 T. E( L: e7 s
  temp = 0x00000B0F;$ ]% N' e: s" I) |
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
* y8 |- K2 }5 v/ \  temp = readl(IO_ADDRESS(PCR_ADDR));
" L2 H' w! T' k; Z, W  printk("temp=%x\n",temp);  5 r9 [/ s7 K6 r) e" r( [
   //SRGR Register% t% P; T. C6 w, Z3 l
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==114 b& X3 q( T. y/ Y! ]; ^) p& }
//temp = 0x301F000B;  {% ], j( ~+ k1 y
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
0 t7 K0 L4 j' a  Z( n, `  temp = readl(IO_ADDRESS(SRGR_ADDR));
* H8 u# S/ J1 T& p  printk("temp=%x\n",temp);
8 ^  E; H; w6 ]% m) u5 V  ^   //RCR- Q3 R. T* ~' g* b  A$ U2 f9 x( t
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
7 R" G# N% I" ~, D   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; D) a' w7 g6 O/ n6 t   temp = 0x00440040;
* T& l* h. h# g! H" L2 w" W" z   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
5 T* Q$ F& y* \' W$ ?   temp = readl(IO_ADDRESS(RCR_ADDR));; h+ G  o# V" A0 B/ \
   printk("temp=%x\n",temp);% Q$ ]7 ~3 w2 |
   //XCR
) }; R2 z. M2 H( W4 {   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
) Q  E* w# k* n- c5 @+ \$ t   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
* O' D9 V$ Y: a8 \  I   temp = 0x00440040;% h; y& _8 Q  q6 p4 x/ o
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
1 f8 U% w" `  k2 l6 n   temp = readl(IO_ADDRESS(XCR_ADDR));
' X! L' h3 g( n3 x+ C5 Q   printk("temp=%x\n",temp);& r& b4 ]' a9 |9 E9 G9 R
  udelay(100);
* X$ j. @! I( s$ m; P. P  //SPCR Register
6 ]- L9 Y5 a; V" d% W0 d2 |  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
- y0 |# g6 D0 j1 q6 ^  temp = 0x03C10001;   //DLB = 0 VS DLB = 1( q% F. [5 x- A: ~: o
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
$ [# C$ y2 M1 b( f' v1 p# E& y$ k  temp = readl(IO_ADDRESS(SPCR_ADDR));
& O5 G/ U, F- s# p4 [1 ?) ]) b  printk("temp=%x\n",temp);
1 G- _0 M' x/ @% a) ]# f: r  udelay(100);& z7 C8 j/ ]( C8 M3 t

7 o5 K: u" M% d. f  j  //set GPIO direction; c; ~( T4 N. H( q( h- W3 o4 v. ^/ N
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
  c( i3 u8 A  R- v# ]: r& t4 U   temp = temp | 0x00000100;//EPR----input
+ Z6 i, M8 s2 U3 C   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
. X: u4 N, `7 d( \$ X1 ?3 C2 T  z   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
. x5 u- |- `3 C$ N* r1 D
8 g6 b9 V( e' _- a& j% i" K   return 0;
' @; I: w$ I6 h}
$ I$ q- N# _# U9 c7 }* `( Bstatic void __exit MCBSP_exit(void)8 i1 z6 K. _# Y, D8 \
{
0 z; v5 v& G6 x7 c9 l7 F   printk("mcbsp chrdev exit!\n");
2 j- Q. ~* |5 ?  |   cdev_del(mcbsp_cdev);, ~+ j4 ^8 ?! i! L6 y: T. j" R) B
   unregister_chrdev_region(mcbsp_dev,count);
' K+ y1 l. R% D   device_destroy(mcbsp_class,mcbsp_dev);
' m$ O* n2 K  h% z: L   class_destroy(mcbsp_class);
4 `0 V0 p( _2 Q7 p6 D2 x* N}0 G3 v/ J$ _! F/ K  D
module_init(MCBSP_init);
. v/ X& G% f8 |# @module_exit(MCBSP_exit);
. a; q" J/ |, c9 e, K. s' H2 @
& g" x: t$ L! B- M+ _# V; _5 cMODULE_LICENSE("GPL");
' l# q3 s9 {! Z0 z5 b3 n8 V% Q9 t8 ?. Q6 s* f) y0 K5 o
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
1 _$ v* {& G3 f我的应用层的测试程序如下
5 X" b: q, f% J% F0 i, p' L$ ]#include <stdio.h>
0 Q0 M+ s0 a/ y! @# r/ ~#include <string.h>
) }7 e, ~5 h0 d6 u#include <fcntl.h>8 k; |  ^$ j3 f$ e8 I$ N8 p
#include <unistd.h>
) ~! |* c2 y7 Z. O/ d( x( |9 Y#include <signal.h>( R0 h  T  n$ [- x% o
#include <pthread.h>       //线程( H5 P, D1 w+ o. I% z+ D' B0 }( `
#include <stdlib.h>( q2 O1 @7 w* [: ^
#include <pcap.h>          //捕获网口数据% Z  l  D0 t' P. W0 ]) x
#include <semaphore.h>     //信号; b+ E9 U- A% }! n4 c: Y$ `  d) {
#include <sys/types.h>     //消息对列/ _, q) x. D8 Y
#include <sys/ipc.h>       //消息队列
/ }+ c3 x/ i* `( V#include <sys/msg.h>       //消息队列
7 d+ R& `' J& F0 D# E* ?#include <sys/select.h>
$ q7 U: u7 {4 ~( L#include <sys/syscall.h>
7 S- C2 \: C1 A#include <sys/stat.h>1 F' W. b+ |0 ?6 u, C; p4 @3 p" z& f
#include <sys/mman.h>
/ n1 r* O' p1 L#define msleep(x) usleep(1000*x)
8 y- \3 ]' ~, B: [# }
5 H& Y! |/ l$ R6 a' E0 Kint main()$ I; t6 K  F+ O  C
{
" T7 ^5 u, [$ S0 `0 D    //MCBSP,ARM与AMBE2000交互设备
* C. e. C( n9 }1 x% g; H int fd;
6 N# l6 R" J6 x3 w unsigned short data_write = 0x5555;
) w2 d' f2 X; o  V unsigned short data_read = 0x00;
6 C: X$ f9 [% @' X! n  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 R, w- z+ B# x1 ` //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- }2 v: B+ U0 C9 ?    " @& u' r  r" f
  if(fd < 0)
3 H  V! U  S; Q3 z0 _0 S9 i  {* w7 H- P( e9 m! I: c6 q
     perror("open failed\n");4 h' L4 m, ]! E; ^
     return -1;% q. `5 K3 l/ h! C; c6 L
  }
7 u( ~9 P+ L5 R. {2 j3 J2 f( l  
) _  L2 ~. v8 I, {  while(1)
0 k  B8 \2 Y4 i5 A  {6 N4 j/ n1 P2 u1 a
   
2 Y0 l; F& V7 T   //AMBE2000每次读写是24个字为一帧
0 i' V) ]0 s$ X   //写数据时将数据在底层存储起来,等到中断的时候再发送
% d3 o/ G% k' m   //AMBE2000输入数据是以0x13EC开头的
* p3 s% n0 g' @. b   write(fd,&data_write,sizeof(unsigned short));
$ ]. i; P% R& e, t( h7 `' h" f3 J( C   " V7 @7 u  m0 S6 x, X
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
% a$ W# k* r6 ]" S; U& ^3 m   read(fd,&data_read,sizeof(unsigned short));8 ]) m- q- ~/ e3 w8 P1 g# i( A1 Z
   / f. w* V+ P8 @) y& D- B2 L
   if(data_read == 0x13Ec)
8 w: ~( s1 g1 ~   {
4 D$ ~4 B) \- C* }) P   8 p1 f0 ^4 U4 O3 P  ^  N
    printf("data_read = %x\n",data_read);! B4 w8 K$ o2 u
   }
  ~0 T2 i: a/ z: J) Y& ], H   
5 X: e' s  O7 @2 a  Y   msleep(10);" q/ e5 O) y  E8 `9 m' O* @
  
& p' C, m7 _& x9 i# _( ?( J. N  /*; R. G0 o! c- a! T
   ioctl(fd,1);   $ I2 \0 L$ `3 P" s/ p0 s8 l7 j: M9 T; Y
sleep(1);
2 N- @% o- A3 G& Y$ D" b9 ~ ioctl(fd,0);* M0 \0 G$ z- F. g2 M- X
sleep(1);
8 K1 W8 L( M& D+ h2 p8 M" ^( y6 n */
8 m* M4 u2 [# n* D$ Y1 ?  }   
) r2 W3 b6 z1 W5 Q return 0;
+ \- w2 N1 o4 h  H2 H) T- |
- V' W, k2 z  \}+ ]% b0 W$ }! f: ?
' E' G4 r9 `* h
多谢各位指教,谢谢! 急6 ^0 h0 [( ]& b5 t9 C

6 q& K; V* }; H0 y5 B4 k, i& k6 W! X- I

- |. p; O% H9 i$ u$ D3 i. E; a! g, _! y- o4 O/ T' [" D5 h
3 H2 v; T/ i' v% F





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