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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : Y& Z7 y! [! C2 s
/*
0 e  e0 `( l5 q * Copyright (C) 2009 Texas Instruments Inc3 C' _# @; S9 m
*) I, G% r2 |- z$ l9 N
* This program is free software; you can redistribute it and/or modify+ X. H# v6 _6 t0 K; n# ~) g
* it under the terms of the GNU General Public License as published by
. G( Z8 K/ k  u2 v& _/ [% ^ * the Free Software Foundation; either version 2 of the License, or
8 u- D6 }; P! D& P# ^& ` * (at your option)any later version.
1 V/ V/ ]: e* t4 K1 P *7 |3 N8 a; \7 c/ Z" N0 H
* This program is distributed in the hope that it will be useful,4 q, @! P4 @" G6 R, e  {4 E
* but WITHOUT ANY WARRANTY; without even the implied warranty of
& E3 x9 z/ O! Y * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! E( N' C1 ?2 _- B) {- Y) G * GNU General Public License for more details.
+ P/ i- i- p; x4 \$ x) A" _ *
, f% G4 o' Y+ X( A6 `6 i * You should have received a copy of the GNU General Public License
1 _& U- X5 `& a' Q  x# E, {9 y * along with this program; if not, write to the Free Software. \  N4 C3 J6 w
* Foundati" R! K& Z$ b3 L2 d7 ~+ D# T
*// h- V7 d# c3 y) Y4 x/ R
#include <linux/module.h>
3 A- c# }4 `0 _( w1 d#include <linux/init.h>1 n% E1 p6 R! h; j+ ~& N' \+ }
#include <linux/errno.h>
$ U- X' X! k3 ]#include <linux/types.h>
0 X2 z( i$ w) n0 }8 M7 e#include <linux/interrupt.h>6 t( l  f( l: b( K1 S; A/ @8 q
#include <linux/io.h>
8 U  E$ z, |: R; @7 P' W#include <linux/sysctl.h>
8 W% R  {3 D6 |" B# }9 v" T#include <linux/mm.h>% S! j* X8 x4 A' T. \( ^- ]7 F! v
#include <linux/delay.h>
8 ?! A0 }4 I5 q1 X/ H#include<linux/kernel.h>2 K9 z' l& y  N# l' I' m9 C
#include<linux/fs.h>
$ b( d& P( p& N7 u; M3 [8 g#include<linux/ioctl.h>8 B9 H6 Q. _" E2 Z5 l
#include<linux/cdev.h>5 T* Y) \# `, ^% I- j" g
#include<linux/kdev_t.h>' W( y& {) ], \
#include<linux/gpio.h>6 h4 s+ P' Z7 Q0 I& a: {. ]! A# @
#include <mach/hardware.h>
3 |: d" e, _9 u/ L5 ~#include <mach/irqs.h>
) x/ M6 x# W0 P. H1 z+ @2 Z
* g$ k. T, Z: f1 z) I, R6 w#include <asm/mach-types.h>
5 A6 H6 h0 Q3 q. {9 u* ~, \#include <asm/mach/arch.h>( C9 A$ s$ o1 y3 o
#include <mach/da8xx.h>/ {/ [6 [. v5 s4 s3 T) Q; z# Q
#define  SYSCFG_BASE   0x01c14000! w! D# |: e0 |4 O
#define  PINMUX1_OFFSET   0x124 % e) l/ o! A, |
#define  PINMUX18_OFFSET  0x168
. e+ K6 E" h2 N# L$ x#define  PINMUX19_OFFSET  0x16c
; p5 b8 {. b: y#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR" p* g# Z$ k1 d5 l. A& b/ k; ?
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR- q9 s! S( x8 \! I
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
/ _/ y+ c; q- `6 P( M#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR/ v0 ?' u5 t8 Y% x
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR9 Z# E# V* p/ t7 A8 x, m# ?
                            - ]# q  }' b# ~0 Y* M$ d
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR$ ^" j% O  ?# h. [/ b! z) H1 o
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
6 h1 E5 o* Q3 G% P+ w  K: J//PSC
2 `  ?# }/ c# g5 H* D  y% ]#define  PTCMD_ADDR   0x01E27120  
7 I3 q+ {, O9 I, g$ W4 T3 S0 Z8 [#define  MDCTL15_ADDR 0x01E27A3C
# {3 M" b* o' m* g% r$ g3 l8 n6 W#define  PDCTL1_ADDR  0x01E27304
( n# ~( L4 M, Y//GPIO8 direction
+ r) s0 L6 J9 P* A" Y& z* h#define GPIO8_DIRECT  0x01E260B02 S$ w% _* v2 }
#define GPIO8_OUT     0x01E260B44 E6 I8 ~; @% C% N
#define GPIO8_IN     0x01E260C0, E. F* ]! D$ e6 x5 T' U

8 Y, ]/ ]8 d4 Y. U# A//#define MCBSP1_RINT    99              % _6 B3 l* _( [1 l0 Z# L# @7 y
//#define MCBSP1_XINT    100  
3 _1 C1 x! g1 Z  l+ ^static int MCBSP_MAJOR=239;2 c' Q" E2 m/ X7 Y/ D
static int MCBSP_MINOR=0;7 V' i8 p) O. ?9 Q+ A$ g
static int count =1;. z% l  N8 `7 E0 P% F

+ V- b# P$ _3 p6 ]2 t#define MCBSP_NAME  "MCBSP-device"% l6 L7 C! F: f- g, h8 e/ p

, Y0 {/ r( F0 T! R& Sstatic struct cdev *mcbsp_cdev;& z7 }( [% k: N1 H
static struct class *mcbsp_class;/ s- E' ], A  d- {, R
static dev_t mcbsp_dev;" C6 L: {' l, G
unsigned int DRR_data;& E. W; r4 \) o2 T
unsigned int DXR_data;
6 o. k7 M, ^7 c$ Q) D) }1 Tstatic int mcbsp_open(struct inode *inode,struct file *file), y1 }7 y4 e! j4 ~
{/ O8 e9 s; I( `, A+ F! L; Q$ r
   0 |9 p& D& ]9 @" H' R& g! _/ f+ R/ Q
   //interrupt enable,initialized
5 r) s7 }9 C) B6 A  [   unsigned int temp;
( A7 R. ]: t2 `0 \0 z$ T, x   //SLEEP_EN(GPIO8[10])---0' |8 `5 k  w0 P; Z. w- f- n6 B+ U
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, d, M9 D1 r- i; N6 s% U) _1 Z. ^8 B
   temp=temp&(~0x00000400);
