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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; l. z# ?; w- `; f' Z
/*0 j- m$ B. S& X  V
* Copyright (C) 2009 Texas Instruments Inc
, {6 T, K: P8 t6 O *0 \" }$ O% S! ~8 Q
* This program is free software; you can redistribute it and/or modify
: v" x; x. o5 t2 N * it under the terms of the GNU General Public License as published by- o4 `. V2 s/ C/ X3 s4 Z: o. G
* the Free Software Foundation; either version 2 of the License, or
) U9 s% G6 |7 V * (at your option)any later version.9 P& _+ R( y' H: W4 @; H6 X' j
*, H* d: q4 z9 m* ]% {& [
* This program is distributed in the hope that it will be useful,
% k2 X8 [+ ~$ O$ X+ A2 S" y0 x * but WITHOUT ANY WARRANTY; without even the implied warranty of
7 _) H% g/ @' I, a' C! v2 P * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 w: F3 C6 ]1 a1 P: O' `) L1 M * GNU General Public License for more details.
, q! l5 k3 o6 P. S" M. e *
, `* f3 f2 Q( g3 ?# i& C * You should have received a copy of the GNU General Public License
+ }# j; s7 r% A9 v* h * along with this program; if not, write to the Free Software1 t, t5 K4 w; [( `/ J& D
* Foundati
9 G: P1 ]8 M" P( e! q2 \+ O*/
8 M4 I4 F5 O* `1 Q- W4 A#include <linux/module.h>
- e" P& b' a8 _! `, T7 K% B3 t: R#include <linux/init.h>
# [; G/ v. F0 K4 [/ |#include <linux/errno.h>! L2 J6 g/ z! t5 m: X9 E& |! M5 t
#include <linux/types.h>
, X# \1 X# T7 K& @, q" ~& e#include <linux/interrupt.h>
5 ], j# R! g1 h9 _$ k#include <linux/io.h>
4 u1 K! o, ]; i( j) P2 Q: o#include <linux/sysctl.h>8 {# J1 s: U; m& w, D/ b" |+ R
#include <linux/mm.h>
. i: T- S) _+ w/ f% O#include <linux/delay.h>, y- _; N- F$ c0 m4 D( n# Q
#include<linux/kernel.h>
: \1 }& X1 C% Y4 P9 M$ s#include<linux/fs.h>* ?; [) E- ~& i2 A  W! e9 S
#include<linux/ioctl.h>
: k! h8 A+ d" J, }#include<linux/cdev.h>
' p8 S4 J9 Y+ t. ~% q( P( a; J* K% [! i#include<linux/kdev_t.h>: I7 E  g- W1 S7 T
#include<linux/gpio.h>
+ [; K1 ?  ^2 r# x- c#include <mach/hardware.h>
$ n5 d  u& ?. [#include <mach/irqs.h>; `* x( i1 m0 p7 G( o& ]
6 o& \0 J, W0 o4 ~% m9 M! x' n& X" y' I
#include <asm/mach-types.h>( t. C$ E! r# I$ ~  C( p
#include <asm/mach/arch.h>
6 ~* }# x" J. I* k#include <mach/da8xx.h>
7 ?8 s) R# ^7 k* \, m" Y#define  SYSCFG_BASE   0x01c14000& G- p" W9 R0 ~  D8 o1 u
#define  PINMUX1_OFFSET   0x124 7 |2 g- y6 P: N9 c& ]( C) [6 M
#define  PINMUX18_OFFSET  0x168
* n* G* m9 B- [7 G  ~6 c5 |2 D#define  PINMUX19_OFFSET  0x16c! g. _6 L, I; o& j
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
+ t0 R7 c& u+ D#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR  P% [, f$ `5 f5 c1 A; i* f
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR  T/ X; n* d3 V0 H' P+ U9 l9 y( p
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
' E+ K6 v) V1 s! @( N#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
" W  `, l7 X( v; l. x) k                            5 d2 Z" N+ T% p  V  M; b
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
; u, C( i- \/ a1 S, P#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
. k$ _  K3 f+ M. Q% Q- U//PSC7 m, u5 n8 v% C0 S* z! c' P
#define  PTCMD_ADDR   0x01E27120  1 i( g" M) }; c' \: K: v! T
#define  MDCTL15_ADDR 0x01E27A3C! S5 T% a& [9 N0 F
#define  PDCTL1_ADDR  0x01E273046 o) q# O7 r* }$ O& r' L
//GPIO8 direction4 S7 g' |; o: }6 V, @* \( n  F
#define GPIO8_DIRECT  0x01E260B0
$ h6 a% c" K# p. u  Q7 r* i#define GPIO8_OUT     0x01E260B4
; b5 z! }+ I- V1 _0 w2 Z7 t#define GPIO8_IN     0x01E260C0  D" {8 G+ m: N

! A& U# R* j7 f& h0 r, r//#define MCBSP1_RINT    99              1 c4 S8 U4 u+ X' V
//#define MCBSP1_XINT    100  $ Y/ M9 E9 L" ?) W, d  L) ^
static int MCBSP_MAJOR=239;9 L: H  [: l% _/ I/ E
static int MCBSP_MINOR=0;/ T9 U- M$ k  g1 Y
static int count =1;
8 f6 E0 ^. p- i! S* ]9 {9 l7 ^' @
) |- H! D# e2 S$ Z( V; [" f#define MCBSP_NAME  "MCBSP-device"1 _1 g5 K7 K" ]2 L
& W) R/ x  q( S: b3 }! D
static struct cdev *mcbsp_cdev;
* s; ]; R6 x/ p( mstatic struct class *mcbsp_class;# K; f4 c3 y- T
static dev_t mcbsp_dev;) @3 ?6 {* H/ `, i
unsigned int DRR_data;8 d, Y, I3 @2 a$ \& u# T
unsigned int DXR_data;: n. N( }; a- }# R$ @& T; N7 R5 j
static int mcbsp_open(struct inode *inode,struct file *file)
" u- E$ s- A- [: `- w7 l: \- F{
: P3 S) s8 \! Y8 G* Y) f   
4 N& Y- k& I% {   //interrupt enable,initialized+ b0 P4 P( |9 |- u2 b8 Y( K
   unsigned int temp;
' D; n3 F6 M2 I5 [7 J) a5 y' z   //SLEEP_EN(GPIO8[10])---0
, v! @' |2 O+ j4 f$ E' d   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ L# h2 S7 o9 w+ ~7 ~
   temp=temp&(~0x00000400);
3 Z2 L0 W* z; u% a  C) z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10], }% B8 U1 z1 V' P. ~  O& u' j1 e9 @
  //RESETn(GPIO8[8])----0----1' s+ y. F3 z. h& A+ M
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 Q4 I, d2 d2 a" m$ ]- u' D+ f
   temp=temp&(~0x00000100);$ T# W  t) N! O! X) w8 O+ v
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ Z$ a  f! s0 S" t) O5 R! d   udelay(100);& b. t# {2 A5 g' j2 v# o
   temp=temp| 0x00000100;& b/ \8 h7 l+ I# H
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 ~: i# r1 d$ `- ~   udelay(100);
+ \# M4 W/ m1 b7 G8 m  h   printk("open success!\n");6 ?3 Z) z3 Z7 s) |
   return 0;
