McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
; ]' U) {2 G1 ~# h/*& i/ o; r/ V8 V9 m6 }1 W
* Copyright (C) 2009 Texas Instruments Inc
$ ~# C6 n# }4 ] *1 {- ^) h" o( {1 n% g
* This program is free software; you can redistribute it and/or modify
# U& Z. p/ N( [9 J9 I * it under the terms of the GNU General Public License as published by0 m0 y3 Z$ p  A4 _4 W
* the Free Software Foundation; either version 2 of the License, or0 E# a' D$ K' ~0 E
* (at your option)any later version.% [: |6 J1 H) Y2 T  f
*
/ m6 Q1 g5 `3 }* h * This program is distributed in the hope that it will be useful,- ^# [+ _7 F2 Z+ ]7 K+ B
* but WITHOUT ANY WARRANTY; without even the implied warranty of
/ c! n4 l$ Y! ?( g5 a1 U; B * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ [6 l( {1 x/ n& z  p  p8 ?
* GNU General Public License for more details.
2 p1 b5 Z# A) e. w) s *
& X- C3 m; g1 M8 i' k- i6 s' t * You should have received a copy of the GNU General Public License! I2 @  l& x% I# L& _5 D
* along with this program; if not, write to the Free Software
) l3 q6 s7 P9 N * Foundati
: K' T: I7 Q( x8 K% W- K*/
- J$ ^( G+ q5 V8 t( ]0 K5 ]#include <linux/module.h>% {" o, t6 q) \9 Q3 S1 w
#include <linux/init.h>
9 k+ |4 U" t; l! L0 H4 \, l1 ~#include <linux/errno.h>* E$ S" F% ~2 u- T+ o% y( c& @* n
#include <linux/types.h>6 U7 D. \3 f0 K5 F
#include <linux/interrupt.h>
. Y/ S1 P! L4 H$ m/ {#include <linux/io.h>
" D! c$ U' |% D& I% z/ w+ K#include <linux/sysctl.h>
( i: J  n/ H9 M' A) B+ e( {#include <linux/mm.h>& i1 e4 b3 [/ A. h
#include <linux/delay.h>* c) n  C5 B! W! y: _
#include<linux/kernel.h>. t! c& `5 O* v  _# ~) }$ y) P% [
#include<linux/fs.h>
, Y8 [7 o4 r& s8 [7 @( q#include<linux/ioctl.h>
4 {' E- V+ z" \( M#include<linux/cdev.h>
: q8 y& o4 n6 i) D7 }#include<linux/kdev_t.h>
4 {+ T8 G, r" m6 M5 ^' V+ L; R#include<linux/gpio.h>
( b* J- q. |# F! T+ ~#include <mach/hardware.h>. V! G4 ~. v( ^# S. _
#include <mach/irqs.h>
0 g( K: o/ a2 a9 s% j0 d: U. [% c& o5 ]
#include <asm/mach-types.h>
; b! r  e% Z) R4 z* @) S#include <asm/mach/arch.h>; Z6 D. d" z' T2 Z) A7 ]8 T
#include <mach/da8xx.h>
$ `. n6 q+ N6 K2 A( X  R#define  SYSCFG_BASE   0x01c140001 W  o- t0 \* {3 {# |: Z8 |0 K0 J
#define  PINMUX1_OFFSET   0x124
' G0 u: N0 `" G. A2 X% K#define  PINMUX18_OFFSET  0x168 , X; b1 t& l1 d' \7 m
#define  PINMUX19_OFFSET  0x16c8 o- K" w5 D) ?& r+ j* h
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
/ i& L9 H, F& w0 Q) ]6 V#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR2 [6 Q0 W" N6 _/ Z, P: l
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
/ X$ t+ V# x( H5 A$ `2 k#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
7 G2 i0 E  s0 e& N* X$ ]#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
, K$ G  N0 P+ J/ {( L                           
$ _; |9 Y: f% p8 `/ K( z#define DXR_ADDR      0x01D11004  //MCBSP1_DXR3 O  f5 r. S/ k6 y
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
0 f9 v6 ]9 |% o% U0 s; b//PSC9 m5 g- K% }4 L* ]2 ?; N' N: \, W8 a
#define  PTCMD_ADDR   0x01E27120  
8 w3 \! F/ r$ y#define  MDCTL15_ADDR 0x01E27A3C
& G: n/ J/ i9 _0 e#define  PDCTL1_ADDR  0x01E27304, _* Y- J; E5 B  j9 ]
//GPIO8 direction
" L4 h  u, D/ H7 C5 O#define GPIO8_DIRECT  0x01E260B0
4 G* t# z7 I$ n3 j#define GPIO8_OUT     0x01E260B4
! J2 w1 p& c* {# h) m#define GPIO8_IN     0x01E260C0. Z; I: F& R0 o) G; T; W9 @- p

+ y& [9 D3 M. a4 O2 x5 ^3 h" V# i//#define MCBSP1_RINT    99              " z6 z' U6 ]1 y" g: \1 \
//#define MCBSP1_XINT    100  
* H4 I1 p/ e0 z+ Cstatic int MCBSP_MAJOR=239;- ^5 }$ e2 ]8 G/ P: m
static int MCBSP_MINOR=0;
  w4 s6 @$ a8 L1 fstatic int count =1;6 y! H2 C" u, P  p. {  h

2 ?: R) a3 R; z4 F( m#define MCBSP_NAME  "MCBSP-device"% w4 K, Z) V7 C% F
9 S, O# S( a$ Y0 t: k8 O2 D% M
static struct cdev *mcbsp_cdev;; T4 B: e0 e4 Y% F1 f1 ^
static struct class *mcbsp_class;
8 b3 M6 y: r3 l% kstatic dev_t mcbsp_dev;) t3 P4 g6 ]0 L& k3 I* x. W$ Y
unsigned int DRR_data;6 {+ F' }$ A; k' P
unsigned int DXR_data;
+ K  ]! s$ j, |- I# `- @3 ystatic int mcbsp_open(struct inode *inode,struct file *file)9 W' O( M$ A1 w% z* G7 R
{
0 F$ N  m6 w: O2 u4 [   6 w3 Q* p( w1 R$ h  o" o
   //interrupt enable,initialized
+ |! |5 P, W% s3 [   unsigned int temp;
+ {7 E' l; N8 c: p* a2 v   //SLEEP_EN(GPIO8[10])---0- I+ I' b& i) u
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- J( `' w- y1 B2 n6 i   temp=temp&(~0x00000400);
" L$ J" N: X) i! c2 i* D6 U   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 a  Q- m2 `5 K5 O- h  //RESETn(GPIO8[8])----0----11 e4 K6 m; G1 l+ Q$ V
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 X2 D9 T! m4 m1 Z4 ^9 d  H- m) r7 A
   temp=temp&(~0x00000100);$ g1 T( x* h. y1 j8 ?; ]
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 n1 [. C0 y1 i1 m, c   udelay(100);
# L/ F* B! `8 U# \9 J$ W   temp=temp| 0x00000100;$ X; U! Y7 ?# U$ m
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
4 y4 L0 Y1 @+ s2 ~   udelay(100);
. J- @/ j% J2 e+ Z" a   printk("open success!\n");  y5 ~; G2 R" ^+ g- T3 X5 y
   return 0;& c* `$ A" r8 w
}" p! D- S2 [" t, J
8 Q8 p7 t. G% w8 I
static int mcbsp_release(struct inode *inode,struct file *file)) a& c4 o8 ]  B7 t9 T- n- \( K/ w
{! e* l; Y* z5 |6 q7 {2 U2 m& l
   printk("release success!\n");& A; f; f  {5 s7 B( T
   return 0;; m4 B- ~: l' H+ F  f
}& _( }7 d* k3 S0 {6 s, W0 a
  D* [2 A2 R9 A+ m  D) s$ q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
2 W! C8 s- l, t/ [" q" J3 P{9 {" \6 H* f% t" n; H0 E  i
    copy_from_user(&DXR_data,buf,len);3 l( q$ Q) E. s
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
- o* \( A& k  G0 F. c# t    return 0;
5 z% D* y$ H, U1 y3 q$ G4 V 9 Y' n, {4 [! K# B' d2 t0 C6 c
}: D$ t3 j# G5 Y" L3 Q
% X) ]9 Q+ k; U$ ^6 D
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
, e+ a6 e# D) p{
; G+ x+ q; {+ a$ c! M! }# I4 W   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- s# E& `# z: u/ u! @
   copy_to_user(buf,&DRR_data,len);
- h4 R# Z7 I- [1 @6 T6 P   return 0;
, S5 J7 P) R) y2 Q}
+ k" d; \0 L9 O" @2 k9 d& p" D- Y" I  x% u. }! i  ]

6 k- _: k! ^+ {( n0 J( w8 istatic struct  file_operations mcbsp_fops=
- Q8 u2 L! x; o) n9 d' s, \{& ?8 `# u' t) E" c6 ?: b
   .owner=THIS_MODULE,
' c/ V! h/ Z* U5 o5 T# \   .open=mcbsp_open,  C  s# }9 q  p
   .release=mcbsp_release,
8 B* }/ W; [8 L' B% e/ X( r- t   .write=mcbsp_write,' G1 w- S0 `& X/ M6 T/ D% u, W5 u9 K
   .read=mcbsp_read,
1 w+ ^9 a& ^; N};7 |1 _6 M) \( x, D5 W& q
static int __init MCBSP_init(void)
+ m, c) p) r; ~6 D8 L6 t{: H1 b/ C9 P9 ?
   int ret;
1 `" c8 k2 M$ |% L8 Q9 c   unsigned  int   PINMUX1_REG_old;
& h% G# s3 q4 i7 X, t   unsigned  int   PINMUX18_REG_old;
$ E/ N- v9 ~" [. V  Z2 u9 S   unsigned  int   PINMUX19_REG_old;
0 _- l  B, q- A   unsigned  int   temp;  ' a. z7 _( `( T) {5 z* @+ T! C
   if(MCBSP_MAJOR)' K) ?( c" u* W7 a9 K
   {8 |8 g) D4 j' c: C) ~
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
! A& L5 j" O2 T/ t' g6 O& s+ J0 f      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);( P( _* {! W. d! l- ?& `4 [* ?( K* x
   }5 @8 l2 F# D. t8 Y
   else
* o9 b! a$ t2 v   {
6 \# j  ~+ O2 C8 r$ m      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);! A; R: T: G0 G" Q1 H) v# {
      MCBSP_MAJOR=MAJOR(mcbsp_dev);4 e3 _9 D4 d0 ]5 X2 f) r
   }
