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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# W/ `+ {) G& |  b5 T/*
0 s) G" M& [" @8 T6 p * Copyright (C) 2009 Texas Instruments Inc) u- S0 ^9 g2 P0 s! `& L
*4 q5 m% B: w. T
* This program is free software; you can redistribute it and/or modify
9 _/ e" C, b: d- B. _" p- D * it under the terms of the GNU General Public License as published by
" K5 b1 Y% O0 _* U% M * the Free Software Foundation; either version 2 of the License, or
$ t% z9 F3 T9 z% y# T * (at your option)any later version.
8 @' P# u6 Y  c1 X9 h! P+ _ *
% z4 e- M! M! S2 i" V  |/ z * This program is distributed in the hope that it will be useful,
0 p7 `: y5 d$ o% m& T; J  l * but WITHOUT ANY WARRANTY; without even the implied warranty of+ D7 r; F$ W  _& J) F* r
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the7 o# n, g* N5 O3 e7 V9 i
* GNU General Public License for more details.
) B) M2 {- X2 n4 g5 Q *
  l* D/ c  l: u, G4 p. `% z * You should have received a copy of the GNU General Public License
4 T( N5 G# l8 D5 X- M8 m/ p * along with this program; if not, write to the Free Software
  h6 k! T1 M" W  F2 _9 l * Foundati+ |9 S- l! X0 M9 Y+ ~
*/! K: ^/ [5 Z8 W0 ~- N
#include <linux/module.h>+ @/ {( r4 t& j/ g$ o6 h0 Y
#include <linux/init.h>
. d7 O5 g% {4 L" s, Y9 `" T#include <linux/errno.h>* J3 a& e0 j9 p/ j" }! p8 d  r. ?
#include <linux/types.h>
" R& ~: J3 f5 M/ Q% }8 Y7 r#include <linux/interrupt.h>
; p( k7 w; H" d- Q% `. f#include <linux/io.h>* b$ v) i+ t3 r& k7 F1 h& e
#include <linux/sysctl.h>7 ?& b& t5 C' r# ]9 Q
#include <linux/mm.h>1 S, y! x/ D; M) g# a
#include <linux/delay.h>
- C3 V: r) y# H0 ^' m4 Y5 X#include<linux/kernel.h>
. g4 R9 ~# v" \2 t" N4 F# d#include<linux/fs.h>* u( R6 [$ v) r1 I) S% j& c/ S
#include<linux/ioctl.h>
) \. b1 J0 i- j#include<linux/cdev.h>
1 i; b" ]: d& _# \% [#include<linux/kdev_t.h>3 e% `3 g4 z/ L! n6 J0 r0 s
#include<linux/gpio.h>
3 S  C- t: z( h7 [( d7 v0 q#include <mach/hardware.h>
/ o+ H1 P) D4 E& J8 U#include <mach/irqs.h>
( o  b# P/ p1 e2 i% j" l( q  A& h0 ^$ G
#include <asm/mach-types.h>
7 h! b5 }+ X$ I0 E  ?#include <asm/mach/arch.h>. G9 {- o* ^% R( Y9 U0 L6 t2 }
#include <mach/da8xx.h>1 I( Z5 Z; M: \6 @5 C2 `- M
#define  SYSCFG_BASE   0x01c140006 j5 N, z" X8 [! M: Q
#define  PINMUX1_OFFSET   0x124
$ _1 k3 _- A1 u, A- u) x0 t, `#define  PINMUX18_OFFSET  0x168
2 ~+ ?  C+ [9 T7 V/ B6 ^4 Z  |9 k#define  PINMUX19_OFFSET  0x16c
  e& U; I6 l9 |& S$ D, h#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR! E  g% V5 n! H3 P5 k
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR: g* C; g# q" d! j+ s
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR& h( r9 i* s: b* v7 C* M* i) r3 F
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
6 H# m5 i: H; m7 B/ B3 k& h& ]. I0 X#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
+ p& V" \8 P: r: g/ J  c/ {                           
8 Y) D$ V! @: g  `0 ~' ~6 m#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
0 F" P4 k1 j  a8 M$ d#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
- b/ ]2 p$ H( H8 f//PSC
; a8 _6 k7 O5 E# ~. |( y; w/ _$ `#define  PTCMD_ADDR   0x01E27120  
3 U5 ?! q% C4 j, d& y# v#define  MDCTL15_ADDR 0x01E27A3C" Z# ^. j. _' s! E$ ^7 J- {; n- k& j
#define  PDCTL1_ADDR  0x01E27304* d+ e/ N9 v. x* z' @( c3 {: \
//GPIO8 direction. w" t2 O) }( u$ f# i
#define GPIO8_DIRECT  0x01E260B0
+ M- z0 e$ t5 i#define GPIO8_OUT     0x01E260B4# r0 O. C5 x( H8 t3 L* Q1 Q
#define GPIO8_IN     0x01E260C0
2 i0 p* f; L! c: H& Q' y6 m
& X) O4 y, G0 W: e6 `" h  Z0 ~//#define MCBSP1_RINT    99              
4 }" W3 o( [9 v: g5 Q" t0 {) D//#define MCBSP1_XINT    100  2 ]. [* }! q8 ]& y
static int MCBSP_MAJOR=239;+ K5 C. B4 n# _) L( Y- G
static int MCBSP_MINOR=0;% [" k  E1 m5 j3 A
static int count =1;
5 k/ R# D. V6 l+ a* j; v3 ?
) `% s/ v9 B, [" g( T# Y#define MCBSP_NAME  "MCBSP-device"
$ @! {' l( y4 w! C
6 \2 L& ]! I9 ~! P, P, _static struct cdev *mcbsp_cdev;! O) W" M( \: N% D! R6 o% O) i
static struct class *mcbsp_class;
1 q3 \  F! d+ m' Z: c' lstatic dev_t mcbsp_dev;
/ o6 r8 g0 P& eunsigned int DRR_data;& f9 o: D0 k2 D) m: A, i
unsigned int DXR_data;4 w, n5 }/ n( F5 u7 V$ g- M
static int mcbsp_open(struct inode *inode,struct file *file)
/ w" L# O, k  n1 M$ `{
+ O: @/ j1 O/ J4 a   ' u5 ?. n' f3 Y: @% W4 o. v
   //interrupt enable,initialized
8 e* ^+ ^- O2 f  Y9 N! u   unsigned int temp;
$ b% q1 f9 X- U# }$ [   //SLEEP_EN(GPIO8[10])---0
. W/ W$ B% K. L& p) @6 G3 `2 n$ u% }   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 C$ o+ n0 H+ s, \+ c2 D: P2 W4 W   temp=temp&(~0x00000400);+ Y8 o! c8 o4 e
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
7 ?# B/ e; O0 R0 B  //RESETn(GPIO8[8])----0----1: t) F, B& q9 f$ W4 H6 R, ]' Z3 q. t
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( v: q! T& O8 `6 P
   temp=temp&(~0x00000100);5 z# r1 [* H; p; t- r; ]
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0; b5 K' G, Y0 u/ o; o7 O
   udelay(100);