- k; {" X1 C1 b6 F5 L! k   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]+ e, i. |5 w! r
  //RESETn(GPIO8[8])----0----1
+ [9 Q4 A5 _- c/ J1 c, f   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- W! ]; X9 x6 @1 F
   temp=temp&(~0x00000100);
$ u, h- M7 \5 D6 K+ Q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0  D7 Q6 g! t1 z' y5 y7 q8 N# w
   udelay(100);" f  u5 C  B, x4 G( H3 |6 K6 x
   temp=temp| 0x00000100;7 @/ ?9 d3 @- Q4 u. E
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 Y) s' z0 O# a5 O
   udelay(100);1 }; S. B, Q' u) D: a
   printk("open success!\n");! K+ f& c6 G9 I9 Y
   return 0;! x5 z& @: {6 a0 h$ s: d- x
}
: y# m* U. {& b$ @& S7 Q
3 D: L& u# I* s& {static int mcbsp_release(struct inode *inode,struct file *file)
5 L3 P8 y' g& q2 S' M( j0 k. b{
6 E+ ^; f; [) p2 K9 d" {  L7 p   printk("release success!\n");
6 k% a$ u  N6 M# i( s   return 0;) ^( N) [- F3 v4 b6 e
}
) R' |5 n) Y: K1 w3 d2 `* o6 W( s- ^# _' F& t% W2 g
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)8 u' l! X  i$ ]2 f% m: v% ^
{
  s" X( G. z6 A    copy_from_user(&DXR_data,buf,len);6 I! y; [0 f6 y# j* i& n
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
8 Y1 |' G: R2 j- o. ]' M    return 0;
- r6 ?5 i, R% J ( P# W. ~& S$ F( d* s1 u
}% M' s  k7 v- ~5 V$ M' X
" M  J; U5 G0 U' L4 r1 O
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
& \# q+ R4 s  n3 f6 v% Y0 _{ 4 K; S) p; |8 I! d' y1 R4 C( n
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
. e3 L! F# W1 S) ?' l   copy_to_user(buf,&DRR_data,len); ' c: }7 I$ ]( K
   return 0;
: }8 S# e* W; O" R  u}2 Y% M8 r! X' p. k8 _1 n6 s
! [* Q' R5 x/ {" v8 n+ `
" R5 r+ W8 @" s+ `
static struct  file_operations mcbsp_fops=
. s" K" q* K4 M$ a3 ?: @: ?$ t{
8 \9 v5 i) T$ y' H5 N# d& R" a   .owner=THIS_MODULE,
" L, I! P* j8 `0 c   .open=mcbsp_open,
0 T0 ~. F7 n/ b# u   .release=mcbsp_release,% e/ }& T- @. Y$ n1 A/ N, U
   .write=mcbsp_write,
) U2 O4 B  n: D5 _   .read=mcbsp_read,
" O$ g4 T" z" r& z  [# L};' e+ x- X  l, D2 P
static int __init MCBSP_init(void)7 P3 l9 i3 N5 p: o
{
+ V1 w( t: `  x8 E7 @! {   int ret;
: Z+ Z2 c# x* U, K5 k. a* J   unsigned  int   PINMUX1_REG_old;( y: @  F9 Z& [" G
   unsigned  int   PINMUX18_REG_old;
$ U7 ]% g. p' U0 I% x   unsigned  int   PINMUX19_REG_old;, h$ X9 g7 Y9 U1 `6 ~  o! X
   unsigned  int   temp;  
. _( z0 V! J: h* C5 _   if(MCBSP_MAJOR)
6 I% Y0 c5 m* r* a* ~- f   {* g- R" o& x$ w; u! u5 z
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 f0 N8 {+ ]. f5 X, Z      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ I# G% h2 I1 G9 n   }
! V! p' U* y; g   else! ^& e- |2 v; V1 v7 `
   {/ [9 v7 B8 {* b
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ L5 ]( y" X) V! f( n( W: n9 ^
      MCBSP_MAJOR=MAJOR(mcbsp_dev);8 o& k# a( `6 v8 `  S
   }
- S3 w" @4 r2 H+ b6 I5 S+ q  Q   
: _) _9 y% w" S: h   if(ret<0)6 }: o( F1 \* Z9 A& W9 Q% v
   {
  Q& o) F$ |- J) ]. \      printk(KERN_ERR "register chrdev fail!");
: A& o3 V( U; S' [* ?8 [5 U( f      return -1;5 i, p( n" ]' A: Q; N
   }% [/ P: {7 y0 R! l! \+ \
   / ~6 `! U! q4 d8 D8 _8 D8 O
   mcbsp_cdev=cdev_alloc();; g& p; v- ?. _: I
   ; P2 z4 W6 p* e8 V% a) y7 f% c3 o
   if(mcbsp_cdev!=NULL)
8 ^) H0 J* e. [   {
' G( Q) ^: r, B5 X. ^7 Y+ r: s      cdev_init(mcbsp_cdev,&mcbsp_fops);! D2 D* Y# P5 c, S
      mcbsp_cdev->ops=&mcbsp_fops;7 S% I* {; |/ x7 \1 L
      mcbsp_cdev->owner=THIS_MODULE;
8 g' L0 A7 K, e& O9 n. R, t      # g5 }# I5 Y: F; z. J
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
+ a2 O& m( e5 J# g+ d3 s          printk(KERN_ERR "register cdev fail!");# {( ^9 p' R, E6 x* p: y- n  b% T
      else" |! `8 J: S- @
          printk(KERN_ERR "register success!\n");8 J0 c( k, w0 s8 a* i7 o% o
   }4 U$ ~1 z& N, T" v- U
   else
2 a( h4 G* [- P9 i1 {   {
& w2 g8 `$ a: V6 H      printk(KERN_ERR "register cdev err!");
8 w# K2 T: j4 k4 F& e      return -1;
' ]' `1 S: U4 }   }
% q/ L) t! \5 y# K/ h   1 O8 f$ y, ~3 l& x, A
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);# ~0 R  M1 U2 r. d. m2 Y
   if(IS_ERR(mcbsp_class))
3 j- }! ?/ a% @+ r) C' [   {- D# Q$ }  J" \6 L* m' |5 K
      printk(KERN_ERR "register class err!");1 ?; S8 W; {0 H
   return -1;( e/ D. {/ \- @, _+ R7 t# g
   }+ o  {) V  u6 Z, D0 _1 t. k
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
: j! M! ^7 S6 _& |: k: T5 `, Z% G, y
   //PSC
7 E9 i/ Y3 ?: Z* f, C7 \7 n   //add Enable MCBSP
3 @( D' X$ q& i, B* {$ P# M9 d, P   //test
3 M* V# ]5 E$ h- l" \1 M3 e   temp = 0x80000003;
$ |# j, v" ]" h) e5 a: Q   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
# ?7 b! |8 l) t4 j* _( y   temp = 0x00000003;
& E+ [! _0 x  v6 i' y7 T   writel(temp, IO_ADDRESS(PTCMD_ADDR));9 ^& D3 r& e2 {$ `) q2 K

) l& R. r1 i7 _   temp = 0x001FF201;+ G' }" O- V5 P- U3 W1 a
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 a$ M6 ?7 [1 v4 N* J. E   
3 n( K) s2 G) a- H   //PINMUX  
7 c3 w3 M* g/ \+ q) d# y   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,8 `, g3 a9 x+ v9 @# C, i0 `
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
  P4 w0 |, L: t  x. w+ _   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
9 `+ b3 t4 [  c! L8 |  T, s4 o3 K   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);* w5 [& P1 v" `' j* l1 p
   * t& D2 h9 \" T/ H2 G
   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 s8 k: X0 D0 d7 y
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
; [4 O! d& i* z+ _& ?   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
/ V. T/ \6 w  h4 p: o2 T   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 y  Q) F; m" Y; `
! i0 q& P+ Q/ v   //RESETn,L138_SHK25 ~2 ?5 D" u0 y3 K
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  % ]" D0 Z9 x. y7 p2 V/ k% u+ @
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   # J$ k' }5 e# q- H; _! _
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
/ q4 A' H: b' s
8 o3 W' V* o3 T% ]# R; y; X ( O$ w- o1 {( H# `# r
  //SPCR Register
$ d0 J. w' D- _! W: O3 D* W* w  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset2 z: |7 ^5 D8 s" P( T
  temp = 0x03000000;//(DLB=0), A1 A% c6 E# K+ O. q. w
// temp = 0x03008000;//(DLB=1)3 L. G: H8 j# `. m
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset( `  S  O2 \/ ?6 j7 Y) [
  temp = readl(IO_ADDRESS(SPCR_ADDR));# V! y& T* Z3 \# I" Y
  printk("temp=%x\n",temp);  B# r! O5 `) b0 z+ N

- q$ b4 T2 T1 Y, c4 x0 \8 j6 U   //PCR Register' W& [6 i; G& u5 G5 H0 X4 F4 \! |, d
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
2 l0 {: U3 ?8 Y  // temp = 0x00000F0F;
+ ~( w. e' Z' F" S$ g' U2 x  temp = 0x00000B0F;& p, _! y% ]& e  c9 S5 u
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized : @4 \& z# r) u0 f/ L) t
  temp = readl(IO_ADDRESS(PCR_ADDR));
6 F7 C" y  L! n2 Y; G  printk("temp=%x\n",temp);  
  w" _# Y& k# G/ N   //SRGR Register
0 Z' A( Q2 L% h" {   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 Z3 d: q& h' x, s
//temp = 0x301F000B;5 d1 h3 w3 y0 D' W  V
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized   m, F0 J) F) R5 w4 u# T. _
  temp = readl(IO_ADDRESS(SRGR_ADDR));
  s9 b+ C; ?8 A; Y; }  printk("temp=%x\n",temp);