2 z8 Q# r. l# f- u) i4 f; n) J}
  E0 X; o; }8 l) U
5 z3 s8 l5 g3 I- W# }static int mcbsp_release(struct inode *inode,struct file *file)9 d- A8 F" r* }0 c" e3 B: P
{( a, V( ~, C5 R- _6 u7 v8 u& c0 O
   printk("release success!\n");
% }( Z1 i3 T4 I) g1 g& b& ~   return 0;
: @4 L0 l1 Y& P' }' j" E}
0 {/ [2 Y9 v$ u" d" D. m  S' X# t6 a
/ W9 h: x- t: l3 Gstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)" P  O" @+ l5 O  q: n; Y
{4 _5 @5 U- x/ x4 x/ J
    copy_from_user(&DXR_data,buf,len);/ u" p. M  L  W2 X
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       . B( S8 Y9 |" n) b
    return 0;2 M1 y) w$ m0 b

: j+ K; m; }' e  r/ l}
2 ?6 Q8 y& _' M0 D4 I6 p$ v$ |; \
  {: ^1 e1 V8 K8 @static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
/ }$ d' k) L& b( g% [* @{
  R9 x. W/ ~: f5 X: S# V' Q8 j   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));/ w+ s7 Z9 Q) ]5 d7 W3 T/ d5 b+ ]
   copy_to_user(buf,&DRR_data,len); % m" h& e# z; l
   return 0;
2 e8 F& Y( l4 L* B9 N, l4 {$ I/ y}
- _* H4 O/ ]) L+ i9 k0 \( F
6 G" h# q2 v1 c& L$ |, y# z) @. ^9 d; G3 U2 R. Z$ Q4 x
static struct  file_operations mcbsp_fops=
2 D) @+ R' L( S' i) g$ w. M{
$ O) g- j# s3 c* Q   .owner=THIS_MODULE,; }7 I3 y* ?% D4 h& S
   .open=mcbsp_open,8 j3 n+ U+ X: ?( _+ t6 v2 K
   .release=mcbsp_release,
2 w- ?* B, M6 y' M# |7 k4 G4 d8 D   .write=mcbsp_write,. A2 n$ c  |$ x" ]; r1 |
   .read=mcbsp_read,
5 t4 Q" [* n6 F: u; O3 O};4 F3 a4 T: x1 ~+ G) }2 C
static int __init MCBSP_init(void)6 E: ~5 R. t, e: ~( @
{4 L: t! `" p0 K; e% L
   int ret;
, W6 b' q% D1 w0 n# M( n   unsigned  int   PINMUX1_REG_old;$ C: W; j6 ?7 }3 h
   unsigned  int   PINMUX18_REG_old;
) `  z7 j0 n  h5 @7 s  r   unsigned  int   PINMUX19_REG_old;
/ k2 I% ~4 }+ p/ ^/ G   unsigned  int   temp;  / S5 B& @1 |: E8 M+ b3 E
   if(MCBSP_MAJOR)8 K) d; D: \1 k/ N
   {
0 T/ y' O5 F$ d# X. G, X+ j      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);/ K, H# K, ~9 q
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& r7 ]2 |# G4 ?! K9 [   }( t" z7 ~, U, _& K
   else  K2 O: |. R. y: `
   {
/ P; x! X* F( l" r( ]  k" ]      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
+ Y( ^/ Y1 `; T" s      MCBSP_MAJOR=MAJOR(mcbsp_dev);
2 K1 O  B* h2 X5 x. p) m   }
. C, Z, I% F8 C' L2 Y   
& [% I3 I6 Y% x: r   if(ret<0)) W# z8 G$ b2 E8 }- J: T" o+ B
   {
- P, g- `7 j& V. l      printk(KERN_ERR "register chrdev fail!");
& B5 x+ _/ b: C" y: E3 O, B      return -1;. M  `( e2 s# u9 O( x0 ~
   }
4 U* P# p9 J5 z" o5 h; s   
7 ?0 x( H5 F$ ~! k/ G$ p7 f( A6 I   mcbsp_cdev=cdev_alloc();
0 c+ j2 T/ O8 k+ |6 H   
. d* w3 y1 ]3 G9 l: d" P' H   if(mcbsp_cdev!=NULL)
  g# S/ d6 O( a: z5 [/ I   {
7 @* l: u8 e% ~$ e7 ^      cdev_init(mcbsp_cdev,&mcbsp_fops);
1 t0 B: u; v2 B. e% \      mcbsp_cdev->ops=&mcbsp_fops;
  K% b0 a3 _+ B' L. j* w      mcbsp_cdev->owner=THIS_MODULE;: `9 J2 _4 g7 ^7 g  T
      
8 M4 t" V9 I# G      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ v7 H! O& {7 w  _
          printk(KERN_ERR "register cdev fail!");7 s2 i' o1 A0 x: ]
      else
1 _+ }+ J1 A) F6 X9 C3 E: V" \          printk(KERN_ERR "register success!\n");3 c* B$ c& ^: j
   }