2 m0 j2 }+ }3 z1 z$ Z% c. t   temp=temp| 0x00000100;
3 I3 k7 U$ s( y( ]   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
) [2 ?7 D8 @0 C. _- r   udelay(100);
$ Q' ^) l( q& L( U4 U/ z4 Y6 x* J/ k   printk("open success!\n");; O# Z( f, T% }# W
   return 0;! s7 R) n, I: }$ j. K
}
- R) c1 S$ y4 U! p9 `5 K
: S8 L5 k* y- |% F4 o6 sstatic int mcbsp_release(struct inode *inode,struct file *file)) j# M* l/ J; i1 {6 w0 }- ]. `
{1 ~9 d+ H( u$ w+ K! F
   printk("release success!\n");  y8 M" |- b3 ]' u! X
   return 0;
6 q) ^4 d# V9 V3 P4 R3 C$ G5 g}
# ]; i/ }* w9 B% k: q
- a$ F& U) Y. r4 Y& r" M8 cstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ }; y& S& R- y+ `+ @% h
{
5 N! _$ G1 J1 n    copy_from_user(&DXR_data,buf,len);
& {, Y  h. B8 P, z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       % [0 u( j! c; h8 Y
    return 0;6 H, \5 w- i1 a! j- A6 S

6 g6 Y  x% P& \0 g, c1 [}* H1 e7 R. {6 Z
, l# L% z9 _( V* C# @
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
  z9 j1 L& @0 D# K8 H{ 2 D( d( Y3 C5 R8 @/ y2 C7 A0 e' w& h
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# ~' o2 u' R# o7 P: H   copy_to_user(buf,&DRR_data,len);
$ e; ^0 t+ W9 t% u- u* D   return 0;$ I+ s7 Y, U/ B+ C1 S2 B# g
}( Z  Q, E+ F6 k9 c; k

" P. }/ V1 j8 \4 t8 q! u5 ]% S3 l! g: z) Y3 m* z& ?
static struct  file_operations mcbsp_fops=# r6 M3 O6 G2 E% K& Y% L! W
{
0 |  v* |! F1 `- @- @% }1 r2 e! X, ^   .owner=THIS_MODULE,
* H! U& M$ X' N5 v0 ]. ]" ~, s   .open=mcbsp_open,
) P: g/ [3 ]" b   .release=mcbsp_release,
8 d8 V+ l$ k$ ~* H3 q# z2 h   .write=mcbsp_write,* M" x* M9 e0 u
   .read=mcbsp_read,
9 B' q, K- d/ c+ s};4 z, w# g% l5 G0 c3 V
static int __init MCBSP_init(void)
9 g7 {' ]( n, O0 v) _) b9 Z{
. k5 B1 A, G8 ^$ ]3 B* o4 Q   int ret;
; o7 R0 ~0 V# F+ \* j" C% `  t   unsigned  int   PINMUX1_REG_old;
8 N8 K3 `6 f5 ~+ Q4 @   unsigned  int   PINMUX18_REG_old;; b5 {  L' g) V
   unsigned  int   PINMUX19_REG_old;" j6 g3 Y- v2 c+ F5 r- k
   unsigned  int   temp;  7 |( w% }, a5 J; m
   if(MCBSP_MAJOR)9 l6 e  C8 X7 @# N  j
   {
8 V4 X  k+ F: y% z      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
3 g2 {7 F' O, M3 K4 [  ^4 t2 Q      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
6 n! {! E8 U$ A   }0 ]& _4 e: H" T3 M2 V
   else
2 |8 Z3 M7 P+ A8 f( c   {
' Z4 R& o% D7 h9 x% C      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 v& z& w8 u- p1 {
      MCBSP_MAJOR=MAJOR(mcbsp_dev);4 j* Q% T: @7 x( T
   }2 c1 Z# H5 s: s; C
   
) ?% J1 N" A" l4 X" h  }+ |# d   if(ret<0)
' L" \5 n; u$ `4 W   {
1 e& I2 K* A6 Z      printk(KERN_ERR "register chrdev fail!");
% }6 y, j2 [) [  {5 a0 v      return -1;* s- e" s8 Q8 `% G1 V, M$ h
   }
  p4 F; @. m8 ^+ X* W. Y* B+ z   
. T& D4 H' i( b   mcbsp_cdev=cdev_alloc();
/ }2 N2 m, l: F0 }2 C+ ?   
+ s2 Y5 y2 W& y" k  d   if(mcbsp_cdev!=NULL)
& d( M' ~: T! p5 J2 C( R8 O   {
- t6 d! Y( n0 S( Z1 e0 I! Q      cdev_init(mcbsp_cdev,&mcbsp_fops);& V$ ~& M4 M5 N9 |
      mcbsp_cdev->ops=&mcbsp_fops;5 W0 G$ B. v: G  M, T2 H
      mcbsp_cdev->owner=THIS_MODULE;( ]0 G2 O, \; w. X
      
& A( z+ e$ J" m' h, V      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))' P) z1 l$ K( w" Q  S
          printk(KERN_ERR "register cdev fail!");3 w: K: N- `+ ?0 X+ u8 e
      else
" E6 l! E& i: s' x. H          printk(KERN_ERR "register success!\n");: p3 w, J6 ^& k8 o  S( `
   }
! D4 U! P2 W# F4 f   else, z: x! O6 ]8 Z+ J
   {
* ~8 o" @) e& }7 e+ E! b( |      printk(KERN_ERR "register cdev err!");( o$ z7 {; e0 x6 A
      return -1;! a  J8 J8 m; Y* g& W# ]2 @
   }
% {' s+ O: |5 O* }0 G1 O   
* v( z% A& }' m  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* d  A/ F  V( D, c# K
   if(IS_ERR(mcbsp_class)), M$ f- U* A) A, t6 q' Z
   {
- O" y: d1 n  ~0 M, n1 c      printk(KERN_ERR "register class err!");: O# }- s5 k- \6 {/ P0 q+ Z
   return -1;
# H6 e7 B, G/ D$ T+ a) R4 k   }0 Z/ f7 d2 D# y; a& ?9 M& b% s
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 @- v2 T7 C) B5 ~* x7 A

# E* y/ O+ o5 x6 W( l- f- n1 y   //PSC3 [/ k# p  r3 x: @/ }
   //add Enable MCBSP
* d, r& \6 _, K' ?' B   //test5 f& O' ], R7 O* M& H1 Z/ t/ {
   temp = 0x80000003;
3 |$ c, b: R# B9 t   writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 K& r: I1 T2 {1 L( D
   temp = 0x00000003;) s+ f+ P% o* d" g" E( ^1 Y
   writel(temp, IO_ADDRESS(PTCMD_ADDR));; R& K7 \  ~! k1 |/ m

+ h7 f2 x$ [# K, W% \   temp = 0x001FF201;' ]- v9 X2 j+ W, c( d# i
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 P" D+ L4 _2 z: v4 Z( M   ! U3 N3 C3 E. E. e
   //PINMUX  % F! z+ q3 ]! F) D' [9 y
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
- Z/ t+ Q% T3 P; t   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  5 G4 x! U% M8 V1 T+ C) ?( a
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   , g1 {1 e, ?# X4 a" ]3 l
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 R5 o. o/ j8 |
   # m6 ]# K8 C+ _+ u- k
   //SLEEP_EN,EPR,L138_SHK1,L138_RC% m2 C0 j- [/ @4 Y2 P9 L
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  , \( e. Z& L7 p4 t: g4 N$ [
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
7 c/ [+ ^2 P6 q2 X; U( \   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);5 e+ [1 X3 N: S
: g  k* S% G0 z9 l0 g4 W. E
   //RESETn,L138_SHK2
8 l! [5 R) u- O* E+ ~   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
9 L) Q8 l4 G) p) F   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   $ N+ D8 H# ?# Z  n" ]/ }
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ ~9 |$ S" G% u
  @9 F0 [5 K  b' k1 S# W
6 t0 W6 V  d* t( G
  //SPCR Register
" F; g- {' m( ~/ N* Z7 P( J" Q: V  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
) n3 W" @5 q; }( }! u6 |6 ~+ [  temp = 0x03000000;//(DLB=0). q7 f5 U8 n: C) V2 ~7 I
// temp = 0x03008000;//(DLB=1)* Q8 h2 u! `) ~4 s' j: p! B* r+ n! A
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
  \5 k' q. R  O1 L3 U, ~  temp = readl(IO_ADDRESS(SPCR_ADDR));: H& z0 w. d6 H7 N( f; S  T1 p$ \
  printk("temp=%x\n",temp);% W# x+ }( Z% y
: q, R: `6 k# P" `& A( G' U
   //PCR Register
4 ^( W1 J- j8 B1 Q% h3 F   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0& j# ^) {% b8 R* }
  // temp = 0x00000F0F;. \* ~2 U/ ?$ b
  temp = 0x00000B0F;
1 V; s% T% s5 S6 d  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
9 Z4 q; x( {- W! B  temp = readl(IO_ADDRESS(PCR_ADDR));! d1 _" A% R% a6 t. G6 S: A1 B
  printk("temp=%x\n",temp);  
( P, Z1 I0 i7 Y+ N2 R8 N, f   //SRGR Register/ s2 i( h) A, _8 O
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
' Y" q& k4 b, W( b //temp = 0x301F000B;/ w. H) h: z' R
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized & k, ^; N2 N9 O. H, B
  temp = readl(IO_ADDRESS(SRGR_ADDR));
/ {6 i$ {3 {6 ]  printk("temp=%x\n",temp);
* Y, l& K3 s% W  |- p   //RCR
& W7 F/ x# d( V3 y% n4 y: {' L. l   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,- Y8 Z5 m# Q8 R0 k* U
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 Y0 Q7 Q! c- [- Z3 S
   temp = 0x00440040;) ^( x9 }$ n$ a0 f% v
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
  {6 v* J5 c6 o; H7 a+ `   temp = readl(IO_ADDRESS(RCR_ADDR));
: x4 q1 w* \5 T5 ~6 l1 a   printk("temp=%x\n",temp);
3 u6 p! }' s8 g6 _6 B: r   //XCR
7 N0 ?7 k6 Z- M6 W! B6 Y& u   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
) a, a! ~/ ]( P   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 Q. `# ?5 z9 M: o   temp = 0x00440040;) K8 R$ c  b, O$ l% @
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   : E* d% D% p# D7 V- h  }- Y
   temp = readl(IO_ADDRESS(XCR_ADDR));
' C$ o7 R; G% e' O/ z) \   printk("temp=%x\n",temp);  B3 X+ t) P$ m2 b& w) G! Z
  udelay(100);) q  [9 M- c/ }  \
  //SPCR Register
# W* q7 S. I; y  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
3 t  Q+ U2 ^! U% t; R  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
  K. V* X7 v1 D, O2 T# w+ d' ~+ k  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
2 \- s/ _; X+ j! Y# s  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 U1 l& G8 I/ V$ g; u# j5 A# C3 P  printk("temp=%x\n",temp);
0 R  v& `" C0 e. _# {6 P  udelay(100);9 h) S3 N, k4 a" }, F4 o9 h, p

# W4 {5 \% [& ?# u& G, V  //set GPIO direction1 S  M  V. I1 z' j  [
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));, D2 W$ J# v' Z) T
   temp = temp | 0x00000100;//EPR----input, K% C* ~4 L% |# j
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output( z& w2 M( u  G$ j# j
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
" x0 u$ b  z! A; p) A3 U2 I0 Z
1 M) W3 A% z) H% N- ~/ Z   return 0;) o1 I7 p9 y, V1 g  v3 h  O
}, ^, a0 |) y9 q
static void __exit MCBSP_exit(void), K9 D( ~0 E' }
{
# x5 M9 V1 G, o% T5 y   printk("mcbsp chrdev exit!\n");
% [0 R) ^! B: @% [- `   cdev_del(mcbsp_cdev);- @/ @' h6 _- u6 p$ J; S0 D
   unregister_chrdev_region(mcbsp_dev,count);. [# c0 A0 `$ t4 w5 B' R# V
   device_destroy(mcbsp_class,mcbsp_dev);
$ h: m$ K+ c' c$ M8 e: h: l   class_destroy(mcbsp_class);
. b2 E- z3 O/ {+ [  e$ d* C}7 u7 ~2 {9 j7 u! J( Y1 n
module_init(MCBSP_init);
6 I# }" ], }: Q( i6 H6 C) Hmodule_exit(MCBSP_exit);4 I5 E, w% d- D3 ~9 I+ C

. R8 M' w" C8 K) bMODULE_LICENSE("GPL");7 ~0 H) p# g! g0 L* S9 y

& Y% U/ E! d) I3 c- X. q, y我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
- W0 U% v  `; S0 y我的应用层的测试程序如下" w0 P' P: q- i4 S2 k8 g( `
#include <stdio.h>
# W% [% u, F- l# }7 F' I! r. [#include <string.h>0 _9 t0 K6 ~3 M' S# ?
#include <fcntl.h>2 @& k7 C& {# S8 N" J1 Q
#include <unistd.h>$ q3 D; X+ w1 R( B1 w8 Y& S
#include <signal.h>
3 K/ B, T* K/ [) v#include <pthread.h>       //线程3 \& s' K' i# r& K
#include <stdlib.h>
! }# V  S2 P$ X4 H#include <pcap.h>          //捕获网口数据
7 N- z  M/ V" k1 _6 G% M#include <semaphore.h>     //信号4 P8 \4 \' A+ G& S- D, }) m
#include <sys/types.h>     //消息对列$ ~: z, Z; Y9 n) c
#include <sys/ipc.h>       //消息队列( w) j6 n$ q& V9 r
#include <sys/msg.h>       //消息队列
5 P, D, @4 L* Q( v& S4 d. {#include <sys/select.h>
# }) q3 l2 w7 Z( c7 c, e1 j#include <sys/syscall.h>
# ?: C% h2 l9 ?# u" }; U#include <sys/stat.h>
. z1 W' j  H, X% E; K0 s$ ]#include <sys/mman.h>% O7 q# L# V; M" ^
#define msleep(x) usleep(1000*x)
! s' t6 Z  s8 t! U: j9 f5 e% n0 I+ D" _  S. ^
int main()3 r9 ~( a7 W# K/ x+ I5 O
{ 1 c( F! ^; P* z
    //MCBSP,ARM与AMBE2000交互设备: [$ Y# A: g9 w5 E( R; a
int fd;
  P; V4 s& R4 A; K4 b unsigned short data_write = 0x5555;8 v# v: i7 V8 G: {% _3 l) q
unsigned short data_read = 0x00;, a4 ^( \% p) j1 W
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);# ]8 _" b) M) t5 L
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 p! `( k$ ]" E3 ?& @    0 d% v& o# `3 z: `& P+ m5 [; b
  if(fd < 0)
; {1 L( l/ m7 M( f9 k  {7 I3 C: S2 |$ R  S! X) S
     perror("open failed\n");2 a. ^' V! z7 t, L! ^
     return -1;% S% j" v: x7 _. H, J! K
  }
! O0 C0 M% [' N+ T  
# Z# f" I, h9 M# G# M' H9 O& b4 A  while(1)
6 Q& g0 d3 L& E% k7 m: D1 S2 L  {4 o. O& q. u+ G
   
3 \9 i, x2 U  S: F   //AMBE2000每次读写是24个字为一帧3 G$ f3 \6 p: H8 f* T* H- \
   //写数据时将数据在底层存储起来,等到中断的时候再发送
, D% }3 P; v4 X' p" k+ b# b   //AMBE2000输入数据是以0x13EC开头的5 N6 ]5 }1 ~; Z; j4 B) h
   write(fd,&data_write,sizeof(unsigned short));3 i4 A# z0 k& Q1 c1 R
   
1 |& }0 ^0 I6 g5 X- K7 {   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  1 Y3 X0 V  N/ J0 G+ G- d
   read(fd,&data_read,sizeof(unsigned short));, C8 l$ M9 w: y8 n, @
   
3 x( M+ Y3 z; s. X   if(data_read == 0x13Ec)
  C$ ?- d$ \: B   {8 z/ v9 X( Q' k' j8 O
   & u$ Z$ I9 E" r, ~6 H
    printf("data_read = %x\n",data_read);# j: }4 l+ {0 k0 F* i
   }. P, u0 z2 w7 P2 n8 N
   4 E+ {" \+ H, ]$ d
   msleep(10);& F% g6 g- v) b1 {) a" q
  
- {: B, Y' ~! I2 `% @# e$ f  /*2 ?. w" D: x! z7 T2 w1 e; e9 H
   ioctl(fd,1);   
. a# `- b5 Z8 z4 ]$ j% b, X sleep(1);( l( g! N% M& V) d
ioctl(fd,0);2 u: \9 D' n6 q8 i7 p2 Y
sleep(1);" e8 e2 }( ^7 k+ m3 j' m
*/ 4 _6 Z& Z$ G  c% y' p+ u+ Z
  }   - {3 x) W3 V3 c6 F9 c+ k9 [
return 0;
! W! [% ^/ m' ` 1 b- \4 ~3 a" T- L" d
}) m. Q. R: B% X4 M

1 Y5 W* k- ~$ d  A& n0 K多谢各位指教,谢谢! 急! `$ U7 o$ l: L

! ^  J( u* h$ b' {/ G
! |( y! M4 h* n  k. G/ D* c9 r9 [7 y9 R
0 |! w" n) r9 Z, O+ J# V% G2 k
3 c. W" @" E# n! ]1 V: d2 m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-27 08:48 , Processed in 0.047633 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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