McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 N+ m9 |5 Q+ c: {' g
/*
! O+ \# [! c) L- h% T# V * Copyright (C) 2009 Texas Instruments Inc0 q* r' K9 |9 z
*
) u* A( Q7 T8 x- x * This program is free software; you can redistribute it and/or modify
9 B5 C. o5 t3 _& `. {, }' L * it under the terms of the GNU General Public License as published by
* H- }5 ^; \/ c, Y$ O * the Free Software Foundation; either version 2 of the License, or4 R9 k4 B$ ^+ B& k1 Q
* (at your option)any later version.* h1 j* z6 G5 F1 v: F- W; u7 O9 i
*! g6 }+ H$ u' I  z3 y$ ~/ i- q. V( @7 U
* This program is distributed in the hope that it will be useful,
; Z* F# Y0 d# D" T: I$ w * but WITHOUT ANY WARRANTY; without even the implied warranty of
( P$ V" Q' G- F8 ]$ Z5 Z1 k * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ l* O% }% Q, |
* GNU General Public License for more details.
" M: F- s. K% d  S *
6 X3 t/ c2 N. ?$ B * You should have received a copy of the GNU General Public License3 L# O; D7 o) Z  b, G  R
* along with this program; if not, write to the Free Software& v& M! E2 Z; D* A
* Foundati
" O' j: j% T2 t/ L, x( p# M*/; v! l9 B3 H1 z, f2 A
#include <linux/module.h>
- N, X) z2 Y; I( B" o7 m$ v#include <linux/init.h>
& x+ `) n, F; C( [8 `6 n. f#include <linux/errno.h>
+ |8 B  F" \# O3 U! p  K#include <linux/types.h>! D; c1 q1 ]+ J! _6 Z/ g/ R; {
#include <linux/interrupt.h>% e1 F8 q/ C4 S$ k; A
#include <linux/io.h>
3 n3 Q( x6 i* u6 ]4 `: Q#include <linux/sysctl.h>  A0 s0 C# j- ?7 S: a* K/ r; L+ n
#include <linux/mm.h>2 V4 ^$ x# t* b) Y
#include <linux/delay.h>
7 U9 F" l# G/ C( U3 n#include<linux/kernel.h>- d! c+ o0 N# g
#include<linux/fs.h>) t4 l. ^8 S9 |$ S0 f& y- c
#include<linux/ioctl.h>4 D3 Q8 x& c; I; Q* ~
#include<linux/cdev.h>$ K% }. [9 }4 `1 z4 o9 G: x+ k
#include<linux/kdev_t.h>) R/ T' f: h7 A
#include<linux/gpio.h>+ U# ~4 T) {8 a  J0 o! N+ R
#include <mach/hardware.h>
+ |6 n$ r. A/ t' Y#include <mach/irqs.h>' q& w8 N. w/ y0 u' U" N9 f* f- _

# F0 I* X' F, T; B' T% B#include <asm/mach-types.h>
! Z7 W* x1 _( E' p#include <asm/mach/arch.h>
" S# D' J6 h5 U8 ]#include <mach/da8xx.h>* e" V/ N, m. J% e/ i% T+ f
#define  SYSCFG_BASE   0x01c140000 {' ~- V1 d( L
#define  PINMUX1_OFFSET   0x124
/ F+ k0 ]" E' J+ c. i#define  PINMUX18_OFFSET  0x168
0 D9 w' [& `, F5 }; Z8 I#define  PINMUX19_OFFSET  0x16c
& u& B$ x: [* h, c% Q4 g9 @#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR4 ]  [3 r# H! ~  D: A4 t$ U
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
* n) N6 n# X4 J$ w$ j5 Z#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR! H( J5 Y/ \+ ~! V
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
7 Y' e  p( {  w: b- w4 B#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
/ h4 ]" @2 n  d" u8 @2 a                            - U7 x0 a  r7 h# b
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
+ g) t: e0 N) n: i) T. x#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
1 [* n% i$ R3 Z) m+ }$ `6 Y//PSC; I. ~7 f/ @) R- `( c! _9 X& g
#define  PTCMD_ADDR   0x01E27120  : I* x% ]9 i/ A+ R
#define  MDCTL15_ADDR 0x01E27A3C/ P# V8 Q7 {% m, L, p: r  i
#define  PDCTL1_ADDR  0x01E27304' x+ _, r' L6 Y
//GPIO8 direction7 ~: v1 \6 b1 b. L! e8 U/ e9 l
#define GPIO8_DIRECT  0x01E260B0% K. @/ X' Q* w
#define GPIO8_OUT     0x01E260B4
- {! _5 J; m' z0 b#define GPIO8_IN     0x01E260C0- U! i1 b  q3 ^1 p' `. T
+ X# `7 j3 }: b/ N) ]% @
//#define MCBSP1_RINT    99              $ Y6 d9 Z6 c( I; h. U. G
//#define MCBSP1_XINT    100  ( b8 h. u  p: e* G: K
static int MCBSP_MAJOR=239;0 X/ m+ D- _  z1 B
static int MCBSP_MINOR=0;0 Y- U6 }0 {0 y/ V$ @+ ~4 S
static int count =1;
5 S4 r; X6 V8 A8 t4 r( T0 x
4 S/ U0 M& x5 G#define MCBSP_NAME  "MCBSP-device"% a0 w- Z. Z' U9 K8 {2 Z$ `

4 q" `2 k2 t5 h# F) ?static struct cdev *mcbsp_cdev;
5 L& }9 e( m- ostatic struct class *mcbsp_class;
+ ]8 @& Y' p6 g% g; P) _- g) K; n1 Fstatic dev_t mcbsp_dev;  H( ^! q1 v" f& |: s0 N* ^* ]! d  `
unsigned int DRR_data;3 ^5 W2 _) X- ~( v" ?8 n
unsigned int DXR_data;, C6 H- \4 v0 y& y; D1 t* e
static int mcbsp_open(struct inode *inode,struct file *file)
5 `5 i3 ~* Y$ j{
4 [8 |* W# v, d; d   * Z$ b# O2 x1 Z9 }
   //interrupt enable,initialized
3 E' }+ s  s6 x, s, J( L   unsigned int temp;, x9 d" ]2 B2 {5 R9 D
   //SLEEP_EN(GPIO8[10])---0
1 @1 H/ z7 }* k" \- `- s6 z   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 v0 b9 Q% _1 J  c3 r- c& y/ q   temp=temp&(~0x00000400);3 ]7 U8 C9 H4 C2 q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]6 X. J1 k7 ^, i( L6 o' U" ~
  //RESETn(GPIO8[8])----0----1
0 i% r* T  |" x   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 |# w; F4 R, i+ b3 g3 ?5 d
   temp=temp&(~0x00000100);2 L) U$ F0 R6 n2 m, H) [
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ A8 {; u- W# f: Z" L3 P( ?, @   udelay(100);
8 K6 j$ M+ h9 E0 x7 q$ o, G   temp=temp| 0x00000100;
, ~: }5 Y" e; n% }. R5 e. k   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 `7 y1 c6 q' m$ h   udelay(100);
, X. A( \' ?7 _5 j9 p3 }9 a* {1 P" W   printk("open success!\n");
+ I6 |1 m2 A) a& P8 x2 @$ l8 g) i' N5 P   return 0;$ o5 K0 w. B( ?' y
}  S, Y8 f9 ^' f! Y