# W2 r4 z& E2 K. L% o   else, u7 Z  Z/ T+ A% e' V
   {+ m5 p: n# l  h9 j, @4 \
      printk(KERN_ERR "register cdev err!");3 k) T8 @$ S# i1 Y* j
      return -1;
' E' r, ?+ P) U. a/ i) z   }
9 r6 \$ l% C8 f; T* q/ p* e$ G   9 x6 K  u2 W0 Q$ ]( ]2 E( ?
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
7 F  `- D- S: y- a1 x   if(IS_ERR(mcbsp_class))
) Q8 {5 s3 d" B& H4 |2 P5 l   {! K( K0 i) X- l
      printk(KERN_ERR "register class err!");- I9 D/ R7 L) v3 U- @' \7 w
   return -1;( Y3 o' _7 V4 k3 {5 ^
   }
% |7 E1 Y- M' s1 ^- ~   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);/ V1 e/ d; l# s$ }

& N3 a7 i& q: I: h   //PSC1 F9 G1 R! J* w4 ~! t
   //add Enable MCBSP6 o: b: A1 h2 T; T' e$ h1 M$ G
   //test
4 a9 J' k$ n- A6 f9 _   temp = 0x80000003;7 T. u+ s2 q  u  s; T
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));. r5 o7 ?; k" t4 f
   temp = 0x00000003;$ C3 K( B# L2 j( N
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
$ l/ _$ a# o3 c& h6 ]$ ^. v - K8 p1 @- g# o. _: U) T
   temp = 0x001FF201;# d, F  P. R" }& g
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));( ?9 j7 K! q( q! g
   
, Z! y8 F! h5 u- ?( d% s   //PINMUX    A+ m; f. x- K& l- u
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,( d$ }2 H  l+ @& g8 T
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  # G+ C# ]6 O6 z/ S8 V1 n0 \
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   5 w2 ?* }: L3 j# V+ ]2 I# v) f
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 g* M9 N& ?; i5 X: I* O   ! C8 x" I/ J* I9 C
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
+ h! w, b( C- A# `- q3 H   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
9 Y0 P/ f5 d7 i, r3 B+ v  p, t$ T   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
6 x; p7 \8 k  P5 W* t/ g7 ~/ @! [   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) R( V3 m+ u. A9 Z

3 Z* E% h. t8 |! f' |3 j   //RESETn,L138_SHK23 O# Z6 K3 j4 [' t
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  " X) c, j+ R) I
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   / L  l2 k3 P9 S4 F. b$ P) n0 u
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
, w8 ^; B8 {" J5 T+ C
0 R0 H8 D2 ^6 b9 h- Y
, d' V' Q4 Z; b" Z8 B. y: |  //SPCR Register
" `1 h7 m- C7 g  a% B7 r; b$ U  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset  ^9 O) d3 M+ q- B
  temp = 0x03000000;//(DLB=0)
8 Y+ h: Y3 h; b( j2 t // temp = 0x03008000;//(DLB=1)
+ D" {5 ]0 h- w; o, r3 n' i  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
& |0 }' l( d9 y  temp = readl(IO_ADDRESS(SPCR_ADDR));
7 q( b9 C2 D6 p# U  printk("temp=%x\n",temp);: v" m# ^7 ^: `: a. `4 D$ e
/ e) F1 E. Z. R
   //PCR Register( P3 u7 K+ F9 Z- R
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
1 M4 D) T. B$ c  // temp = 0x00000F0F;% z8 e# w+ @6 j# ~2 Q- `& Y
  temp = 0x00000B0F;' G$ e/ ]7 f+ h' J% z0 n
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized " K& g( |* f$ A2 ]
  temp = readl(IO_ADDRESS(PCR_ADDR));& _! H" w2 L9 j2 I
  printk("temp=%x\n",temp);  
- T' g/ P( {) r, h% ^0 M* n$ i% ~   //SRGR Register/ z! {2 }% J" l  X& H$ t4 D0 k
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11  J) |. _" O, w0 v6 i
//temp = 0x301F000B;3 l6 u/ r; P$ C3 O: m4 M# k
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
: i( ]5 A- {+ [6 J7 h8 Y  temp = readl(IO_ADDRESS(SRGR_ADDR));4 T5 ^0 i: {5 z- S! V$ r
  printk("temp=%x\n",temp);
$ P7 x% z0 a* Y# S3 V+ K# a   //RCR
) ?) B# R. Y. o+ m. d7 w, Q   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
5 j- u8 S$ T) d% i1 h9 f: \   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-08 [3 T5 W7 r' G8 I' X  r8 o
   temp = 0x00440040;% S7 q6 o5 ?! J9 H) j
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ) v* E3 S# [8 y: B* N9 I
   temp = readl(IO_ADDRESS(RCR_ADDR));
