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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
. T/ X: \4 q2 j9 Y/*
- ]/ f  k' ]2 b! J3 p. k * Copyright (C) 2009 Texas Instruments Inc; k: x1 }8 V9 H, ]
*
5 E% v, T% u/ A) l * This program is free software; you can redistribute it and/or modify) `5 b4 P9 L0 Y9 ?: U, e6 U3 S
* it under the terms of the GNU General Public License as published by, o" w5 ^" P6 c
* the Free Software Foundation; either version 2 of the License, or
/ W% q: T4 U$ Y) w( I * (at your option)any later version.
9 q: X5 K8 G0 I1 s *0 D2 h/ B% z" y9 c
* This program is distributed in the hope that it will be useful,/ u9 u  c( D9 `2 r2 ]/ I& \5 b! Z
* but WITHOUT ANY WARRANTY; without even the implied warranty of
! @, C( T8 I7 S9 a7 p' S) q * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  k; j6 n# t/ Y
* GNU General Public License for more details.7 S8 ^6 l1 X9 y9 j; `3 I  n
*7 p9 v. E+ ^2 K) q& v0 V7 x% z
* You should have received a copy of the GNU General Public License
0 T, w1 Q: y& h, G * along with this program; if not, write to the Free Software
; \2 L. O( F3 F  e7 d  { * Foundati
. t1 {  U& u7 x8 X9 \2 n2 r6 q/ M1 g*/
. p( E1 S" t- z9 o#include <linux/module.h>
. u* `& k) {! E#include <linux/init.h>/ g3 |# F8 D' O; v' Z  I
#include <linux/errno.h>
, [% E) [: f3 v& e+ s# ~#include <linux/types.h>
% L9 `6 Z- x) p9 }6 [#include <linux/interrupt.h>
2 x4 t# }0 @! [8 z  U% S#include <linux/io.h>  T  e! w: U+ W
#include <linux/sysctl.h>
9 q+ y: ?/ h, S( y% h- W- p; Z& S! L- v#include <linux/mm.h>
3 {4 K3 ?$ E8 x/ f: I# @6 A#include <linux/delay.h>+ A) a5 d0 S* w0 M  v, Y5 L/ h% z( Z
#include<linux/kernel.h>
. D, `8 \% p- ~3 w/ e" L#include<linux/fs.h>
. B& \* }8 f6 a#include<linux/ioctl.h>- W7 r& j6 P. e
#include<linux/cdev.h>
2 {) c3 {# @( ]9 o! ]: p; s7 D+ {#include<linux/kdev_t.h>; e+ @) Q) `# [- Y* F9 q
#include<linux/gpio.h>7 k4 u7 w4 {" g! O
#include <mach/hardware.h>
- D% c# _% B' g7 J" v$ `, q" q  ^9 R#include <mach/irqs.h>
2 x7 h# W, c1 a" s. v9 l6 s+ I7 ]6 }/ U. W/ k/ M$ `2 d6 L
#include <asm/mach-types.h>, |2 s, G2 G" I- p9 H, e6 P9 T$ W, ?
#include <asm/mach/arch.h>, R  D! R, T2 `; D  T
#include <mach/da8xx.h>$ f) m0 y( a0 O( j4 T
#define  SYSCFG_BASE   0x01c14000* U5 v& D# q! e: o& w
#define  PINMUX1_OFFSET   0x124 : r  W; P" C0 G3 j" F; v  c& _+ F
#define  PINMUX18_OFFSET  0x168
; m  C" S5 c/ j( ~& T" `#define  PINMUX19_OFFSET  0x16c9 A+ D4 z) o. U* u' f
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
- [! W; E4 O9 S4 j' Y#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR0 r: u% z% A; Q8 P
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR- v7 _. W+ D( F$ L8 A- |* Z  c
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR; L; s; p# p  U3 Q
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
- J# E, Y& c  `" ~                            " c( l6 {' H, N2 }
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
6 g4 ~* w5 y5 O) t5 k# q#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
' g/ p4 v6 L. N( G' _7 r- A9 y5 t//PSC2 @0 x" U3 I9 `/ R0 W+ c
#define  PTCMD_ADDR   0x01E27120  " H8 U/ d, ~8 s$ K" w
#define  MDCTL15_ADDR 0x01E27A3C! Z) z4 C! x8 l# C+ r: g7 Y
#define  PDCTL1_ADDR  0x01E27304
8 f5 o9 c# ?% z# t/ f//GPIO8 direction; s0 e9 q: @5 f$ c2 K9 j# E4 P
#define GPIO8_DIRECT  0x01E260B0
: C: O& C; H- {, G$ f: \# j. O  B#define GPIO8_OUT     0x01E260B4/ T" i; l; G$ B
#define GPIO8_IN     0x01E260C0
6 _: j) D7 m7 i# ^, C2 p
1 h- a4 ?, ~& d9 S//#define MCBSP1_RINT    99              
0 A% @- n3 K5 t, b/ Q) Z; y# }//#define MCBSP1_XINT    100  4 e; ?& N; b+ g1 [
static int MCBSP_MAJOR=239;8 ~2 B- j3 M6 H5 I' |3 {6 \' F- q1 y3 A
static int MCBSP_MINOR=0;7 i$ W$ w; y7 f- s  M
static int count =1;
1 a2 Y. [/ `  o2 A7 P+ w  @
3 ?1 e% Q# L* z% q. J  z  h#define MCBSP_NAME  "MCBSP-device"% S: j) f8 u" a3 p# n9 a+ ~! U
# w4 o0 Z# _' `, s2 z6 f
static struct cdev *mcbsp_cdev;
5 m+ G9 F( _& h' gstatic struct class *mcbsp_class;0 B0 h4 G( N# ~( j$ t5 e; ]: y+ h
static dev_t mcbsp_dev;
( `* @2 c) j: ?unsigned int DRR_data;
# j) ?* d- o* G/ U6 B# Cunsigned int DXR_data;7 I2 h6 |0 c' ~* P# H5 q& o. o, H
static int mcbsp_open(struct inode *inode,struct file *file)9 W% I- F1 E/ W
{
# X2 P. F8 P8 E* n   . F) X- w8 m9 t5 d' M5 }; L
   //interrupt enable,initialized
; l3 n8 q( O, h, X) ?* |   unsigned int temp;/ H, D$ L/ f1 E( m+ U, o2 h# f
   //SLEEP_EN(GPIO8[10])---0, U' e* m1 i  Z7 ?- b
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( y% ]- F8 ~# S
   temp=temp&(~0x00000400);
. C; e+ u% |' T3 Q3 D0 k4 T9 o6 h   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
1 y9 K! O' B# e. V( u4 d) l, n! p% C( W  //RESETn(GPIO8[8])----0----1
: v7 P7 _$ e1 V7 Z. d   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 x0 V. s" H7 U/ ~% T   temp=temp&(~0x00000100);5 p& V2 t" K2 K/ R, i
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 D8 A9 M* [1 o+ h, u2 h: i, f
   udelay(100);; S; a4 R% [* J% E  p( l* r
   temp=temp| 0x00000100;' s5 s& [5 p1 K4 x5 c
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 G: W3 w* n8 V) A# y( Z$ t   udelay(100);) @/ h5 X- c6 l! H( f, `! c: b
   printk("open success!\n");; Q: x- l% p5 [$ S4 I
   return 0;
, {$ I0 l4 v5 }+ n+ u- ~1 c}# M/ E% o5 F) c0 h7 x; J
  f; l5 h* g7 m# e6 _# _
static int mcbsp_release(struct inode *inode,struct file *file)! U& V! O& _5 s! n3 Y0 u- w& k7 E
{
7 k/ x( x  M. b/ @6 W$ {+ f   printk("release success!\n");! i2 m- u, ]: Y% s5 x) N
   return 0;% l$ G4 u6 Q) N  h( \3 w
}
: j9 T% ~3 V* |$ a# ?
) c4 H2 o/ I: f" r6 }- istatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)$ Q$ \" X- f1 b
{/ w6 o, w4 e2 p
    copy_from_user(&DXR_data,buf,len);5 e0 K0 u) l4 T: q' @" E2 s
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       0 l! f  ?: Z2 w/ |1 n% h
    return 0;$ u0 j5 q# D* G& r( v' }
5 t  `: T9 |1 ]+ ?, o
}
" H2 y* L4 `; [/ A1 r+ Y' i8 X; t0 @9 w5 Z
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off), ^; W3 k; l% y
{
. D8 y9 J+ g5 H- |* a. ~   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' ?6 k) d! a0 z* h   copy_to_user(buf,&DRR_data,len);
* m# }) I' ]8 W* Z/ `. N   return 0;
* g" j; w9 P+ H}3 @! z9 k6 K. I8 {9 p
9 D9 D' j7 h! e) h

8 }: y$ M( |4 E5 rstatic struct  file_operations mcbsp_fops=/ o/ m/ W& Y2 G8 _* J
{; T# S5 ^* I) Z
   .owner=THIS_MODULE,% T3 u8 @( ]# r& E. M# X8 k
   .open=mcbsp_open,2 n9 |. }4 s2 |1 Y- W
   .release=mcbsp_release,+ O& }$ H/ j- ~
   .write=mcbsp_write,4 x$ `" V1 y( W
   .read=mcbsp_read,
' a. q" J  A" M' {};
, A/ Y3 h6 B. b; @" x& \static int __init MCBSP_init(void)2 D3 Z  G& s! q/ p: N- J5 `$ i
{
; |# u  l# L+ c6 u& b/ x8 @' R7 t   int ret;
8 J% t# C& a9 A& @! d   unsigned  int   PINMUX1_REG_old;
& x! a1 _. U+ v/ U. g   unsigned  int   PINMUX18_REG_old;( v) E9 ^5 z+ u
   unsigned  int   PINMUX19_REG_old;# V' U8 w- b  g, Q7 }# g4 i
   unsigned  int   temp;  
- C6 H/ A4 ]4 D8 m8 X   if(MCBSP_MAJOR)
/ i3 I7 R0 q$ x& ^/ m. f   {
7 \7 v2 t4 ~# j& w# Z      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
# g7 A. s7 Y6 Z" @: b      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
/ u  A8 c$ R, O   }3 b  |3 G) f7 p2 r( X
   else
/ g- q1 f% c7 E" Z- f  C   {# b2 ]$ V# ]0 N
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
9 U) d+ i3 F; E2 `! W      MCBSP_MAJOR=MAJOR(mcbsp_dev);% z5 F/ [7 Q! Q7 K
   }
7 G1 t( O) ~0 W& t1 R& K, X! ~   5 I" ]4 N  ]; H) U
   if(ret<0)% }' ^, y& q; f+ z! t0 S/ w
   {9 P  i! n4 f2 L8 b
      printk(KERN_ERR "register chrdev fail!");
7 P% k7 `3 z* h5 M7 q      return -1;
( Y, d+ C8 o% G   }
0 Y) x% r* L( M3 k+ k3 ^$ M. h   9 M- P% W$ P$ h& \0 Q7 G5 A1 G
   mcbsp_cdev=cdev_alloc();
. @/ R4 v/ d- Y, t: y   
+ i$ q4 b; L' |7 B/ M   if(mcbsp_cdev!=NULL)
# J0 x6 i; Q* _0 ?7 Y. k  u   {, n% T: }3 K6 c6 f
      cdev_init(mcbsp_cdev,&mcbsp_fops);
; ?6 l" {7 X) T; C4 ?% Y0 s) E      mcbsp_cdev->ops=&mcbsp_fops;/ H9 M9 g- y/ [6 G
      mcbsp_cdev->owner=THIS_MODULE;1 N, w; M$ S+ T$ e8 A; F. v) H
      
8 c8 u, C8 C9 C0 T+ L      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))1 E! P* B, @6 Q8 A
          printk(KERN_ERR "register cdev fail!");
$ F  H+ {' K+ [: V9 [4 s9 T      else9 Q2 |4 n1 V" r3 R( F/ `1 B
          printk(KERN_ERR "register success!\n");
- \; d1 x0 D& G: p  N   }; T* h9 y. ~! c2 D
   else
7 E$ d( F, Q+ n" |- }7 D3 @   {
2 I4 F& ?7 C, _' `( X/ H      printk(KERN_ERR "register cdev err!");3 r( b. f* g; k1 C. O% P1 f
      return -1;& c0 N9 g) O& l: V& e) ?
   }: H* H4 T9 ?5 z
   