' }( D( s6 W5 T" @0 i) Ustatic int mcbsp_release(struct inode *inode,struct file *file)4 p7 |: T2 n- }" ^
{$ O: A! E1 D. {5 X" r7 {
   printk("release success!\n");. L, K1 ^4 N# h' h  k
   return 0;# m/ p) {9 a8 W/ _3 k" m4 u
}2 p: G# S& x3 S+ g3 t! T

% P9 k) E! ~5 mstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)4 c* s3 T; t5 \  ~& z
{$ J" a8 E9 n; s  b) }
    copy_from_user(&DXR_data,buf,len);& `8 h8 H& I5 H1 y1 {0 K; x: w
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       4 Q, |0 K/ _' B4 j
    return 0;1 p; H& ~0 c1 f6 f
; ^3 v( H& C6 k, V% d' Q5 J+ W8 x  L* Y
}
9 j) M1 Y5 d( ~3 s# F% c" J4 x
+ h3 C7 e% W; o0 m( [& ~static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 J0 k( e( Z! n* s" c
{ ! i! U" I2 B# d7 M+ X
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; B, o% _3 Q, c7 X8 x9 N
   copy_to_user(buf,&DRR_data,len);
) b# {% B& e$ y! Y" e   return 0;
3 f6 ]9 R% F# p# [% A  B}" U8 O- [) z1 A9 t; p  m
9 T. S- Y  D" M- Q3 |

% w+ ^$ D  J! ]static struct  file_operations mcbsp_fops=
" r7 G" M0 o0 L{4 @" O8 R% @8 s+ O- ?1 m0 S1 O' e
   .owner=THIS_MODULE,
8 f3 D0 l. i$ @   .open=mcbsp_open,
; d% ?! q9 z. M! E) K   .release=mcbsp_release,/ S7 h4 {. V5 A" B8 I$ y6 I* _
   .write=mcbsp_write,* ~8 I# q' _4 T4 g
   .read=mcbsp_read,4 [5 M- I3 z) G9 I. D+ g
};3 ]" D, r" M3 S- K
static int __init MCBSP_init(void)" V) v" J/ ]) ?
{6 h# \: Z! q# j
   int ret;
( X0 m, ]2 f* D1 ~- P, ^8 a7 H   unsigned  int   PINMUX1_REG_old;
$ |0 N9 q$ }, `) G0 T) A- o3 m7 b   unsigned  int   PINMUX18_REG_old;5 L. J; L% `( G5 b! }4 w- w
   unsigned  int   PINMUX19_REG_old;" `" j. R8 u: z% S
   unsigned  int   temp;  ( h) |/ F0 Y$ Q$ e9 g/ t! d, W
   if(MCBSP_MAJOR)7 C' m4 f; L  U" c0 N& d
   {: O/ R8 d& e1 g2 ^3 Z0 R+ p$ O7 d
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);( E- P7 O/ X/ o: A- V' N! W
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);. P, v. v/ _6 m( o2 t/ l
   }