- N+ n/ Q$ g: k6 b1 C7 k   printk("temp=%x\n",temp);
/ w% f4 w0 L7 Y9 A+ Q, d; n) }, |  b   //XCR
5 U! r0 c; t+ h* I6 u4 r! L  f+ O   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- `! ]  T  M1 U+ Y; `
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
* |; p" Z1 A% U7 e+ k6 V   temp = 0x00440040;
& e6 z, p% Q5 d$ `5 ]   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   4 J7 T6 Y6 T* ^8 s
   temp = readl(IO_ADDRESS(XCR_ADDR));
: G0 }  j, H5 \   printk("temp=%x\n",temp);7 g" G7 I6 n; h+ v. k4 |' {
  udelay(100);: I0 Q( r* p( I
  //SPCR Register! c7 d' p8 t) L0 l: u/ A
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
/ M3 f7 J# g- v  N% R  w  }  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
0 v6 \8 U$ K) g+ X$ A3 S  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
* P5 _1 w5 m: D  M* Y+ k( x( \  temp = readl(IO_ADDRESS(SPCR_ADDR));
; a- ]/ w9 o' b. C& A; ^  printk("temp=%x\n",temp);
  t- k' g. A; N% J# z, A  udelay(100);2 J# M3 t% N# P6 k% e2 i

# g% @2 H- r9 H4 Q. e  //set GPIO direction- O; O( t( K# d* c
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
: B* v: A% Q# K: B& j& w( c3 c   temp = temp | 0x00000100;//EPR----input
$ [: U/ n2 E" y* w   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
3 m  K& U0 W/ r3 c2 g   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
5 |3 Y" b1 p+ W2 X$ g % f' p4 V+ x: s  y. g% n
   return 0;
, e% G1 k+ V1 X}' Y# ^6 ^9 O! v: R* n& e% \
static void __exit MCBSP_exit(void)
# V% [/ h; f+ p{
) {# L; \- J( K0 S5 K   printk("mcbsp chrdev exit!\n");) E- B' W6 t+ U6 ]
   cdev_del(mcbsp_cdev);
% n3 E# X9 F7 J. h, v1 |   unregister_chrdev_region(mcbsp_dev,count);
* m' w6 }1 V% Z- \   device_destroy(mcbsp_class,mcbsp_dev);
3 x% @: }8 Y& `7 E- B/ l) ?0 ^" W   class_destroy(mcbsp_class);
  v* C0 G% Q) y; w+ {}