* P1 |. P9 D, W' o4 a7 E4 [  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
' m- B% ?# v$ d+ N% Z   if(IS_ERR(mcbsp_class))& [" ^) z$ S, e0 i$ n
   {, |. f! ?: d: W9 a9 h7 ~
      printk(KERN_ERR "register class err!");
0 z  k9 A: g- X& }/ ~- h% v   return -1;
) g& g  H% Q+ D1 `$ @! U   }( e. y! z9 r- e7 u
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);- h. Y* y  b' k& T6 L
! d5 @3 I3 |0 t% C% D. c  v# M
   //PSC/ y6 s& U) V. l! d! h
   //add Enable MCBSP; S/ j+ o( C# n5 ~9 D
   //test
' f2 \- T" g' @) b0 w$ o   temp = 0x80000003;
( {! n4 p! n7 y% P. u  v" s   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
# M& F. i$ C; i4 H. q. g$ ~- M& a" }   temp = 0x00000003;
4 a4 _( i5 N* O   writel(temp, IO_ADDRESS(PTCMD_ADDR));
  p* G' n7 \. p* w
1 q3 N; b8 \# y4 t% b   temp = 0x001FF201;
5 |% ]* v) U8 ~  i3 q   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
4 K' x! z, U2 k6 H, n8 l2 o" s   
& C3 q$ E$ S3 w   //PINMUX  ' Q- U2 ~2 o( b  E$ t
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* i, X) h6 Y1 \( T5 S   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ( d5 z& l* v( @  [; R
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   # s1 {4 T2 h' @$ F! _. d7 W
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);* l- B! e% z. g4 M
   
0 D0 ]3 S: ?* z# a  R* I) K   //SLEEP_EN,EPR,L138_SHK1,L138_RC8 l2 c0 o7 v/ X0 b/ M/ D1 X
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
* X: ]' a3 t) G" o   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ; r, S7 ?& ]7 o3 h0 ]5 X- u
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
! L5 W3 ]( }8 D- r0 B8 s( ^
: K& K3 X' i- s! a; y   //RESETn,L138_SHK2
+ {' y  X% c2 z6 F3 H' V# U$ `   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ' V; o, G( h. C% Z* L5 V  N: q
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ' P2 V4 |& b$ B- t
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; t- I2 s& u+ U* V4 @$ q; M: K
  s9 S* a8 z" J1 s7 Y4 Y9 x$ W 8 K2 Z5 v% u1 @9 j7 |# b  R# i5 b
  //SPCR Register