4 B- `6 S' G4 m  D7 {   else7 V, I2 _( p% h. c7 A
   {
6 Q5 A1 j; H4 T      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
1 Q) r* q( S- L' z  [      MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 \- c* v0 H4 @, p   }
" Z% U7 f# E$ Y2 W+ `8 t$ n. d   
- ^# ^. {7 H( w7 Z* M- y" A   if(ret<0)3 e6 ?* f+ ~0 y6 ~( g) z8 p8 T
   {: j: g5 n! s- A  J1 _% G$ r' D. c
      printk(KERN_ERR "register chrdev fail!");, |$ e+ `: U" v/ S9 B6 ]
      return -1;
" L% k5 L! L& I  r   }
8 f6 [) e/ F' V& Y4 o   
% A/ b( M2 D2 M$ C# l   mcbsp_cdev=cdev_alloc();% [. B7 t( k! o- }
   , n5 F$ u% d; e$ D4 N2 V
   if(mcbsp_cdev!=NULL)3 Z1 {1 K8 S6 E3 |- Z" ]  w" w
   {
$ d& F  g# G* Q9 F4 X6 S' [6 q8 d      cdev_init(mcbsp_cdev,&mcbsp_fops);1 L/ D3 n8 h# o3 b9 K) T
      mcbsp_cdev->ops=&mcbsp_fops;
, `# H3 H. \" a      mcbsp_cdev->owner=THIS_MODULE;" R% T  L0 u/ M/ E" v3 n- p9 M
      # ]/ I# @' W. \
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
# m3 c2 x0 t. F8 }          printk(KERN_ERR "register cdev fail!");$ ~8 j) \8 a2 t
      else
, e5 L6 s" s1 E5 d          printk(KERN_ERR "register success!\n");0 t% Z( J- @0 i, ?- y4 Y8 S: R6 E
   }; P" _% @* H$ n4 K, i
   else5 R% |3 k4 h  N& Z8 f) ~
   {
0 X" {$ W' d& F) Q/ \: X      printk(KERN_ERR "register cdev err!");
4 c& U; v# L0 I) s4 \- L: A7 u# }( }& I      return -1;; d/ D$ `9 r% w8 j5 X! s! p4 {
   }  N1 Y% {1 w- l3 ~$ [
   
  [" F2 A) k0 b. L  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- f+ a  Y2 X; \9 ?& O   if(IS_ERR(mcbsp_class))3 ]/ {0 P7 r1 x/ Y4 ?' b; @  D
   {
7 H* q/ P2 e" n* R5 q      printk(KERN_ERR "register class err!");
  s9 B$ C& {$ n/ F8 H8 V   return -1;
* a6 [; N5 I/ e$ o. X$ \' T9 n   }
4 b8 y1 b( }7 B   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);! |) \) z( u; L( j

1 {9 a2 F) h4 o( S   //PSC
5 r) j5 |8 B6 L0 K# Z# V   //add Enable MCBSP* w, E6 i, g: I) [
   //test
. S6 f/ k0 M" a7 j( I( ^0 f# Q8 X   temp = 0x80000003;
* C( Q6 X8 ~  N( W0 H, B   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
0 V$ b) g/ t5 v6 k) b/ G, a9 P   temp = 0x00000003;# j) l( i) ~& @/ f; I
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
- A* O, E1 D8 y6 O
( b* H3 g. ~# b6 @/ P   temp = 0x001FF201;5 w/ G6 u+ H- z5 p+ s
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));9 W" R+ |( s. L$ o( V- O3 }
   
) M' d& c+ w* {. \* M. O   //PINMUX  ( U, ^  C4 m. }7 c% E
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
! f: O6 V1 E2 }7 n( k8 |   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
, f& i* A/ h) @# r( z! @. B   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
5 P. F- w  b  K& N   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);2 ?8 w; H; f. A0 y6 k  {
     Z5 ~5 m8 y- l! A4 H( w: K( j
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
( C3 h: J2 ]7 ?) c' O) \/ z   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
& N3 ]6 a9 U1 T) H5 q   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   # `, D# ^' j7 Y# \! {( i- P
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ _/ A1 ~" m. Q0 ?% p 0 J  n2 q% N" @# I5 }( I, q
   //RESETn,L138_SHK2: n' I6 `$ @3 Q' Z
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
! k1 u* r  K* s% J   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   / J: g$ P+ w. F7 P: W
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 S" D4 a3 R) S' v- j2 T9 X/ U
. o7 K$ D1 z: k" j 5 [# |$ R: d4 Z( \5 E6 k- Y
  //SPCR Register
4 i) P% {, b. x4 O* _% U: J4 w  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
% _5 f" L; g9 d  temp = 0x03000000;//(DLB=0); J- Z  z/ N/ N" s
// temp = 0x03008000;//(DLB=1)# X. ?  r. x- S- n: U: F
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
* h# v3 D  M) J) n4 f' n  temp = readl(IO_ADDRESS(SPCR_ADDR));0 [0 b0 v. q9 M9 C2 T: t
  printk("temp=%x\n",temp);
: y2 @) Q  K" u0 A0 c
' _. t" O9 h# S$ C4 L: `5 B   //PCR Register
% d% j+ b1 }) e* p   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0! V( t. E( n% C# s2 L' @
  // temp = 0x00000F0F;" p" S/ c/ z; J9 [( f8 _
  temp = 0x00000B0F;
- D! d$ C8 n* C3 e8 Z  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
5 C( ]: E) a+ h  temp = readl(IO_ADDRESS(PCR_ADDR));
$ P% T9 ]* s& ]' v% w  printk("temp=%x\n",temp);  
7 V% s  l- F, s0 Z0 @  Z   //SRGR Register
8 b! H* W* g: Q( g* q   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==117 x+ e  g2 Z  _# U, k" v
//temp = 0x301F000B;0 |) t2 [6 b, e
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
0 R' M- O! L2 x. \" X. t7 J2 a, c  temp = readl(IO_ADDRESS(SRGR_ADDR));
5 ]5 J5 [: {4 \2 i: }  e  printk("temp=%x\n",temp);
9 U) q, I8 }6 B5 `7 n   //RCR2 Q/ h/ X  U  J" [1 `% [
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 A: a* `, \, W   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
& Y2 u' }& ]7 x" ]  ]   temp = 0x00440040;6 i& F& q% U* ]  P' ^" W
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
3 u% V( v, S& H2 H! [   temp = readl(IO_ADDRESS(RCR_ADDR));2 o, R) e8 ~. e/ i1 F
   printk("temp=%x\n",temp);' O0 C& }3 o# B0 N. u7 m9 s
   //XCR
& @0 t7 N  ~+ g   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
: E, ^2 E: I! h) u# v   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
2 ~) i+ A, v4 x   temp = 0x00440040;4 z7 P2 u, m4 I' t
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
- R! i( ^% X1 v# k4 n   temp = readl(IO_ADDRESS(XCR_ADDR));
/ T" i6 R4 ~, R5 u% D   printk("temp=%x\n",temp);
9 h& A5 B( ?& @" L/ W0 p  udelay(100);
! |. Q5 x9 v3 e0 d- `# Z, L" Q  //SPCR Register
. P1 L# @8 z1 J4 O5 R' e: I1 X3 ^  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
& ^0 \* B9 w. S, y8 M4 z  temp = 0x03C10001;   //DLB = 0 VS DLB = 1, Z9 L0 I0 v+ _: t$ m) F: c  a0 p
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
/ ^  M* Z& A5 d! a- q9 B% E. m  temp = readl(IO_ADDRESS(SPCR_ADDR));
- [; m7 o1 O: g7 y  printk("temp=%x\n",temp);
& b1 U( M2 O; }8 O2 r+ r  udelay(100);
2 Y$ p# w5 a9 Q6 ?' E( o# z3 |- a; Y' A' m. }  O, h
  //set GPIO direction
; S  b+ Z9 L' c+ M, e/ O3 d. _   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 B! K8 ~# V0 u5 a9 h
   temp = temp | 0x00000100;//EPR----input, Z4 D3 h  ^  i3 v3 l
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ Q2 [" U5 [8 ~% h  b9 ~. N   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
; H+ E5 j6 H; [( P" x ' c! i* e( Q8 G& E9 {) A5 |2 `
   return 0;
3 H/ \3 L2 X5 W2 O}
$ e3 s( d3 s' |6 E& I# ^& Istatic void __exit MCBSP_exit(void)% }6 _& c! I5 z* j
{
) q/ j- b% [5 T, `- m" u   printk("mcbsp chrdev exit!\n");
5 i' t0 u0 U% D. G   cdev_del(mcbsp_cdev);
, Q, Z* x3 |2 r) E   unregister_chrdev_region(mcbsp_dev,count);, ~1 }# G* C6 [/ H- I
   device_destroy(mcbsp_class,mcbsp_dev);& }% c8 K5 ?- u1 a1 P
   class_destroy(mcbsp_class);! L; |+ H% B" B8 ^
}7 e9 W' ^0 V$ B
module_init(MCBSP_init);
( t! ~- n1 t- k% F. Wmodule_exit(MCBSP_exit);
8 }6 _) A; R* ?; u* p$ v& `2 U
% o. d. \* [, A: w$ [: ?1 x3 kMODULE_LICENSE("GPL");9 d" p& Q8 v, g6 n2 C( m  U

0 d8 z& V8 F+ y我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
+ M( o5 s" D& D5 l我的应用层的测试程序如下/ Q9 j8 A9 O  _* O4 J+ q/ r
#include <stdio.h>  b5 w  Q* U/ _
#include <string.h>
9 J+ a8 I  e* _0 a* m* r' q8 N#include <fcntl.h>3 K5 Z" n$ t/ N, s* r
#include <unistd.h>* B& i2 E5 C3 Q9 @# U6 y
#include <signal.h># T$ |% W+ W/ D4 H. p0 h2 h
#include <pthread.h>       //线程& q( H& t9 G( y
#include <stdlib.h>
" q: a1 x0 G8 G- T#include <pcap.h>          //捕获网口数据
. C: }0 R$ v9 O, W5 `) y8 b#include <semaphore.h>     //信号) h5 r; c! T/ z+ y, c4 G
#include <sys/types.h>     //消息对列: c0 z( M. H6 g5 O) b4 `( g
#include <sys/ipc.h>       //消息队列
( \; @. X( G$ z" M  p) X8 W#include <sys/msg.h>       //消息队列
1 F3 \5 p. _: {4 {#include <sys/select.h>
, o4 P8 O3 @7 V$ S0 s5 Z% a7 z#include <sys/syscall.h>  `3 W# B  Y8 M* h
#include <sys/stat.h>6 t' d$ {% R5 E6 v, V
#include <sys/mman.h>, U" M/ }$ ?$ Y5 q6 r, H* e& X
#define msleep(x) usleep(1000*x)
, }& E& i) D9 ^1 S) a# L1 O
2 J$ ]+ k4 Q/ S' Q, P9 A! u1 Jint main()
" t2 N1 `& W/ i- }5 {' w{ 1 W# t) O  {: J. H& E
    //MCBSP,ARM与AMBE2000交互设备
+ I, c, }# e0 j0 m4 v# G int fd;( h$ ~* o3 S& V3 ?) o) i1 {
unsigned short data_write = 0x5555;
8 g* f5 s* p/ J, S/ }0 r unsigned short data_read = 0x00;
( {5 N) B/ E1 F  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);6 e0 S1 }+ y# R6 ^. T
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
" |4 b, y! b7 I' ?+ e9 H   
8 u6 M% P; f% {3 m" ?& ?  if(fd < 0)
) L0 j( r$ @; Q2 ~: v5 J  {3 E: p; L, G$ ^" t8 z
     perror("open failed\n");9 t2 D6 w! a; e6 R
     return -1;
* j$ \6 K2 j, M3 O% v) V3 r  }
# T. W% q/ c: |$ ~5 Z3 L$ w/ N  
, X% b% `1 a; x! t/ w  while(1)9 C5 P1 ]8 S; b7 J. |* T8 x
  {9 I6 r; Y, ~1 b# i/ n& v' w* C( w8 s
   
( K+ k; V4 N9 |2 Y   //AMBE2000每次读写是24个字为一帧! R& O: h& ^- k* `# Q2 {, E2 w
   //写数据时将数据在底层存储起来,等到中断的时候再发送' N2 S4 u0 M% o9 F* ?# X
   //AMBE2000输入数据是以0x13EC开头的- p; n9 L* o. H4 y/ _$ |' ^
   write(fd,&data_write,sizeof(unsigned short));" P# t2 w1 J. `7 U4 g+ z
   5 M: S; w2 X0 \
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
6 D) |' _! A! d# \5 O   read(fd,&data_read,sizeof(unsigned short));
' L$ c0 W, @- {) F5 Q, V) r   / R& b- l1 ~2 {% g
   if(data_read == 0x13Ec)
& D8 k( ]3 a+ t   {
0 e; z7 F! Q/ f% }& A# H  u8 Q1 s   
# H, X  l% e8 j/ s# y# [    printf("data_read = %x\n",data_read);1 z$ y. t: U, S2 l! o
   }
! U. G( P. }8 B, _$ E+ E5 t   / ~; y8 s. [- ^, c
   msleep(10);
6 ?+ q. s3 z# r6 @0 Z( [" R7 y) a4 h  : s! V/ p8 P+ V6 N( g9 t
  /*) }' S5 Y  Z" ~# F5 }* e, i0 {
   ioctl(fd,1);   
( `" L6 |, v" E7 F0 ?8 e sleep(1);
( @6 n: A" ?% w% u ioctl(fd,0);, ^( a: K+ Z$ x! i" R; x
sleep(1);7 l' d+ x( t3 O/ g+ u0 W
*/
2 R% X$ n4 d5 ~  }   ; g' b) o& u$ n4 p
return 0;+ F9 S4 z- L/ j7 d' g  S
- g8 ]% u6 E6 u8 E1 U9 p
}
# D) J4 x' B  e8 C0 M: N2 b
( _9 A; W! n1 O3 Y9 N多谢各位指教,谢谢! 急
, ~- `( l. w5 w5 _1 t# u/ {+ z$ i) i& ]1 u8 b

' l! o& U. M8 V+ V6 @' U, x
- U& a' }. W' j' H6 S8 P0 w( w5 B' C* M! K4 C# U" r
( k8 H% i9 C/ L, U6 k1 j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 18:18 , Processed in 0.048482 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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