$ }2 H$ I1 I; R; c1 _4 A$ v- Mmodule_init(MCBSP_init);
' v9 E" T! m3 bmodule_exit(MCBSP_exit);
* C8 y& a7 |4 h3 l, |" r5 {5 d+ R  u7 R5 b" N
MODULE_LICENSE("GPL");$ B& C+ R, M+ J9 h- S) i7 j
" S% @2 _5 s5 k- P6 a
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" [+ j5 u# K/ q1 c  q$ H  O我的应用层的测试程序如下
" ^; P) n6 \/ Y7 t( j#include <stdio.h>  `8 p1 g5 }4 I, m
#include <string.h>
) h; g" t4 M2 Q* X#include <fcntl.h># g4 {) F7 I0 D3 b- ~' ]. f* S
#include <unistd.h>
3 D; O% }8 z" O! c4 H8 W#include <signal.h>& _' C0 b1 w7 {' l
#include <pthread.h>       //线程
* g. A% O3 i2 G* _. C9 J#include <stdlib.h>
) x! S/ J' z; I2 `3 v#include <pcap.h>          //捕获网口数据/ q/ S! Z, Z( d
#include <semaphore.h>     //信号6 h/ A9 y2 D% Z1 M: B6 V
#include <sys/types.h>     //消息对列
+ x* ~; L5 |- N#include <sys/ipc.h>       //消息队列
# e- d- `! T4 W* U5 N) }5 w#include <sys/msg.h>       //消息队列/ m% D5 w* T8 b4 J
#include <sys/select.h>
0 S& S1 [+ ?/ L% j8 q5 V. D#include <sys/syscall.h>
4 S6 G0 {; h, u6 v# b" K' ?#include <sys/stat.h>
  r( ~, r1 G/ ?. W9 @7 l#include <sys/mman.h>. O8 Q) h% M. c, Z! V6 b
#define msleep(x) usleep(1000*x)2 `6 c, q4 @  Y- \$ ?& @: y/ s
1 X' [/ h% c4 w$ B) k# K9 H4 n" G
int main()
7 ]1 Z- J& f4 l1 b{ 1 P: ?: T! M( D) R
    //MCBSP,ARM与AMBE2000交互设备
9 s3 V9 ]+ q9 P4 `# r  h int fd;
! B$ i/ m' j7 ~7 j) i5 M unsigned short data_write = 0x5555;! Q8 w8 a4 ]( s
unsigned short data_read = 0x00;
; u) y7 B# X+ v6 `6 {( T  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
; m9 \" q4 R$ c" w3 H/ K //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);7 r/ u3 b& u+ a. U, X9 ^
   
0 G& E2 X/ B4 R# l7 n" P  if(fd < 0)
+ Z6 B4 E; b# K/ ?- b" X/ @7 `) Z  {+ K5 m1 \$ v' d5 C. E! [$ Q" O. }9 J
     perror("open failed\n");
" \* G7 R2 k5 c9 Q, @0 F     return -1;
* m9 c8 M7 f/ z2 Q2 L  }
6 Z" [2 e3 f% W  
2 ]( e% f/ d) A2 N' h4 |  \  while(1)
/ L- D3 ^! }/ V  k8 S  {$ ?" l* Q2 s' z6 B2 U0 g
   
, B' n' t& ^4 f   //AMBE2000每次读写是24个字为一帧) h2 Y, |  n/ M( Z* L
   //写数据时将数据在底层存储起来,等到中断的时候再发送9 \0 V3 m% S5 f$ @
   //AMBE2000输入数据是以0x13EC开头的5 w  T5 a1 H* U9 q: ~  T
   write(fd,&data_write,sizeof(unsigned short));
, F7 J( P6 H3 A% y2 p1 X   4 l  X4 Z4 Z! S6 f
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
5 z6 @: W( H9 P$ p; i2 D   read(fd,&data_read,sizeof(unsigned short));: j$ H/ M1 Y+ r7 w: r9 n" o
   
$ ]5 X* ^1 ~9 t$ k2 B8 e" r# B   if(data_read == 0x13Ec); z5 X1 i/ s6 ~' z* ]/ v" @7 h: r
   {
: {% a9 |' M. ]. l: L. d  }   
6 U( }3 q% {) Q* {3 h    printf("data_read = %x\n",data_read);
6 K) F7 M: ~5 X! w) O   }
2 ?; Z" b% N2 F# i   + u! k' S7 ^6 s  {2 V4 r
   msleep(10);* e4 m$ r" o% K& o( V, n  B$ E
  3 Z$ z* h" M8 T! q& n) E+ v
  /*
0 T! V! M1 f9 E* M2 ~   ioctl(fd,1);   9 K' d$ `8 _% ]! R
sleep(1);
! E- ?* P! _5 y. k  q  b ioctl(fd,0);
) a" Y8 q- ?% m3 I- b0 Z0 v sleep(1);
" _) \' r$ P. [* S4 L' x* l6 e  j& t */
; q6 Z. a% _& A. d  }   : Q+ A3 W% U3 C9 u* a' ~, _
return 0;5 @# U* |! _8 P

, P. M  |$ y2 W' o8 N}! ?5 f+ V. j1 }3 }2 O* J

; y( R$ V& `+ P) ~1 Q- D/ c- L9 X多谢各位指教,谢谢! 急
- o) B# ?: I2 z! D; e: o5 Z  y8 ]# Z. L+ l1 {5 T9 o6 H' f

6 e3 H! r* \) z$ d* v
/ q) F" _& c! W/ q2 X
+ P4 N& Q0 f) k' C8 f9 |# V1 _7 K8 K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-24 12:22 , Processed in 0.047732 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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