1 Z1 s' Y7 M- c" }( D7 {   
+ \- q# o9 b" v  l, a6 ^   if(ret<0)
, w. o; L3 t% W( Z6 c/ x. w   {  x9 S" M' P: J3 f+ w/ ^
      printk(KERN_ERR "register chrdev fail!");
4 W2 i1 _( _" p6 H/ O" m5 ]      return -1;
7 p6 e1 ?" b, E, R   }
( r' X! m  y0 Y. k# P! Z   
5 w0 E# B2 X# _, ]# d9 P( h   mcbsp_cdev=cdev_alloc();
" m0 `% k; X; J  R2 f+ Z$ t   
& r! d% B9 I) _   if(mcbsp_cdev!=NULL)1 d4 W; p7 R5 c
   {
, I. {. r4 M/ h: r: b1 m      cdev_init(mcbsp_cdev,&mcbsp_fops);
# j; T" A4 {4 P- }0 \      mcbsp_cdev->ops=&mcbsp_fops;9 R) l3 Y' O0 m& E3 t  M. \1 o" J
      mcbsp_cdev->owner=THIS_MODULE;: O# P1 I1 h% V$ |, p
      8 K4 E4 ]" W% C4 L
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
& {( p2 }+ c9 X  x2 M! X          printk(KERN_ERR "register cdev fail!");! w$ F% S  r5 t! Q( U+ h2 f
      else
- `8 `" X# `- A: [          printk(KERN_ERR "register success!\n");
# {7 k: R+ a% y8 q2 [+ |3 ~! V   }
& r3 [/ P" o' A+ A2 u0 n   else4 q  Y) u0 K: e% ^4 S, e) G
   {6 M; s# ^) q- s, z
      printk(KERN_ERR "register cdev err!");
+ S# p7 k( A' S" K8 J- Y0 s' h      return -1;% O  Q% `0 u  J4 T) M$ x+ U
   }' t1 L! H# v! S& S' h# N
   1 U6 t- v/ ]) R0 M" T" |, K1 C( V
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);$ R: k  q" {8 X) V& l: u
   if(IS_ERR(mcbsp_class))
: g6 z) h7 o2 d+ L; f2 ]+ W   {
2 h/ Q; k: x# O. r      printk(KERN_ERR "register class err!");) o) k' T% {& j% e
   return -1;
8 k+ h% u& ~) q7 d) u   }6 o7 P$ l5 n+ J, u
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
* W6 i, m% o8 |6 K1 u+ M
! N% ~* U7 Y: \   //PSC
- T8 e: }. `6 a, D/ q   //add Enable MCBSP8 g: J6 I* ]2 Q, X% `! H5 t
   //test
