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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ q3 f% J# {) u/*
! _, v* K/ g- `/ o * Copyright (C) 2009 Texas Instruments Inc: S9 H7 z" f/ k
*
0 h3 U. q9 M6 C! Y$ X  | * This program is free software; you can redistribute it and/or modify# k8 [% u& ]) _( P6 f% ^
* it under the terms of the GNU General Public License as published by0 Z. b" b; N9 i
* the Free Software Foundation; either version 2 of the License, or5 G8 s$ \0 r# y5 i, V1 n+ m
* (at your option)any later version.. N7 J: k$ G! _9 ?9 t, U
*: t" h" f$ k5 O
* This program is distributed in the hope that it will be useful,
  V" }' ^* D( l8 e+ J * but WITHOUT ANY WARRANTY; without even the implied warranty of# h" ]! j6 H% f* [
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: F8 Y& R/ w; Z/ F
* GNU General Public License for more details.
: {. A. w; S1 r0 v8 C *
7 m+ V: r3 D% t' M# p- {) o7 r6 b * You should have received a copy of the GNU General Public License# P4 U! n, c7 n1 i4 j8 l1 F- a
* along with this program; if not, write to the Free Software
3 T" Z) X7 p- J# i( ?5 q4 z * Foundati
1 ^( Z! N' ^2 m2 h" |*/2 D, _  R% \8 Y
#include <linux/module.h>, `1 P' w) c0 w) W
#include <linux/init.h>" [6 G& l6 T5 l! C
#include <linux/errno.h>* C$ U5 I; m9 ^4 y2 Q. N
#include <linux/types.h>
# y) ^+ a9 C+ ?5 m) n+ ?#include <linux/interrupt.h>
* n! r  E! l# A) |+ N. s#include <linux/io.h>+ ~, T% I; n) j  g, \& a
#include <linux/sysctl.h>5 P7 `# X9 [0 u3 N& W) i* i4 _
#include <linux/mm.h>
7 }1 Q2 ^( @5 \- s: l7 G#include <linux/delay.h>
9 {6 v; m8 v& Z+ T) I2 Z#include<linux/kernel.h>
5 c2 g1 y/ N  ?; q/ p#include<linux/fs.h>
3 l5 _1 {5 W: o* ~/ F4 I3 m/ e: j#include<linux/ioctl.h>8 d! h3 z6 v, ?0 @6 ?& n( u
#include<linux/cdev.h>
' N( S7 u+ @+ ~1 ]/ l9 ~: J#include<linux/kdev_t.h>! N& V( }) \. c) ^
#include<linux/gpio.h>4 Z+ I0 b+ f% x( o, g" g9 L
#include <mach/hardware.h>, f0 S' {) \" t! f, w' A2 h2 H1 G
#include <mach/irqs.h>+ y; r  x- G( z) [3 k% t8 y# ?2 h

+ [. U$ r: I1 d' U8 ~2 u  B#include <asm/mach-types.h>2 R9 L! y) a1 M) y# G" t2 S! A
#include <asm/mach/arch.h>( [# [' X9 ?' K( h; r0 `  {
#include <mach/da8xx.h>
- D2 j$ f2 j' s#define  SYSCFG_BASE   0x01c14000
( E; A& a$ D1 J, F+ k5 Z: Y" f#define  PINMUX1_OFFSET   0x124
0 [/ t& J. g" d#define  PINMUX18_OFFSET  0x168
! d2 c+ m1 r+ I% q% g#define  PINMUX19_OFFSET  0x16c2 t. W. I, n" f5 @# v/ ^
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR/ R4 m0 h" u' i, i
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
' r8 f5 J' B9 D#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR: g9 n3 h# [  R& v$ [6 u
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
+ m; d7 Q, s1 @% U+ h3 H* M#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR8 y& v0 z1 M& k
                            % p7 i! w0 o* z( w6 e2 z6 F
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR  i* }7 v+ F3 Y% C9 N& W3 p
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
% \/ W2 f, v! t. v9 A//PSC
* H0 o: s2 `8 k9 M, ~7 E#define  PTCMD_ADDR   0x01E27120  9 d7 N$ M, }# i1 L. @
#define  MDCTL15_ADDR 0x01E27A3C
6 I) z3 j# ]& I) q. x# F8 Z. t#define  PDCTL1_ADDR  0x01E27304
" F  ^* ?5 m4 R2 [- Y//GPIO8 direction! W6 i0 `# z# M& r
#define GPIO8_DIRECT  0x01E260B08 J9 a  N6 t, }$ s8 O, o
#define GPIO8_OUT     0x01E260B4
/ z; u. x( z* F4 k+ q- f- p#define GPIO8_IN     0x01E260C0# o0 V1 L+ O1 \: f
9 e. v! Z2 M3 s* A' C0 l' I
//#define MCBSP1_RINT    99              ) v+ w. y( b$ t: X1 E- p' e
//#define MCBSP1_XINT    100  
# l7 @5 i+ k( j' |  astatic int MCBSP_MAJOR=239;
! a0 T" k; n: ~. ~static int MCBSP_MINOR=0;
8 N3 z; l0 N  {: sstatic int count =1;, }8 b& L3 _1 K- R; x& }$ t
- D) p5 y7 @5 [% i
#define MCBSP_NAME  "MCBSP-device"
9 Z; I6 m/ F  Q$ ~& @1 B8 h) Q5 r
static struct cdev *mcbsp_cdev;4 D& v  z3 f" G3 w7 w
static struct class *mcbsp_class;4 c6 E# i, n" y1 R' F! e
static dev_t mcbsp_dev;
! X( V+ F* M  a% T- Dunsigned int DRR_data;/ a* I( r6 M; l7 i% N$ v( `7 Y
unsigned int DXR_data;5 R" t6 G% T. _% \. e
static int mcbsp_open(struct inode *inode,struct file *file)
* ?; n4 W. J1 b* l5 [+ m{  M& W/ M% x3 U  K7 x
   + p! j  Y2 ^5 _" w1 N3 V" o: }
   //interrupt enable,initialized
- v5 e1 J1 z1 A" K2 U' h   unsigned int temp;
" P7 y0 {: o9 z' F/ B   //SLEEP_EN(GPIO8[10])---0, C& ?0 r: r5 A9 g: G1 F
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; U+ z" q0 S, X5 F2 z7 U' l   temp=temp&(~0x00000400);
8 {7 _3 r; `; S# [   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10], z! ~0 ]& V: }8 t8 A6 k
  //RESETn(GPIO8[8])----0----1+ W# Z/ f% `- z
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 a: R& T0 B3 _2 M# @0 b6 ~
   temp=temp&(~0x00000100);- v5 X: O& S' D2 i
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 W4 U: c2 m' a) S   udelay(100);" t: x) ]8 i8 v, A6 R$ h
   temp=temp| 0x00000100;$ @, ?( a$ Q" C! c2 B
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---11 k9 c' \  j" R5 W( I: B+ ]
   udelay(100);
6 u+ [2 r  y7 ~. v   printk("open success!\n");
+ \- n6 T8 x, p3 t   return 0;" M  A( J2 n* G1 ?. g
}
2 t; S% D0 h0 i5 l, ?$ G7 ^
, r2 K. B, {! S; T; g# G0 ]4 p) U: Zstatic int mcbsp_release(struct inode *inode,struct file *file)
, {- G7 ?* F4 t2 k+ m' L{4 \% }1 Q  }/ P, A, D
   printk("release success!\n");/ f4 T/ b. H. y- D) P
   return 0;
* C; u) D2 G8 a" _$ o9 W( X8 K}
4 {& f/ s0 p& K( z& [# R  j6 k/ G$ ^0 _. R! ^8 D2 Q1 U0 n$ a
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); d% `8 N- b& w1 f7 F$ W! o
{
$ o/ X" q) V' U    copy_from_user(&DXR_data,buf,len);
% J5 n# f3 r6 _    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       # l9 R7 N8 S6 u: }8 u
    return 0;
# M" R8 `+ I; t' T  E: [ " u: j& {' o1 D0 [2 v* i& k
}
7 o& y/ m6 u" Y1 j2 O( Y7 ]" U9 b* t2 ]2 k7 W9 t" d
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ x+ u" C; _7 u" ^" \  D3 i
{
& p5 h3 x2 h3 b) {+ W9 }: }   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- q9 E; }5 u( v( u! w# A
   copy_to_user(buf,&DRR_data,len);   N! C0 @. d- G5 y& h
   return 0;! n  k5 g" h2 m8 E
}& k( M. I, S8 ?& i3 ?
6 U# C. e1 _9 A3 Q

! P& ~. b. h: z; h: C/ Q! @, n* U$ v& wstatic struct  file_operations mcbsp_fops=1 p+ S8 e; `, l0 O0 Q0 B2 W
{; o: P  q1 M/ h& i# e; _; o! g" p
   .owner=THIS_MODULE,
' q- q, N1 L) C9 b; q9 b& q   .open=mcbsp_open,: \3 N; A2 ]6 R" u) F* B" B2 Y
   .release=mcbsp_release,  `* I" s/ w6 z7 K1 n1 \& _& B- q0 t
   .write=mcbsp_write,4 P& m* H- A& j: v6 X& z* G  z
   .read=mcbsp_read,
# r; u4 _5 s. P! D4 s3 e, o};
  R, ~8 @9 @; L+ [0 L. Ustatic int __init MCBSP_init(void)
& f$ S1 G; b! A# d# n' N5 M' [% g{: a9 T: Z6 i) p) O4 B+ r6 ?7 G
   int ret;
! [( v' f8 p+ O- J+ k, V5 j( J' p, P5 _   unsigned  int   PINMUX1_REG_old;
  i' p5 a6 d! Z* V2 g   unsigned  int   PINMUX18_REG_old;& O6 h, k6 N& |# n6 h& ~9 E0 r1 g
   unsigned  int   PINMUX19_REG_old;& I2 F1 X$ [* F( r' Z5 ?
   unsigned  int   temp;  
. ]: o# S' z  l3 M: w4 |3 o   if(MCBSP_MAJOR)6 f4 b' E: s. E+ Q
   {1 x1 V' C9 Y9 k* K/ B( g7 u
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ t, B- c, u$ i: A+ t! Y
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& X7 b! s1 ]" `9 u# x3 q  q   }2 L" V# @6 t2 `6 T
   else9 ~3 w: A' \2 f& M# z
   {
$ h6 k6 x! C2 g" t4 L      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
  F: P; S' k8 v/ Y; d9 F      MCBSP_MAJOR=MAJOR(mcbsp_dev);6 y6 q# w" D& v
   }# b- ]1 g* Z5 ?/ i
   
: W/ p1 L  T8 T   if(ret<0)
! g* M/ q8 c7 s( g, p- g6 o" E+ k   {
' J; Y5 S  W/ }      printk(KERN_ERR "register chrdev fail!");
6 v+ L2 {- @* F% T( x& H3 y      return -1;2 x0 ~5 \9 Y3 q. ^- T+ Z
   }" i6 d. `3 S2 j; B; e* T4 {
   3 H; z" F. }7 P: n
   mcbsp_cdev=cdev_alloc();: E# m/ ]9 h' ^: Z) z
   0 ]% i  C  A5 d( I" G7 L0 b
   if(mcbsp_cdev!=NULL)
. L" |5 d4 Y/ O8 e8 ]: g/ [   {
! o* M, Y3 F( _8 S; i, p* s      cdev_init(mcbsp_cdev,&mcbsp_fops);
- L+ V' \$ T$ I& b+ k& \- U      mcbsp_cdev->ops=&mcbsp_fops;: J2 c1 a) Q+ Q
      mcbsp_cdev->owner=THIS_MODULE;( ?& U7 k" X9 M) \
      & N8 A, K8 L) g) B& P7 Y
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))1 U7 F9 L- y- w0 }9 v( u
          printk(KERN_ERR "register cdev fail!");
8 Q' ], n  x$ M% X5 B; E      else
$ f# d4 H8 f; I  g/ p          printk(KERN_ERR "register success!\n");
; B' i3 t. P8 R2 e# g0 _+ L   }
( y0 X! f8 q! a6 j( k# O8 P4 K   else
& ?. P/ ], m4 h  }% X) Y4 R0 ]   {
# s( p4 \& `; r) W  n0 c      printk(KERN_ERR "register cdev err!");
& r; t; z" g8 w. l, g- m" s+ g* C      return -1;
6 d6 _- f+ s( X5 G   }
( `; B; F- m3 j; G# z6 C   5 J: |" L! b3 k$ Y; [1 u
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
# ~9 \% X1 B* G& a   if(IS_ERR(mcbsp_class))
: j3 c7 Y" @9 Z6 R4 z   {2 Q. x" K" {! u7 F: I
      printk(KERN_ERR "register class err!");( A% F4 L0 F9 {+ K# P6 ~" g
   return -1;
4 o& M% G2 o  y   }$ E1 [& [! o8 `3 V' a
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
+ [& a/ f; Z) e0 ~2 m0 j. R4 j) t/ x+ b- N
   //PSC2 y$ o+ q7 ~* \. V% ]
   //add Enable MCBSP
( b7 G, M4 _& a2 I) W5 U6 e) S   //test
. H+ i# t# b; c8 W   temp = 0x80000003;7 v2 G% ]% N) ~' R$ Q! r% `
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& O% \* p. o5 u! H   temp = 0x00000003;
' h* X# }) m% p" @- I/ Y& p   writel(temp, IO_ADDRESS(PTCMD_ADDR));6 ?; Z" |9 O, M
6 H0 [" c5 h4 g9 f4 F+ B
   temp = 0x001FF201;
# T. Y) a: r1 s2 j$ `* P   writel(temp, IO_ADDRESS(PDCTL1_ADDR));) J- k! f) j$ O; T3 I: z0 }
   
0 F( y# K0 x  v6 M8 w$ [& b0 S5 o3 a$ y   //PINMUX  
* F2 f! Y! R( H$ }& A2 j- K) b2 m   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
% C0 L: y8 U. L+ Z% F   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  1 _* \+ b7 k1 a$ F# C+ i4 Q0 D
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   % i/ O, ~* |# C
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);9 P5 ^1 U, d( |  k
   7 n/ g" S6 b& E/ I
   //SLEEP_EN,EPR,L138_SHK1,L138_RC6 L7 I: n$ {4 O" B6 u1 d4 G' P
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
; e: ?% H% T2 ]5 H. B- `   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
& q/ a9 o; ^$ M5 h   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ M4 x, w7 {. T8 ~1 ^3 j3 W1 ]

$ |2 u+ |: g5 G6 ^- |/ A   //RESETn,L138_SHK23 K0 I3 k$ J' o2 d% a5 e) R
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  5 H6 u6 m2 {' b- m' C9 L) D
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
8 n- l2 I7 n0 U3 t1 H, n   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" r9 h8 m+ h, k: v1 X% Y/ M
/ V; X8 u  G" _/ i# h3 p; V

& }+ l! L2 G) d) O  //SPCR Register* q, W, H6 e# g; ~* }- @( e+ _
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
5 ]$ U' ]; H3 \$ m. s  temp = 0x03000000;//(DLB=0)
% K4 l8 M, N6 i5 A6 O0 ] // temp = 0x03008000;//(DLB=1)! I& a, i4 I: p2 R2 r7 l( ], \$ n4 G+ ~
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
3 f; p$ J2 V( q1 s' [/ K$ h  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 t- K" e; I3 M9 c4 C% Z  printk("temp=%x\n",temp);
; d$ ^' w# J; n; z& |- m - I0 _, t- `* {5 U
   //PCR Register0 ?1 G* g# Q  g: l0 q
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
% F' |9 B) H" S8 T  // temp = 0x00000F0F;$ L' H! Y  I# X5 P. M1 _
  temp = 0x00000B0F;
# T6 |# D6 c: }  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 5 |% ^2 O' o  p4 g# f6 e
  temp = readl(IO_ADDRESS(PCR_ADDR));; Y# K$ Z6 e( ^
  printk("temp=%x\n",temp);  % e% J5 R0 {9 U% O" N( M
   //SRGR Register
1 L: H! U5 w& C, Z0 ^   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11' S  M/ q# l) r/ p
//temp = 0x301F000B;
3 g  T: V7 A+ N   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 9 }; ]' {5 f  m7 a
  temp = readl(IO_ADDRESS(SRGR_ADDR));+ X* z) n% F) n) a: G+ b
  printk("temp=%x\n",temp);8 O5 |* a8 V3 H& ~! i
   //RCR
$ f) e3 |7 {1 y   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 o+ h: \: N$ c0 r
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 l5 m& u6 j3 Z
   temp = 0x00440040;; q+ n2 T# t0 ?  G4 Y7 @. _" y, j
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
' {: L  d5 ~0 Y; |4 V3 C3 M   temp = readl(IO_ADDRESS(RCR_ADDR));
" X/ U1 [+ c/ H- l8 R9 I   printk("temp=%x\n",temp);
6 p2 J5 m* r. t   //XCR, ?: e+ n" c. ?
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1$ Q7 ^5 T# D* `1 a% f  R/ c
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-04 X% {: y3 {% m
   temp = 0x00440040;5 b2 \! ?( J9 _% F/ [3 w
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   + F, U, d! g, f
   temp = readl(IO_ADDRESS(XCR_ADDR));
* z" K: S$ K/ N+ c3 j   printk("temp=%x\n",temp);+ O0 K9 f* d0 v/ v$ H( V2 M
  udelay(100);
2 k5 f. a* I2 Q5 l2 [9 C$ t  //SPCR Register0 \# B5 o% }, W3 D+ D' O3 `
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
' s) e5 W/ k( U" J6 @6 l6 t  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
, q/ R) |5 r/ U1 h0 z5 |  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
$ x( X) Q4 z% @* r% O  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ U& x+ Q/ d  A, c6 I' I  printk("temp=%x\n",temp);
* |6 H6 x6 t! D9 U  udelay(100);
3 t' F! s# F1 c3 g% Y
% d6 T6 p% P# [& ^9 F- }& b3 Q  //set GPIO direction
  Y' l0 h! e) A   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
, {! L" Z) x: @! {! |' H   temp = temp | 0x00000100;//EPR----input
& ]) O' Y: m6 y3 ~# w& I' L   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output, i" e7 ^: i+ Z, I$ A
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
% S( R$ Z4 A# [0 O! F  s* | ; w: c( H) p- J& g& O5 w) j
   return 0;6 Z0 ?! a. l9 t* o& }& h
}3 `: a' J7 B! v
static void __exit MCBSP_exit(void)! }  @- [9 I. w. \9 g& z9 a1 j% u  \
{
5 a2 c% U1 w/ o: q, N' j   printk("mcbsp chrdev exit!\n");& e; E- w: A; i4 }1 A( ~$ Z
   cdev_del(mcbsp_cdev);
" A1 w2 k; o+ H3 K6 ^   unregister_chrdev_region(mcbsp_dev,count);! K" a4 D) F  E
   device_destroy(mcbsp_class,mcbsp_dev);# s0 w0 `! `6 p7 Q- r" m2 s
   class_destroy(mcbsp_class);
( f' S% u+ N' z}
+ E2 h  d& _6 [0 `module_init(MCBSP_init);! L$ i$ z5 S  P  {" ~: s6 w
module_exit(MCBSP_exit);
6 g6 O" `5 `: X  b% \) a4 R  {: @2 X6 A9 q
MODULE_LICENSE("GPL");: t  ?9 p7 X0 _6 N
" K" F1 M0 j+ T" k
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。  F; @( ]2 J) c3 t
我的应用层的测试程序如下
" {9 y6 h. ]$ A6 R# C; A' w#include <stdio.h>; w' t1 X; K6 Y" P
#include <string.h>+ |! e$ m/ f1 ^# z2 z
#include <fcntl.h>
: q0 `' b- j" q# z, q' `4 J#include <unistd.h>
/ d5 [0 b' Z* C% f6 u* x#include <signal.h>
5 n* |7 g, I+ ^1 u( c#include <pthread.h>       //线程
# w' q, T2 ^/ E5 R( V  c#include <stdlib.h># E" T! G  M' H8 U: p4 J( a
#include <pcap.h>          //捕获网口数据
. f  s7 S% P( H. |! K#include <semaphore.h>     //信号
: K- X% D3 C' }1 u2 y" F#include <sys/types.h>     //消息对列
0 Z# R- i8 c# R) |% B% I#include <sys/ipc.h>       //消息队列
. E: s. h3 ]+ n* Q#include <sys/msg.h>       //消息队列
, v( C& h! d* z2 d( n#include <sys/select.h>$ ?+ o: N! U  A3 v- F$ ^
#include <sys/syscall.h>
$ U# _1 i+ B3 m. O#include <sys/stat.h>
4 a+ z' F) V- v6 X' t+ G/ ?#include <sys/mman.h>. d5 n8 S6 h2 M
#define msleep(x) usleep(1000*x)
: h0 n/ [: o) [
) v- ]/ @- a9 q7 b9 ]1 s( yint main()
' |! o+ M# P/ \: ]* ^7 n. q; }{
! w( t* M( B5 N- H; a    //MCBSP,ARM与AMBE2000交互设备
: L/ |2 C0 E/ w$ A" k2 w. H  G) l int fd;
+ ?/ n8 ]  `2 {6 ?7 R: ~- b* ] unsigned short data_write = 0x5555;+ M. N$ q2 }! E8 {0 R8 G, q/ `  Z: @
unsigned short data_read = 0x00;
2 `& u# N: ]3 W9 r" q8 }6 T  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ e7 s) l! D5 b  @) T) C  V
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);& a9 Z4 m7 ~6 j% R6 p
    7 w  C& W$ n6 m
  if(fd < 0)
3 r+ W) S' k, g9 d  X- H( G+ L  {9 P' q' N  J6 _7 }
     perror("open failed\n");
3 o  J3 C7 W. Y( I( r     return -1;+ z0 w; r: n# |" B
  }
7 Q0 K3 r! W( \  
# P5 N- V8 R3 R& t6 f/ S' y( v+ _  while(1)+ V. J( F- g8 P+ \
  {* z, d+ J, z: ~, h
     e2 A! o1 S( R9 t
   //AMBE2000每次读写是24个字为一帧
, H3 a$ P) |1 W   //写数据时将数据在底层存储起来,等到中断的时候再发送. E' K7 X/ t' C4 }
   //AMBE2000输入数据是以0x13EC开头的
: ~" X3 {* v+ H   write(fd,&data_write,sizeof(unsigned short));& M* ?1 V# z" Y1 _0 n% }+ k; a
   : F8 z1 i0 K* M/ W/ V% @% g
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
! j/ P+ K. o$ x   read(fd,&data_read,sizeof(unsigned short));) t$ F) t7 D: b3 l3 A
   ) C  u8 x8 n6 P# O
   if(data_read == 0x13Ec), D! g! x8 v5 l7 v& W9 x; C; L* Y
   {
$ J5 h5 d0 L  s. X+ R. {   
. ?; y- i5 D2 T- W/ F& D8 h    printf("data_read = %x\n",data_read);
$ f9 c2 h( o, ~) P   }
2 ^8 B3 f9 h- d. x. M* \9 g   6 C# n2 b1 f: V+ l
   msleep(10);
  i3 U; M' c& n3 p; G- Z  
' B! w) S, O! {$ j( o& d# O! e. n  /*) R3 r" F2 ^2 u. U) X1 e3 w& R* X
   ioctl(fd,1);   ) }: {; Y& n: e% H% b7 i
sleep(1);
* \0 ^4 Y  a& V5 P5 O ioctl(fd,0);
8 U. O$ R+ ]& j/ ^, w) S' \  R0 K sleep(1);$ u2 Y9 \9 e( D  h" A4 n9 C, O
*/ % I3 M, U1 K2 j& t4 C
  }   . k9 U- o9 m; @( X& N0 f1 T, k/ [
return 0;
, w9 N: E4 ~- [, S  W
$ K; T& }  A. N  F: n' N}5 z( a# z1 g" a) f! m) u8 ~( N

# I& E9 ]+ Y+ ]  c) {多谢各位指教,谢谢! 急3 Q( P5 J& L1 d

$ n3 @2 ]6 D/ s" k9 K& h8 r9 ?. \6 u$ u; E; X; y$ k
6 }0 }4 E2 F3 i6 X" _% X

! A, z! N! b; H0 ?' b
, [) s1 C" \0 y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-6 11:29 , Processed in 0.048099 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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