9 `, a$ {; W% i+ a* O7 b" B   //RCR
6 E7 q' u( |7 D" D5 B   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
" N# N3 G" m$ ]3 W% V   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 f' W+ W( }) U/ h2 G4 H& l% }
   temp = 0x00440040;& X1 r7 z! z& F9 t5 n: r
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
) `8 l' h0 ~/ Z  O& T   temp = readl(IO_ADDRESS(RCR_ADDR));3 n: j: ?- S+ u0 e2 ]9 q
   printk("temp=%x\n",temp);* M! p  B6 i2 D' w/ ~4 S& `
   //XCR& \8 I" M7 B) Q, S0 y
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
$ O* M6 V8 t9 B, U   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-00 j3 y  D) y5 f
   temp = 0x00440040;
, \" P- Y  G7 C# V8 C2 t   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   $ O2 b; g# k3 T6 |- B- [
   temp = readl(IO_ADDRESS(XCR_ADDR));0 F! {. p- u9 y
   printk("temp=%x\n",temp);
8 [. x5 K1 Y0 Q$ f  udelay(100);- l3 f+ ]- B6 ]1 A( q& V" J9 X3 `
  //SPCR Register( F4 F  V: n. E% H7 R
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
  ~. i( d/ E$ u* v1 o7 c$ V% C  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
) q2 T; L+ R( F& [  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
6 r: F* @9 X6 G* o) ^& y% H0 b  temp = readl(IO_ADDRESS(SPCR_ADDR));1 ?: l6 I) I' \9 c6 ]- ?
  printk("temp=%x\n",temp);
* o% u8 u+ w8 a8 Q9 H, X  udelay(100);
& [: N  i& n+ X' |" _- w1 N
; e2 D6 C2 R3 e4 G  //set GPIO direction3 o9 ?: F2 f* L
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
+ H( Z$ W( ?% u4 O' D   temp = temp | 0x00000100;//EPR----input
6 z4 F0 D* ^' \3 w   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output  B0 ]! C+ z, O" b7 C- D, ~5 Y- j
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 6 U& m- M3 C# C5 T$ A8 z
1 k3 u0 M! x6 B: b" J
   return 0;6 e$ V' p: c& n1 F
}/ ]9 @- M$ r! N# z% T  j) L) O
static void __exit MCBSP_exit(void): W8 v1 w. C2 A. I
{
- q. `* ^, m7 L- D5 F4 n& @7 \$ Q   printk("mcbsp chrdev exit!\n");
% o! H1 Q: Y  X; G. {9 R+ E; \   cdev_del(mcbsp_cdev);
4 t% q+ {8 E# ~5 t6 [" Q   unregister_chrdev_region(mcbsp_dev,count);& x' ~! q  ?, [3 q( |& ]& ]0 P; |5 \$ E
   device_destroy(mcbsp_class,mcbsp_dev);
7 _4 s  s+ M9 h0 h& r& H; \   class_destroy(mcbsp_class);& E  \/ Q* U$ |/ q! n* |
}
% _4 t+ f4 \) O- Jmodule_init(MCBSP_init);5 A. J# R+ E+ m8 E
module_exit(MCBSP_exit);
, j3 T# D" L( a0 J9 p' v! g5 F5 }( l0 l4 |; @  I& z7 }. X
MODULE_LICENSE("GPL");
! P0 A6 n+ U7 c8 Z* H8 S5 H) b' w6 w
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 P/ Y% A' x* w( j- S, G我的应用层的测试程序如下4 \- _' O1 V6 ~8 T  x4 O, f2 b
#include <stdio.h>
8 |7 ~) a+ i) T) d( i) l' a#include <string.h>
, c/ g) x4 m6 y#include <fcntl.h>6 E7 l+ F1 e* R; ?% ~
#include <unistd.h>
# k7 O- N! |3 Y1 C5 n  O* g: N#include <signal.h>
7 U$ Q+ P# Y" ^3 `  b0 V2 Q#include <pthread.h>       //线程0 p5 w  }% w  |- ]; `9 }  \5 i* z' H
#include <stdlib.h>4 R6 I! W# Y" V: H/ o6 K
#include <pcap.h>          //捕获网口数据% D5 \, v) g2 e. |5 |
#include <semaphore.h>     //信号
  F5 C) m/ N. x1 A#include <sys/types.h>     //消息对列
, }$ v4 j) z2 P2 P* |) A#include <sys/ipc.h>       //消息队列
9 |2 J# I+ f+ ?8 b4 P- f9 [1 Z' S#include <sys/msg.h>       //消息队列
, _3 R/ N" g8 U. G! i. m5 u' |9 q#include <sys/select.h>
7 j2 X% v" ]2 b) Q#include <sys/syscall.h>  z( w! y- E* G. R
#include <sys/stat.h>
2 {0 J+ Q; {9 r" n( ^7 `#include <sys/mman.h>
' n; ^9 h% w, e# |% Q/ v  S#define msleep(x) usleep(1000*x)
2 u9 V$ o; \( \: ?+ N; F$ }/ I+ g
( ?: S$ Y0 a6 \0 xint main()
% H, I) y; L  ~, h) o{
( X( n0 Q* [3 d2 {    //MCBSP,ARM与AMBE2000交互设备' \0 _2 M" _# a& O! f$ {) k
int fd;; d3 f# }# T4 z7 Y( ^3 t) N; w
unsigned short data_write = 0x5555;& r6 A% _& b* W6 i$ R- f
unsigned short data_read = 0x00;7 o/ \6 B( l% V& G* d. N
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
. w) \3 E( A; G+ ]$ d //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
% `( o4 Z9 S' ^3 x    1 H: p( ]2 C" E! v2 _
  if(fd < 0)
3 o  L6 v9 [( ^2 r8 f; k1 T  {
6 Z* c' N7 d% d3 [     perror("open failed\n");6 T; ]1 W' T% g5 A& a( t
     return -1;3 e0 b! ], P  A9 ^5 W$ Z
  }
6 ]2 D. ]# Y6 n- P  * t+ z0 n, g( ~' x. w7 p0 E; M
  while(1)
! V: ~+ b0 A% u- Z4 _7 E. Z6 J  {
( w! N: S; b3 R5 }* E   
! |. c4 M" N9 G2 I/ y3 t   //AMBE2000每次读写是24个字为一帧" N  k7 I! k) r3 h6 V- O. l, s
   //写数据时将数据在底层存储起来,等到中断的时候再发送
" P( L/ K6 a& {$ I' I& _' E   //AMBE2000输入数据是以0x13EC开头的
& r& {8 q9 w/ m$ [! n3 r& A7 @   write(fd,&data_write,sizeof(unsigned short));
& c5 m  i' c5 F% n4 g& D1 X9 {4 y9 d   
! _# J+ y+ N! u, S6 F! N- A% R  H4 p" n   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  . I& Y( B0 K; n9 M! c
   read(fd,&data_read,sizeof(unsigned short));
! u3 x0 o# {  M* R: l2 n   
: D% s- Z' s3 z/ E) x! ?! r   if(data_read == 0x13Ec)
; q  e! G) ~  f/ [6 C) e  K' F0 w( S   {! |0 s/ R4 s! S' z$ k
   
( y- {9 }6 S1 Y3 y% G* W    printf("data_read = %x\n",data_read);% P: N6 M. j0 g; P" [
   }
/ W% ^4 O: g0 S3 F   4 V1 V* C9 a3 r6 Z8 {
   msleep(10);* t5 H7 I3 ^5 y5 v, X2 K
  9 ]2 l* N" O6 @( j" T
  /*
1 x/ {, |: T2 Y- w3 s* S   ioctl(fd,1);   ; E% g) w( D+ z# K6 j6 C
sleep(1);9 i. W, \; ?9 w$ N6 V: }
ioctl(fd,0);
1 A" g6 d0 p4 d sleep(1);! w7 ~% G" K0 \1 _6 M
*/
6 J7 m5 _7 E  O; `  }   
( l4 v9 Y$ v+ m7 N- D0 i return 0;' D% q* _1 K8 a8 g

. D3 H) c5 g# A' J}
' n& G- l6 L% ~7 U: F& U( v7 S4 |2 H
多谢各位指教,谢谢! 急3 y) k: Y" C2 U4 ]2 _# s( |; @: j
6 O" b8 K6 J- `) x8 o- Q

- m& q- `' I& \" `" U+ V
8 D) ^) @( w' x/ P8 y+ t$ x" C2 [0 I* q) h/ q

3 Y: K# f$ D& r. c- n5 n  w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-27 19:45 , Processed in 0.051889 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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