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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 0 }6 ]2 _1 ?" M1 Q4 O; b
/*% q* D9 i0 ]. M5 V- Z% x0 \
* Copyright (C) 2009 Texas Instruments Inc! V. Y9 g. M$ b
*
$ h( O) j. v  o2 T * This program is free software; you can redistribute it and/or modify4 R- O/ E, Y9 {9 K
* it under the terms of the GNU General Public License as published by! ~6 b- k% j+ ]$ k: s2 \! q4 c* ]$ ?/ t
* the Free Software Foundation; either version 2 of the License, or% z4 i! |4 k, D+ @* i) ?9 {' z
* (at your option)any later version.% O) P( v2 ^& |+ z- e: _0 f
*0 h- a1 T9 w4 f4 k* s, {
* This program is distributed in the hope that it will be useful,* n! U4 F$ `* k: W. B
* but WITHOUT ANY WARRANTY; without even the implied warranty of9 E, {, B- s) w  P' A2 H  a6 g
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 K4 e4 N3 K& D, ]3 |1 m; D/ ~ * GNU General Public License for more details.
7 X9 l  K7 H8 X  Y6 M3 {" v; c- Y ** Y9 h" t  }# ~3 G+ \
* You should have received a copy of the GNU General Public License" B* T6 T# {; A1 X" X0 w8 t6 q
* along with this program; if not, write to the Free Software, i* P5 O; `; f/ D# E
* Foundati
% G6 z* P8 O7 v' f1 d% Y! u# D3 t*/* P: ]% q8 ~9 A3 @& r# A7 H
#include <linux/module.h>. B' S# j4 f# T' ?
#include <linux/init.h>
4 y9 t% Q/ E# J. k, x) D#include <linux/errno.h>; G& K" Q# R  {( X4 c2 T. h! f+ _
#include <linux/types.h>
- b9 g. W/ X' Z7 ?#include <linux/interrupt.h>
, Q% b4 h2 v: W& E#include <linux/io.h>
, o- I* G/ c# o9 I#include <linux/sysctl.h>
5 [0 c8 I  W3 y5 o$ f! z#include <linux/mm.h>$ {3 C( s* E, q! b5 ?: @
#include <linux/delay.h>
; t3 K; w1 Z  c' O#include<linux/kernel.h>
- f5 B( l, W1 `8 `$ ]0 N#include<linux/fs.h>
/ U' Z7 o" O3 u4 `! M9 }#include<linux/ioctl.h>
4 V. d, W9 e5 O( v" J. C; z' w; T#include<linux/cdev.h>+ ?% K7 e- y$ E7 ^5 x5 P" ]# o
#include<linux/kdev_t.h>( c1 o6 ]7 W! w  K, U; I
#include<linux/gpio.h>% L* x# S8 m; E9 x* K3 \
#include <mach/hardware.h>
; s0 L6 c2 [/ D# S5 i/ E' w#include <mach/irqs.h>
! W0 d8 J. b( T9 R: Y6 h
+ f6 C6 M1 e& U$ l# U: ]#include <asm/mach-types.h>; g$ e* O' v2 t+ H. J  \
#include <asm/mach/arch.h>
0 R+ c* g6 f7 n0 U#include <mach/da8xx.h>+ U1 s7 N  d3 K% ^
#define  SYSCFG_BASE   0x01c140000 \3 x* R/ ~" A* y7 p( r% |
#define  PINMUX1_OFFSET   0x124 * T0 N  m& i1 h: a: R  C
#define  PINMUX18_OFFSET  0x168
$ x* a) I( d* n" F: q#define  PINMUX19_OFFSET  0x16c  m: H9 J7 F9 M( r- f" C) f7 k( q" }
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
# N2 [/ L# O' ^1 w1 \#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
$ Q: S# i$ y! e' n#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
/ y/ P" B) z) o! L4 f#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR( \8 f" y9 D4 V% u5 ]8 m; B7 Q% m
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
, P7 N9 i' r- k! l" ]! W                           
. I; l# L' \) ]$ E# {6 x#define DXR_ADDR      0x01D11004  //MCBSP1_DXR& D/ p- M7 I, P
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
, C  ]! K. ~! X& O$ H& L/ v7 s//PSC* d( R. N1 j: }/ R* Y
#define  PTCMD_ADDR   0x01E27120  2 `% S" Q: J5 z" b( b5 R
#define  MDCTL15_ADDR 0x01E27A3C3 L" q8 q8 s7 a. w1 h
#define  PDCTL1_ADDR  0x01E27304
  e% y/ C  s, p//GPIO8 direction' [5 |+ k4 R3 o  A7 t7 g0 T% Y, x
#define GPIO8_DIRECT  0x01E260B0' a, L8 L8 ~( J4 K8 U
#define GPIO8_OUT     0x01E260B4
5 H& B$ ^& E# t1 v3 J#define GPIO8_IN     0x01E260C0
  t2 u( i& c# h2 Y/ ~
. K8 R. v2 B$ b1 f1 j: P//#define MCBSP1_RINT    99              
6 T2 \6 W+ g( B, U: s6 Q: f//#define MCBSP1_XINT    100  9 R% o; }* |! M: w9 V
static int MCBSP_MAJOR=239;0 K- z! q" ^: T7 d# a8 W
static int MCBSP_MINOR=0;# ]" z# j, l. ^7 R) Q, i
static int count =1;
8 M5 }: L/ b/ e5 G* i/ Y( `; r- r& H2 ?4 ^
#define MCBSP_NAME  "MCBSP-device"
# N! v, q8 k2 m2 J- W" V' Q, |: a# s1 w
static struct cdev *mcbsp_cdev;" ?0 X" B0 \, a$ F/ w. G+ d
static struct class *mcbsp_class;
9 l% U- y* c+ }static dev_t mcbsp_dev;/ M( O; v  L& e7 I  E- G. T
unsigned int DRR_data;7 g& O# a, s) J% r2 E2 y
unsigned int DXR_data;
* L1 X# v  s1 d2 }static int mcbsp_open(struct inode *inode,struct file *file)
" _4 ?5 F$ A# I  t/ |& r{
+ |: C4 d3 _' {0 L2 ^. p   ! I. X$ k# Q; S# K
   //interrupt enable,initialized2 Q& y; t1 K$ u% {
   unsigned int temp;
: X, o+ Q& L$ U* b) F1 U% Z: r& e   //SLEEP_EN(GPIO8[10])---08 X5 N1 |# b( L( b% h
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 |5 }& \: W: P2 ]3 Y
   temp=temp&(~0x00000400);) K/ s# [* X# u
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
* i# a4 ^0 u6 k5 e( B  //RESETn(GPIO8[8])----0----11 w# F! s- w4 p- t9 b% T" _9 c2 ^
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 B3 s9 G, ?1 K  W! u+ [, D" O
   temp=temp&(~0x00000100);0 R, z" G, R  s1 ~, j+ W
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
% \( S! y5 W: u+ B   udelay(100);
5 |/ `/ |6 y+ m* s   temp=temp| 0x00000100;
* E1 v& T8 n9 w" M1 o- g4 P   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; P4 L7 S) ?* k   udelay(100);' B5 G& v0 T6 A* `5 l
   printk("open success!\n");
3 ^, {! a0 W2 B$ z; I2 i   return 0;
# E+ O+ v8 f1 I: Q" D}
& |# @' W& u/ f6 F8 O0 V8 S) H% c7 T7 m/ ?, E5 ]
static int mcbsp_release(struct inode *inode,struct file *file)
' q  M2 Q! r3 u- F4 a! F{
7 D- W( N9 H( C* u( I1 m   printk("release success!\n");
, \* q& _& P1 w0 {   return 0;3 {9 o* z0 \: W' P4 C
}
; M3 {( t5 h$ q- I$ e
7 [4 X2 |# U& H- Pstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); ^' U# l3 F' f) x( F2 b5 }9 Q
{, B$ w1 x! d1 ?' T
    copy_from_user(&DXR_data,buf,len);' s; G8 v" A  B% U! u' H
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
2 x: U- ~  H8 n* c    return 0;6 }1 A" \3 _- \9 T2 _- d1 [
7 F8 G" i7 m# M. ~
}
  y1 X- Y# }6 `3 r8 ]
- @0 T$ @6 e: ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: c8 _, R- {. R4 a$ j; Q, d& |# G' I' A{
- S) \) d1 e$ C. K8 ~0 E" g8 i   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 m( v+ M$ h( {1 `: V   copy_to_user(buf,&DRR_data,len);
! |5 x$ L+ b; v   return 0;
  L  z  A! z; P; B}
. i: U0 r% n! Z1 N7 L+ \' Q( n% e
" w* Y  _5 I  c% B6 D. P4 l- y5 O9 C( I
static struct  file_operations mcbsp_fops=% t5 m* I8 t4 I
{
3 N) e9 A' W! @. k0 G: _   .owner=THIS_MODULE,
' c/ W: v2 w' ]8 p: W" X* x7 R# b   .open=mcbsp_open,
7 D2 x+ I/ y4 v: J* i5 Z. L   .release=mcbsp_release,0 H4 m8 H2 I" R
   .write=mcbsp_write," A" q# M* D! T: S8 g
   .read=mcbsp_read," d+ @- P2 T4 G2 l% D
};, n' \& {0 e3 t7 _2 ~( v: h
static int __init MCBSP_init(void). W# A, i4 a7 Z' f1 O$ A
{3 k2 P. [' P0 E4 M8 h
   int ret;9 H" O. w9 t0 i2 d
   unsigned  int   PINMUX1_REG_old;  X0 p2 m: o& _/ @/ J/ U( R& E9 _2 @
   unsigned  int   PINMUX18_REG_old;* f# Y. K8 q* H& V6 O
   unsigned  int   PINMUX19_REG_old;
3 B6 c2 u7 @, l, ?/ ]7 j- u   unsigned  int   temp;  $ z' T* x4 M# \( w8 x- H/ U
   if(MCBSP_MAJOR)
' B7 R/ i1 _+ h7 s, L1 o   {- i: _" K, d+ |" T7 K7 ]
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
0 S4 B7 a9 T; ^8 \      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);5 J: k5 \4 o' [- t$ H5 ?
   }2 v% {9 N: P/ f3 c7 U  ^2 v% e( y
   else
: b; R" G1 a+ x$ v* j) b( R   {
2 g2 e4 P: b! x; ?! ^      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 n0 p" m. ]1 o+ ?6 V  S
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
) l- W: h, N. c& o: v& \+ V9 b& l   }
9 R& Z0 e; R3 \   / p2 E- m2 q8 X' G# j6 y% y: I
   if(ret<0): }- s$ x  d. k4 u. r/ F3 v9 w
   {
0 w5 o! i7 t# I+ j  ~) m" L      printk(KERN_ERR "register chrdev fail!");
4 O( y4 l9 d$ U7 K/ w- H: _      return -1;5 K" `- B8 I+ \+ l8 {  J8 I
   }
% A) U3 V$ U" `   2 `% L! w2 H; V; @7 T+ V" [4 U% D( O
   mcbsp_cdev=cdev_alloc();
9 Z: D- {! x6 Q4 k  |   8 M7 o) x* ?/ J- A( X8 m0 T" d
   if(mcbsp_cdev!=NULL)
. J3 _" x" U0 b0 s   {  m8 j# J) }3 C4 P4 n
      cdev_init(mcbsp_cdev,&mcbsp_fops);
3 }7 T0 W: P5 s      mcbsp_cdev->ops=&mcbsp_fops;. p8 q. G  [, N& n- h
      mcbsp_cdev->owner=THIS_MODULE;
' R9 ]' s4 G9 K5 g4 S; T      
$ T9 B$ J* e( P+ e$ B. I8 M' D      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
1 f! I: V! N" H& O# O          printk(KERN_ERR "register cdev fail!");
5 L$ l, @. n: y. H      else
$ v' m  Z0 A- n7 f          printk(KERN_ERR "register success!\n");; v. ]. L$ k3 h5 [
   }/ n5 D5 [+ h. t* S6 e
   else1 D2 j( F  _% @" R( n
   {
# K! X: C/ U; L) Z      printk(KERN_ERR "register cdev err!");( {+ V5 |* D/ o. l9 p
      return -1;
9 v: D. J$ |8 H) l" a; T% I: @   }
4 |8 s1 `/ X( K+ y   5 ]6 X* X8 K  R$ O( P; @4 S  b
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);9 x' `2 F/ N- N; o/ F
   if(IS_ERR(mcbsp_class))* i7 }! y& N1 l, Q2 t/ L% p
   {. K- y0 I+ l/ ?
      printk(KERN_ERR "register class err!");
' v+ l3 Z9 X% q! }   return -1;) E  T; M2 P; L8 s7 D+ T( W+ ~
   }* C; }5 z( J/ |4 }% {6 q8 o7 v/ Q
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ T( `+ {# w- N/ K' I
  z" C  s7 F; B   //PSC
7 J7 c5 n, {; r8 x+ W7 W9 P   //add Enable MCBSP0 t4 y1 H, A' x& L
   //test8 G/ o. ]  j! ~
   temp = 0x80000003;) }/ t" N+ Y3 c5 P. z$ W
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
2 c% c  b, W# [$ f   temp = 0x00000003;
6 n, O1 `: K  {6 H* E5 G   writel(temp, IO_ADDRESS(PTCMD_ADDR));# I, p0 I, T7 Z: V9 _# U

" m7 [0 S4 g  H+ q   temp = 0x001FF201;
6 @+ j7 z- e# f5 x2 {1 L   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ @6 z0 e; r9 o# T3 e4 a   2 g# K4 h# |5 y
   //PINMUX  
; O! G* L  s) I0 O! A/ [   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
8 S% f- N0 {5 K( R7 T3 z   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
  S" ^* I+ e) o0 e8 ^   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
& V2 {9 f! E8 L/ ~- B8 L/ M   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ Y5 Y( e5 m" r9 S. ?9 \1 x   : U6 K" q" P5 @3 c
   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 N5 `9 U% l# P: @# l: y+ ~
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ( P/ l+ O! X0 W1 t
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
3 y1 C0 m+ n( d   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
" a2 g* s4 i  D: P7 W% g
' f7 V. z$ S2 f6 h5 J* @( O   //RESETn,L138_SHK2* ]/ b0 b" ^! Y3 X) e6 P
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
/ B5 R$ m& \" P: [' r0 O2 t   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
' n  n$ W% [: D4 @   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# {: G  P8 H# O( w/ b, J) Y
1 E6 N  K% t; H" P) z
' e5 e2 H7 G- N- v4 \3 Z" w+ P
  //SPCR Register: F- R, R' O/ r" Q. n, L. r" U& ]
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 Q  o& k3 ~5 L4 N/ \  temp = 0x03000000;//(DLB=0)
. O3 Q& {/ I* v7 \: y" i1 L6 _ // temp = 0x03008000;//(DLB=1)
+ O( p; L6 b0 c% m5 d4 P  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset+ E1 O# g! y. Y! i( l4 o% r
  temp = readl(IO_ADDRESS(SPCR_ADDR));; p. X* G, L) S1 l9 C8 l
  printk("temp=%x\n",temp);
7 X; n; O# c: k1 @% A' }1 M+ c / N) m% y1 W+ J6 r# D# [5 x
   //PCR Register
1 K6 X- Z. d. ~- E   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
: O( R4 K6 B! z9 ~9 ]5 Z9 C  // temp = 0x00000F0F;
2 f) I: C; X3 h3 S  temp = 0x00000B0F;8 {! Y4 ~! K! ?' O6 B/ y% a9 ], y
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 2 w$ K! h+ a" f5 r$ ^" v6 F
  temp = readl(IO_ADDRESS(PCR_ADDR));
5 s9 A9 ~% j: n# d) N/ `2 F7 k' u. p  printk("temp=%x\n",temp);  
- }& W8 }) p, V  b4 G   //SRGR Register
1 J( s0 }# L0 U7 d' u, ?8 K   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11. c& \! k7 z$ F/ v7 E
//temp = 0x301F000B;
# x+ y& ^3 m$ ~' o   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
! G3 {+ Q: S( R  temp = readl(IO_ADDRESS(SRGR_ADDR));. e6 N/ P6 f) ?  a+ E( a& z4 c
  printk("temp=%x\n",temp);
  U6 A: \$ t- h1 m1 U  r   //RCR# Y" {/ K0 p' v+ W, ~
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: D# S6 W( h: l3 B  i   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
. R/ F: v2 P7 H: `4 @0 [   temp = 0x00440040;
, E. a8 Y" o& v7 o* V1 c% K   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
9 r, n6 c. m  H" B" _   temp = readl(IO_ADDRESS(RCR_ADDR));
, @8 [* R) f7 d% z: ^   printk("temp=%x\n",temp);
6 u* @& n& z. V+ W8 y) F$ @   //XCR
8 U1 f! U$ I* x   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
; x' S3 ?+ O, q  P% n+ o  U   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
/ j% W' w2 z! Q  `   temp = 0x00440040;
& a( j& f7 c+ R; @   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
( M# v8 Q: m2 \& r) u) \( ?   temp = readl(IO_ADDRESS(XCR_ADDR));) G3 l4 E" k# {5 {& O7 x+ ]
   printk("temp=%x\n",temp);" q" o( Z4 k0 E! j% L  @; W; Z
  udelay(100);
. r# F* k4 j7 E2 X  //SPCR Register0 k! {# @, V: E  O  L# v
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1& P. F) W* s' Y+ n
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1% k" O* \) p6 u" ~+ U1 x& u
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled# {  A# m9 S% a) L, |* }
  temp = readl(IO_ADDRESS(SPCR_ADDR));
6 X4 h' \$ Z; Z) t  printk("temp=%x\n",temp);! v4 U$ K0 _9 J1 A* |0 r0 |
  udelay(100);& o7 w0 u9 b0 W* x. U) o" P0 R* F

: O, X& s4 k6 h7 {( E4 j  //set GPIO direction9 _' |, S+ W) z/ x  K, \# ^5 o
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));" E: K- J0 i: w& Y4 l' J
   temp = temp | 0x00000100;//EPR----input% k: R' T" [2 [
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
9 _( `6 P3 }) f% g8 m$ f5 |) l+ e   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 d( P$ s$ Y6 s
- k+ y0 r. c/ y0 u2 I
   return 0;
5 F# Y, A9 o8 I' N& V) }$ @; k}3 J* J: E& Y2 f  ?/ D
static void __exit MCBSP_exit(void)) D; L' p2 Y1 k' J5 `. |- m
{
& u* C& @$ G4 u   printk("mcbsp chrdev exit!\n");
- v1 n. I4 w6 e& B   cdev_del(mcbsp_cdev);
0 K8 n/ b% ^; n& ?$ v* H9 w* l   unregister_chrdev_region(mcbsp_dev,count);- G/ u8 v, m9 _0 h8 y
   device_destroy(mcbsp_class,mcbsp_dev);; |2 F+ c0 e( C5 J9 T) u% h. O3 X
   class_destroy(mcbsp_class);
, p2 G( P! N7 k3 W}0 ]3 F8 V7 Q) K& n
module_init(MCBSP_init);! j) U4 B$ U3 U( A8 L/ T
module_exit(MCBSP_exit);
- J! v* k/ X# V8 A$ E
- v& L1 f: r* y, {$ IMODULE_LICENSE("GPL");
; @0 J$ K" G) p: y
" B6 Q, y' Q7 H% {# `5 f我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* D% g* M4 V( A4 U
我的应用层的测试程序如下& B7 Y: W- s7 f  ^7 `7 G6 a
#include <stdio.h>- o4 X7 M! l2 \1 b- s" R$ m/ J
#include <string.h>6 ~7 w# Q" o$ q
#include <fcntl.h>( e, `8 ]* J; {. i( }# \- i; Z
#include <unistd.h>9 |5 T0 l6 D8 M' x
#include <signal.h>
5 b% `8 \; j6 W, x' o, [1 p- Z' ?7 a#include <pthread.h>       //线程7 y8 Z6 X+ R( A- t
#include <stdlib.h>, W" C8 X/ G/ N; y# ]
#include <pcap.h>          //捕获网口数据
4 X) Q; ]3 R% p- H#include <semaphore.h>     //信号
3 K. V+ \1 {2 f#include <sys/types.h>     //消息对列, i: s  t  m4 L1 w1 {
#include <sys/ipc.h>       //消息队列& {( F2 J: x: G' {/ y' O
#include <sys/msg.h>       //消息队列7 b4 k1 p, @0 e( k6 E# v
#include <sys/select.h>% `+ Q, _$ V: L6 x; Z5 a) y( o5 ?/ Y
#include <sys/syscall.h>
6 p! k) r: V# s2 v# q#include <sys/stat.h>
* l! Q* z; l+ B5 Z1 E#include <sys/mman.h>  W4 K, l1 R; O* ^+ ~9 e
#define msleep(x) usleep(1000*x): H+ O( ~# o" @: A& r$ ]8 f6 a9 r
$ @: B7 s1 D( N# Y1 m* Y
int main()
3 G9 A& ?3 Z  ~$ u' e- @4 ?$ g{ 5 J7 [7 }6 h5 ?: s3 y) j
    //MCBSP,ARM与AMBE2000交互设备
7 Y9 G8 j5 j; A6 L( w int fd;  |( v8 A' J( F: x
unsigned short data_write = 0x5555;' S8 ^1 t- m, x7 ~; U8 l
unsigned short data_read = 0x00;; W& H8 w2 P7 J- p
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);3 q9 v* ~$ J- W" B
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);* \; S) ^% D1 a1 L$ O
   
+ }+ S, R1 X& m0 Z: S; W3 i" r  if(fd < 0); D$ T+ v. A- P) w! z/ _  d3 c  ?
  {0 ~  z6 @. u. B
     perror("open failed\n");
4 W( L" |8 {! H0 ]     return -1;8 m  p+ J& W- I5 l1 b
  }' e* a, @" U- B9 P9 c: I9 S* t  E
  
9 K' L* Z0 U8 t& `7 Z  while(1); d% `9 T' [& f5 J$ @& \  p/ F
  {
$ ?, S* a8 ^- n2 e   / ]" l; A8 k( b8 {( C$ w
   //AMBE2000每次读写是24个字为一帧
7 C1 r4 Q- a. |9 N+ |   //写数据时将数据在底层存储起来,等到中断的时候再发送- B7 ~" _9 P0 z* s0 V9 y4 [, o" q
   //AMBE2000输入数据是以0x13EC开头的# D' c6 I4 S+ k$ n# s. L9 h
   write(fd,&data_write,sizeof(unsigned short));
- Z; O2 l4 [7 k% p   
4 k, _9 G0 e, i: |: F; |   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
4 c3 S! m6 m3 S$ g! H" V   read(fd,&data_read,sizeof(unsigned short));7 x* e% D0 |7 ]6 V
   ! U. W6 v( B+ N% j' }+ y- b
   if(data_read == 0x13Ec)
$ q8 w) ?5 r9 n   {
* N9 t6 R$ ~' O! S8 f* \   $ y, F& S. x0 z7 {
    printf("data_read = %x\n",data_read);
6 x% |5 ?- k$ V' p& k" @9 t   }  e, e* A3 d7 _+ l0 }; x, |
     B- o  ]5 m$ r' h4 p
   msleep(10);+ \* {" U# D7 w
  
. N7 _2 B' v7 D) G  /*# D, Z+ w- m" T3 W. R4 |
   ioctl(fd,1);   
  Q/ t' |' w7 q3 |1 y) R0 R% G sleep(1);
3 z# G8 _0 E) S  T& W ioctl(fd,0);
2 K1 W: i. W+ w  d, R( M( o( } sleep(1);
# }; a- ]5 \, T2 K: ], J */
: }" g* I3 B, G  ^  }   $ B* \! J( Z$ v4 X
return 0;
; {% t$ d% }+ Z3 E, Y $ Y) R& `: f. N6 [8 j
}2 S& D* @' _( @  P  N

. [' A; v" N8 g多谢各位指教,谢谢! 急
/ a- X4 V3 y1 g1 r5 L: B9 P; w8 f5 Y$ A
0 B4 c! @3 ?9 T

5 B! }% E1 V( ^( r) P9 r( r" I7 ?3 U: E
( I! y# l. Z) o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 11:15 , Processed in 0.053107 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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