: @3 H; `) `7 y" b! @   temp = 0x80000003;
8 b* S1 ?+ q% Z6 h' C: e5 h, V   writel(temp, IO_ADDRESS(MDCTL15_ADDR));9 m6 _- A) j+ O) W+ O
   temp = 0x00000003;
, S; S+ X8 o" F; l   writel(temp, IO_ADDRESS(PTCMD_ADDR));
: Y/ C2 d, m; J. m( M , m7 k0 I# _. R
   temp = 0x001FF201;
6 o( X% q! ~% G% K( C2 W   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ W# |2 _+ d+ a6 a0 @   
4 ~" k/ P6 U+ s( F$ _" ~   //PINMUX  ' ~5 r) H0 B* U2 c! ^$ z9 k
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
% F9 I. ]. P' z, i6 C0 v   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  6 [( d8 m" |7 C' _9 x3 \4 G' _1 I
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   5 k/ k( \1 B- R2 w; |6 e& b$ t5 n
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);9 X, K  }/ C/ |3 ^
   : }  Q" i4 k. M) B; {& [
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
! k4 x$ E- n( ^: T6 P( B# g- f   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
  S- ^. ^* F/ O1 s   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
& a9 N; g9 w! m' d8 K% E9 i   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
3 D( r2 I  b* C% S$ z: R  z  z0 r9 s
! D; o2 ^; |7 H   //RESETn,L138_SHK2
& w( h: X3 p% D4 {4 G7 ^   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ( z. z6 M5 B7 G5 a/ T; y
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
! s' L0 H  {- I7 q2 D+ P4 h   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 r9 w  t: p. y8 o
# T7 Y/ a( }) \( W3 X
( o  S1 V' }# z. t% r6 @  //SPCR Register. S3 A& D5 u" W+ B" U+ H
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
* v# m" n% f) a9 Z! A( r  temp = 0x03000000;//(DLB=0)
; j( ]+ r1 h* S; |) Z // temp = 0x03008000;//(DLB=1)
- s6 c. Q4 T! e- i+ ?: d5 n2 {: X  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
4 B) Q2 h7 c* {3 W% {+ J" b4 w/ v  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 E5 b" m, e! C! c8 C% V+ V( ~  printk("temp=%x\n",temp);( Q6 u6 z( k2 W) a) Q$ J3 |

3 @2 T; |4 Z+ ]! o4 Q5 N   //PCR Register
! M: v) z2 z' k6 V% b   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 T" g1 l; K$ X5 \  L& L3 C) {/ L
  // temp = 0x00000F0F;9 s7 X& F- Y. D+ F: `3 ~
  temp = 0x00000B0F;2 \7 l/ T- `3 Y
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
0 W6 ]+ ^4 C: e$ N# L+ i  temp = readl(IO_ADDRESS(PCR_ADDR));
5 w/ |+ A) E" W, ~" z0 y  printk("temp=%x\n",temp);  
# a& ]7 e1 C) ^$ Q   //SRGR Register
& V* C/ E2 C2 q2 k) c* V% f   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11# w4 E+ b# ^! v5 @
//temp = 0x301F000B;
# |7 j' [( x0 `; @8 D/ D   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
4 M7 H6 q3 ?& `1 c: n; x  temp = readl(IO_ADDRESS(SRGR_ADDR));
# K4 ]3 U) f9 U0 C4 ^- E7 c  printk("temp=%x\n",temp);
, l% J8 T) b" a, c* j2 \   //RCR! p5 b& e0 M5 S! P! _$ }
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 [' ^6 C/ a1 P) g
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( p$ x5 P+ ]( \   temp = 0x00440040;
, Q  _8 j4 R  p   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   : C5 c2 z1 v  |, V
   temp = readl(IO_ADDRESS(RCR_ADDR));2 n7 N3 H. M) |$ r( \* F
   printk("temp=%x\n",temp);7 O% r) f3 M) g3 d0 K9 J
   //XCR* D! {. U+ Z. v6 t7 ]
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-14 F1 ^- z& P$ K% \& j. J
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
5 U! o' s7 @0 g% }# j. |. G   temp = 0x00440040;1 |1 v# s$ b' A
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   $ m# U7 f1 F/ M' I: q3 M! ~
   temp = readl(IO_ADDRESS(XCR_ADDR));
" k% }3 {3 `/ w1 K6 e   printk("temp=%x\n",temp);
2 ?# D2 k; r$ |3 s! X  udelay(100);8 T; x/ V" f' z9 M+ a. V- ]
  //SPCR Register# X1 H3 `& X* k$ M1 ~& F
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! x, o2 C8 T; q
  temp = 0x03C10001;   //DLB = 0 VS DLB = 19 V/ P+ c7 Y! _7 a5 I
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
" W& w- v. R1 z" F  temp = readl(IO_ADDRESS(SPCR_ADDR));: ~5 [4 X; x- ]. [
  printk("temp=%x\n",temp);: e# N. q1 Z8 V
  udelay(100);
: Z7 t+ i2 q5 a& ^' o: C; R$ Q+ l2 g! K9 [- y& @3 P
  //set GPIO direction
% E: o3 X1 }0 s" q4 c, ^   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));4 F' G- J; x: K0 B
   temp = temp | 0x00000100;//EPR----input
( H! E5 R$ r# k" R7 [9 M   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
* r& i. c$ I7 G4 \; u! |7 x1 H   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
9 y1 u0 D, h5 f/ W; s / m) Y" E6 Q" P8 T0 y% `. ]
   return 0;9 a* S5 U/ T- |- m" q3 \4 {& ~$ g
}
) ]4 ?( h1 Z' C. m0 X9 rstatic void __exit MCBSP_exit(void)* j% q  O7 i6 M2 L  j! B
{
2 z- M0 X+ Y" m   printk("mcbsp chrdev exit!\n");$ x7 i% l# \3 g4 [; }
   cdev_del(mcbsp_cdev);4 K" U% }% m, R. i% |$ |
   unregister_chrdev_region(mcbsp_dev,count);4 g6 |$ r) L& @
   device_destroy(mcbsp_class,mcbsp_dev);
9 t3 m) a# K2 i7 B+ N$ p0 q# p* v  M   class_destroy(mcbsp_class);. M7 X6 X* G  |) S) G
}
, O( ?: a8 y6 \, [module_init(MCBSP_init);
+ Q& R! V" e  u% P  E6 {module_exit(MCBSP_exit);
( ?3 D6 e) O8 V8 E* B; M! j% `# l' Q( s1 ]0 ~$ |, U( l: D2 B
MODULE_LICENSE("GPL");
* m1 k. q: \% V; F  u
0 t0 b1 K) B' |/ X6 g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 J9 j5 K: B, a& G2 N& i1 U' O/ A我的应用层的测试程序如下
( b& X$ v- p- `! ~! l  \#include <stdio.h>
( b  @7 H3 W( h5 I#include <string.h>( |& A8 ^! s6 P8 M: Z
#include <fcntl.h>
! K  n/ O- `2 h- d3 [6 S) [: J#include <unistd.h>1 h) u$ s8 f8 \9 s# ?2 X9 @# ^
#include <signal.h>6 Q) `9 Q* S) N7 \4 I! z3 W
#include <pthread.h>       //线程$ L* \0 R, {0 d' R; D0 U, ~
#include <stdlib.h>
8 Q9 L/ ]6 l+ X  c#include <pcap.h>          //捕获网口数据
& p3 g/ q" \: Z+ U+ R7 w#include <semaphore.h>     //信号6 \6 J2 v) R. W$ b1 D5 ?& H
#include <sys/types.h>     //消息对列; Y+ u1 A1 z+ |1 {( O& `3 G- C) V
#include <sys/ipc.h>       //消息队列3 x2 U# j, W% H1 H+ _6 V. ]
#include <sys/msg.h>       //消息队列- w4 W$ w5 L: y! z* x% ?
#include <sys/select.h>
4 p7 C6 r8 g. S#include <sys/syscall.h>
' D5 k) k  u& }% N8 I#include <sys/stat.h>$ I6 G' C/ g7 H, A. v* b
#include <sys/mman.h>7 Y! W1 M) P, ^% o. e# {
#define msleep(x) usleep(1000*x)3 z# L. S+ o! D$ w" U2 @) g
4 E* n# k" |9 T
int main()
7 x3 i3 l' t+ Y! G/ Y# H{
" }, V6 D+ n! O/ F+ m    //MCBSP,ARM与AMBE2000交互设备
  \* ^- l, A  J" u int fd;
0 j' Z- L! K, K' A% H unsigned short data_write = 0x5555;
3 }& U# _3 I. J9 X  b unsigned short data_read = 0x00;
0 D4 n0 t4 b; n7 h9 J$ N& n3 @& r  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);' _6 r: \7 x7 q3 }2 D9 j9 Y
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);" h$ f* @9 {8 p0 _2 {2 T# r
    ; K! v# P$ K# j/ i0 p/ R
  if(fd < 0)
1 L7 H. _7 v9 _5 h! h4 G  v8 ^5 \  {
! a4 g( K0 q; `5 N* g     perror("open failed\n");/ r* `, z( P. {& i
     return -1;
9 F# b$ Y. I% O8 e1 W  }1 W3 x% j4 I* |) G
  ( v2 z2 T; X! a# _
  while(1)
/ t  \, |9 f4 f/ h6 i  {
3 L2 e; G1 U) v' g# A: s- _: R   
! ]* s- E! p8 R! g6 [   //AMBE2000每次读写是24个字为一帧
7 z5 _0 N% o) ?$ m' J$ t   //写数据时将数据在底层存储起来,等到中断的时候再发送; p2 V3 T4 k$ Q& f& `! Q7 F8 N
   //AMBE2000输入数据是以0x13EC开头的/ r  w4 N: I9 c( N% A) x5 A
   write(fd,&data_write,sizeof(unsigned short));
4 o5 p8 ?& r' b' ~) _   
9 X+ w3 z7 Y1 s" ^   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
- _) E2 E: a2 V( H/ C" `/ p   read(fd,&data_read,sizeof(unsigned short));0 Z' E0 o/ c1 K& {' L* m
   
* d4 c& h% c* j( W2 L6 N   if(data_read == 0x13Ec)5 F) D% P# {6 b' w) L! D
   {$ c7 a) C4 v( Z! \/ g  e
   
2 _: c/ `3 q8 |* O    printf("data_read = %x\n",data_read);6 V' i0 \( W* e4 N1 N' y  H" X9 T
   }( h4 B# X7 J: g
   
" N+ V- T' {; G8 C' Y& [7 G  y   msleep(10);
) D- G8 O$ z. B  ( \& U1 B7 H1 c* w7 i
  /*
, Q3 q) f' ?: _! n+ X" W   ioctl(fd,1);   
( a& I/ e0 N4 ^ sleep(1);
% x4 H9 O* G' D) ] ioctl(fd,0);( x. l8 P+ X* C" d* `
sleep(1);
7 v4 L  _. @" P( m, R/ e$ }- }% _ */
; {7 c0 q* Y* f5 a; {, y  }   
4 A/ n; a) l! r+ S5 m( c8 ` return 0;4 u- {1 \/ J+ q6 G

* l* Y- O5 W  o: C) u" D}; N$ {7 a( s$ z

! ^1 G0 ?# J7 l  c多谢各位指教,谢谢! 急
/ a" y4 O7 w$ P: C. X  E. g' A/ g2 i4 ]8 x4 Q# `+ z& F
/ s6 L1 r+ w0 Y" h8 m. v" l6 h

# U6 e, e, T! e" Q2 T- N/ ?* d" r
' W/ Y( G& `; x, }) S4 j- ?- l# `- h: u1 \6 A) g, u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 21:40 , Processed in 0.043688 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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