8 b1 A1 C$ D2 r! k  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset; P% U$ b2 m( e; O
  temp = 0x03000000;//(DLB=0)
: Y) W  `4 `# B5 Z* B // temp = 0x03008000;//(DLB=1)4 z2 B: N1 u( {8 E' {3 `
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
& o& D5 O' [1 y: l  temp = readl(IO_ADDRESS(SPCR_ADDR));
; Y  ~4 V7 S! D$ l  printk("temp=%x\n",temp);
* y  i' ^4 S6 J# [' V$ g
9 X$ H0 M7 w5 {2 a" G  e   //PCR Register2 U  a5 |9 ]) V5 m3 {3 F
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 L8 H. f2 ^* {& g" Z# j6 k) ?
  // temp = 0x00000F0F;
8 \% Z/ m8 N  c# y7 n  temp = 0x00000B0F;
# F2 C/ F+ @9 g$ f5 L" L" d  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
* S( L1 \% M3 J5 J1 {  temp = readl(IO_ADDRESS(PCR_ADDR));
4 \$ B# G0 ^% `/ f2 Q# [6 ?  printk("temp=%x\n",temp);  
) V: R. A# R/ U( v   //SRGR Register3 p: {% u- G* s2 I
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
+ C( ^! ^( D! D8 w4 Y5 s8 }  _ //temp = 0x301F000B;
7 v& P& F* Z% L% L8 x5 r1 O# W* Y   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
) Y8 I3 p1 x# X1 C- }- }* y: U  temp = readl(IO_ADDRESS(SRGR_ADDR));
! f. X+ G: w. E  printk("temp=%x\n",temp);: j" p! k! h/ {$ H6 ^* Z! z. G# A  G
   //RCR
) X6 t0 u$ a  V  b' t' R6 `   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
' [! V4 f$ n$ y0 E( e' M& S   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0! ~  C/ L9 w: U# |
   temp = 0x00440040;
; E- W: J) S' R5 F0 v   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   4 o: J( m  A4 i* [; R; P' s& Z
   temp = readl(IO_ADDRESS(RCR_ADDR));1 r0 ^! _: d# R& w' I- D. ~
   printk("temp=%x\n",temp);' H5 \1 m: m3 Z
   //XCR& o: L- i/ z, @
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 ~1 M" \; H( d
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) u7 a+ b- c* o9 y( X5 Q+ f9 @
   temp = 0x00440040;( ~" |! C7 k  t2 c8 F+ g
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
8 k6 y5 s; ~& C2 `& {8 M3 b   temp = readl(IO_ADDRESS(XCR_ADDR));; H5 p8 `  @( i  h: l
   printk("temp=%x\n",temp);
" k  m  n/ }7 ]  udelay(100);7 l1 @, z9 j4 L$ b. \7 i8 f
  //SPCR Register
% f! j9 N; i7 D! c: ~  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
* P- v+ p8 O" S! N. X- P  temp = 0x03C10001;   //DLB = 0 VS DLB = 1% S9 V; o, J( t$ v2 Q3 ?$ X
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
" y1 e& e- \3 X. ?- g  b  temp = readl(IO_ADDRESS(SPCR_ADDR));% r- }1 U6 Y4 v. H7 s/ Q5 Z" H
  printk("temp=%x\n",temp);
/ e' p; E- ?0 p- d9 y1 D  udelay(100);
8 F: p* z" C2 G5 L( T6 n1 n7 x9 B; u  _1 |' n6 [
  //set GPIO direction
6 Z+ b# y& k; s" t   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));5 L3 M& }6 A8 l* o+ }* {' j' q
   temp = temp | 0x00000100;//EPR----input
& }3 w$ x8 h& ]+ ]! f8 D; k   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
+ g6 R& c6 b& x  D   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ! v6 s- d# {7 Q. L6 m
. R( O$ D+ ?; e; }: C* g2 T1 W
   return 0;
# J0 o6 Y! E* G; ?! R! y}! ^+ w) `# r7 V9 Y: x
static void __exit MCBSP_exit(void)9 H- R  T2 D1 p0 W
{
( b( R/ E, P! q: `   printk("mcbsp chrdev exit!\n");
/ u8 R2 i5 o5 S7 Q   cdev_del(mcbsp_cdev);5 {8 {: q+ ]) H: B. ]7 |+ A
   unregister_chrdev_region(mcbsp_dev,count);
1 k) X( N7 x2 z   device_destroy(mcbsp_class,mcbsp_dev);
5 d" }6 Q. I1 S, i4 x  ^8 B. L) W4 {   class_destroy(mcbsp_class);7 m  j0 K- _7 m
}; F: W4 C- q5 m9 v; `5 h' K
module_init(MCBSP_init);& c9 M) c5 s- w8 P* \7 V
module_exit(MCBSP_exit);: V- Y$ t$ n5 p/ ]/ U0 ?- u7 c8 Z
* B% d9 Y; F+ |' A  G
MODULE_LICENSE("GPL");
7 d, [  Y1 h2 q& q' y4 t0 g- V6 O1 S! p
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. ^/ \7 j# c# n! d) [4 u我的应用层的测试程序如下
( a; t! C! z7 K, s0 H& `#include <stdio.h>2 a8 @% M! _1 K4 F2 @% _
#include <string.h>
# |2 o; `0 z0 g, ]$ ~  V& k; b$ W#include <fcntl.h>1 e. O! }' T& `2 p; ^% z9 h( Q, a
#include <unistd.h>3 u7 D: S9 ?/ i+ D. E6 }6 s) }
#include <signal.h>
' S5 u4 i, g. h#include <pthread.h>       //线程2 u* m8 E+ f& y) z% M
#include <stdlib.h>
+ i$ P4 A8 _$ q/ _( J) s* `#include <pcap.h>          //捕获网口数据
- D$ ^3 N; @  k. X- X1 X5 S9 g#include <semaphore.h>     //信号) B' ^# i/ X9 O3 C
#include <sys/types.h>     //消息对列! O! L- Y/ D3 m! o
#include <sys/ipc.h>       //消息队列
3 o/ B: {6 k$ I2 l# }#include <sys/msg.h>       //消息队列5 L& Z1 k5 H5 w0 n, `9 Y
#include <sys/select.h>% X  b" Q3 I% |  {1 W* ^, X. ?. r0 \
#include <sys/syscall.h>
4 ]! R! i0 A/ X) m6 ]#include <sys/stat.h>
+ d+ ]+ o4 ~1 y% @5 v#include <sys/mman.h>
# n6 Q* B1 K" Z; Q7 i#define msleep(x) usleep(1000*x)- y7 V* a# M9 g3 c# ~4 I' }( t
0 u9 y4 E: [4 b" ?( p
int main()
& U2 [5 B6 n* u+ ^$ J{ ! u4 J; `0 @+ E2 E# t$ J
    //MCBSP,ARM与AMBE2000交互设备
8 ?. u8 J. V0 E8 U2 p  \; ? int fd;
( ^( @. Z/ C5 J/ o unsigned short data_write = 0x5555;; i7 [0 P! k! g8 v8 Q  z5 Z: _9 y
unsigned short data_read = 0x00;# }3 E$ G: u5 R  p
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
4 D$ u( C3 m. S+ n/ M //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);; A' d! x0 v6 I/ V
    ; L% F; ]) J2 U* T# |. K% t
  if(fd < 0)
1 `/ {( Z0 n9 T7 w$ T  {
. w. t6 J1 L/ d& b     perror("open failed\n");
' s* C# c" J" j% ?$ D: N' @     return -1;
: d, r5 f* Z8 }' B  e  }
. s6 o# @- r) {! k  : K' l" t. r4 D
  while(1): I8 t& M" E: k( v
  {0 ?, W  Z5 ]4 W4 D: ^2 J% ]  g
   
! |% Z5 z( {' t( \& D, f( }) Z   //AMBE2000每次读写是24个字为一帧
: _/ g1 f) \( o) v+ ^   //写数据时将数据在底层存储起来,等到中断的时候再发送' m2 A7 E/ _  Y' f& J
   //AMBE2000输入数据是以0x13EC开头的# D  D* _/ e4 Y8 n
   write(fd,&data_write,sizeof(unsigned short));; [/ G: @6 ?' |+ N
   9 O0 \0 O( d( ?7 p
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  8 j) U5 ^& b0 h" N+ R1 G* {
   read(fd,&data_read,sizeof(unsigned short));# m; ^% c& S. B& G5 Y
   3 X) \4 @/ s  _4 B$ h' c4 Y! F  [
   if(data_read == 0x13Ec)
, q: S7 M5 V  O( |9 Z   {
. F+ @# m/ d, @! j" `   
9 Y8 G9 W8 a( W; k4 u# v& a# V) A) m' r    printf("data_read = %x\n",data_read);3 M; x* x. W9 |. H/ Z8 V
   }
: \& u- O( k6 ~% {   2 K2 p3 A! z! O5 x3 `, ?
   msleep(10);' M7 ~& w6 V) y; a& O. P; {
  
; q/ k4 V2 M0 l0 J, h  /** g9 n5 Y- M$ v7 }+ m
   ioctl(fd,1);   
' w4 c5 f# o) K7 p( {( r$ _  j sleep(1);
" D7 \) \1 j3 s4 H; I% f# ` ioctl(fd,0);5 i/ L0 g1 _. o. K4 T6 t" i
sleep(1);5 _3 Z0 ]/ }6 Q% s3 E
*/
5 B. U0 v! E5 I1 O' B. W  }  }   ! b* N: H8 n( a0 b. \' w
return 0;
% Z7 i/ f. ~0 O/ B4 q# | $ `) n1 N4 d0 N' w( K* z
}8 }. U" T3 M/ r+ P( D- W

$ _3 c; J% ^- W" @, m* ~多谢各位指教,谢谢! 急6 X4 m" D1 b6 g  q2 t5 \
& G6 U2 g/ \5 ?) F) ]) ^
% h* f6 T- ^3 l+ V/ Z/ M; T

% M* ]  l) B3 f" D6 c9 |
6 m2 H7 ^6 N$ z& g. M% \$ L7 ~% e. G$ G/ S) I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-16 12:30 , Processed in 0.050760 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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