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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) P5 V4 \% q, t" Z9 M" |- u/ S/*3 U: \: j6 I( n: `% m* a8 a
* Copyright (C) 2009 Texas Instruments Inc
+ ~' Q, h5 v! p9 J8 y5 i. e* I *, o& \) Z9 Q" y9 R5 p8 B; K
* This program is free software; you can redistribute it and/or modify9 e1 U1 F( W4 h1 y5 j8 u4 I, U5 G- S
* it under the terms of the GNU General Public License as published by2 T/ ?7 T  A2 w! I
* the Free Software Foundation; either version 2 of the License, or
' J2 H6 Q+ E, l$ ] * (at your option)any later version.: x. p5 s' x. h' s! I
*
- Y1 m# U3 i7 \& s * This program is distributed in the hope that it will be useful,
! c' r/ ?" I/ }( T * but WITHOUT ANY WARRANTY; without even the implied warranty of
7 x( _. A8 ^2 v. h6 _ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3 n; ~+ F, N! \& F * GNU General Public License for more details.6 ?+ h) x* K4 c! S' ]
*  H1 K5 ~# q) }2 l4 g& r: f
* You should have received a copy of the GNU General Public License
5 D. [) c% P, L: |4 }" q  L2 U * along with this program; if not, write to the Free Software
6 f$ d3 i9 {# C  x * Foundati$ w- z% c+ g4 T$ m, w. ^/ N+ H. u
*/8 N4 E8 j& l7 U7 w6 r! x  T$ V$ G
#include <linux/module.h>- L& Q  @* y* R- ~8 I8 B
#include <linux/init.h>0 {& H$ M& F4 F
#include <linux/errno.h>6 @! b1 V7 k& ]/ X
#include <linux/types.h>
9 M3 Y# ]3 L+ q4 I& X#include <linux/interrupt.h>
. h% {" x- Z& b* ^" K7 `! u#include <linux/io.h>: j) A; V7 ]$ D2 [/ K) I7 P
#include <linux/sysctl.h>
- S6 L; l/ a) k#include <linux/mm.h>
, [5 u2 j9 q% Y; {6 G# i$ h6 p#include <linux/delay.h>  z* K; D0 Z4 l5 E2 c' @% ^  t! L
#include<linux/kernel.h>1 P4 u$ X; j6 |2 p7 T1 j9 Q
#include<linux/fs.h># ~, ?5 C( X) m3 \8 Y$ w" R5 x
#include<linux/ioctl.h>
1 l* c& a/ w- n; A0 C* x! w#include<linux/cdev.h>
9 T/ S6 `1 t" `$ ~3 u! s#include<linux/kdev_t.h>
  a: H* Q* [$ A#include<linux/gpio.h>- [# a) I( V& z. k; T
#include <mach/hardware.h>, `, M: j2 K4 U" \  U( P' S. K# b
#include <mach/irqs.h># G+ g5 E2 t) q. r  k& p
, |& u# u$ N' P( o) i4 q
#include <asm/mach-types.h>$ \& g" m4 K% {: u% [- z) I0 S) G
#include <asm/mach/arch.h>
. p1 ]: e; d8 |4 t- Q" r3 s. k& {#include <mach/da8xx.h>0 i* t  `* W6 j( u: u% t6 D* H
#define  SYSCFG_BASE   0x01c14000
8 N/ _) v# i0 v#define  PINMUX1_OFFSET   0x124 , |* B4 E% ^! ?1 Q; @3 E
#define  PINMUX18_OFFSET  0x168 8 g1 X, @* _2 }! a8 D$ v
#define  PINMUX19_OFFSET  0x16c, R/ y) s3 u7 P
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR* w; K, b' B6 ^  G
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR' e# I% ?( {. t# {4 V  M
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR5 {4 K7 N( n) I* I. d
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
' k2 w% @( A4 k#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
0 e9 A0 u* T, t# E0 E% u                           
6 ^6 O& J7 V: Z6 q, A#define DXR_ADDR      0x01D11004  //MCBSP1_DXR! S: i0 V& O' u( M
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR3 D0 v+ i  }7 d% _
//PSC
: W1 u2 j, X# i9 @- C- l6 l1 D#define  PTCMD_ADDR   0x01E27120  ) _% c6 v$ O# w  A
#define  MDCTL15_ADDR 0x01E27A3C
0 ~6 w- l/ I5 t0 e. _#define  PDCTL1_ADDR  0x01E27304
) ^5 g8 f1 N! M  y& e8 X//GPIO8 direction
3 _, P- u, T5 o$ b- Y#define GPIO8_DIRECT  0x01E260B0
; e/ i+ j; ~* Q+ ?#define GPIO8_OUT     0x01E260B4: J, X# V9 l; D4 I) X
#define GPIO8_IN     0x01E260C05 @+ D) l; X  {  Y
. h. Q) X* S5 o
//#define MCBSP1_RINT    99              
! _+ D2 x0 L1 Q* i( L- O//#define MCBSP1_XINT    100  
8 ]$ Y4 X) M8 p! A2 Z. Nstatic int MCBSP_MAJOR=239;
- n8 f( k( E& |static int MCBSP_MINOR=0;
  {' O* J! N3 u# _9 p# P+ tstatic int count =1;8 V0 z. t3 R( X) H# o
  h+ @' z" N' Y
#define MCBSP_NAME  "MCBSP-device"
0 b0 F9 @$ D- ^  F
* T6 a7 ?2 l0 X, Zstatic struct cdev *mcbsp_cdev;
9 b! }, U5 Q; Z/ o0 d3 Vstatic struct class *mcbsp_class;
' s. z1 {8 [% q/ H; J/ ?static dev_t mcbsp_dev;. M" B* ^  {8 L) y( [) b1 `
unsigned int DRR_data;- e9 U. w: e! r
unsigned int DXR_data;2 e( q0 v( E  ]; y6 d4 C4 G4 N6 u
static int mcbsp_open(struct inode *inode,struct file *file), [1 [9 Q4 V9 Z: @' v  ?) Z
{7 `! @* m) m1 g9 J
   : ~3 J/ ?, s0 \2 Z7 W8 z: d! M! m  }+ I
   //interrupt enable,initialized8 W9 h  L0 p/ B# m, S
   unsigned int temp;) g- y+ e9 @( I! e
   //SLEEP_EN(GPIO8[10])---0
* y$ b0 B4 E) n, I   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ K( H* |0 [* Z: N, ?2 i
   temp=temp&(~0x00000400);- _1 B1 \% d6 b7 |# j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ S% R* F' ?1 @9 {$ E; `  //RESETn(GPIO8[8])----0----1
& l* g  I7 }! ~, }# f" ?& r   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. I; `7 q5 N" i: s, k) o- T! p8 p   temp=temp&(~0x00000100);% m3 m- m& A; L( K, O; H" ^( U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 y0 C4 i3 ]( H$ V! j/ K   udelay(100);2 u3 U: Q- R2 R$ S
   temp=temp| 0x00000100;
- D; ^) U" k7 F. |   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---13 ^2 M% Q: T3 o! T  m7 Y  o" u
   udelay(100);
* h; H. |- O1 @4 n   printk("open success!\n");
3 [& F9 R1 _; U8 y   return 0;
- c% q* p, B$ H0 Q; W}: ^/ \2 E" N0 I6 C* C: q+ O

4 x1 Z+ z; E! I9 {. D( v9 Ostatic int mcbsp_release(struct inode *inode,struct file *file)
5 x$ b+ W7 V( ?4 d3 \9 z{
+ y- t* h: \' K* X, ~3 {* L   printk("release success!\n");
4 i+ {2 Q  ]. r8 T   return 0;( I! Z3 @+ ?$ g6 X% M4 J* G& q& ], Y
}
' Y/ {2 ]9 C7 Z, R  {+ ^' ?' h# q* ]
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)& T' R& U$ p. T; e* b
{
2 L  g* d# a1 b# ]9 g9 m    copy_from_user(&DXR_data,buf,len);) n% y# G- [+ Q% X
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
* u& e% Q: {$ p1 ?# ~8 L' K1 F) K    return 0;
& k" u! y9 |+ t1 w5 Z5 Z3 B
% Z! U, a3 D4 `* b}0 m. c2 M' V$ z& a% m1 j2 P

; b5 ?( L& Y# Q7 W+ C7 gstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' t: F: c$ w" T4 D. Y/ l5 K9 ?{
; I1 Y* ~2 t/ T1 v! r   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
7 {9 |+ e1 D; S$ R* e   copy_to_user(buf,&DRR_data,len); ( L/ H7 o! B9 i
   return 0;8 Q6 b( a$ n; P7 g/ O( {1 E1 K+ A
}7 F' X" G) j) O+ \& u7 [4 r

8 C3 l, Q0 T2 |& z' w/ v/ q
4 ^/ H; L- D  q' _) Astatic struct  file_operations mcbsp_fops=, X0 o. X$ J$ t
{( V4 e3 p: i8 a% A. u
   .owner=THIS_MODULE,
! L2 K3 w% ?: d9 t6 C   .open=mcbsp_open,8 |% r% k) F. G  ], S" S' G: W
   .release=mcbsp_release,6 c. H4 y- i- {' [" g( r; a6 A
   .write=mcbsp_write,& s; z. f2 {2 O1 B9 ^
   .read=mcbsp_read,
: A: w! X. l! R7 Y5 _% x- N  c};
+ _. v5 e1 Q6 c3 ~static int __init MCBSP_init(void)# V# m( x" S$ k+ Y
{
+ @0 _9 l& K/ t- x" j   int ret;8 e& J) T3 \+ `; ]) ~8 y
   unsigned  int   PINMUX1_REG_old;* h/ t, S9 I7 u7 o4 r# G
   unsigned  int   PINMUX18_REG_old;3 r- I* T7 J; N( m# `' x
   unsigned  int   PINMUX19_REG_old;& l$ s; g% e4 J) {
   unsigned  int   temp;  
* \  \. E4 Z$ ?   if(MCBSP_MAJOR)5 @6 T3 _5 Z* b7 \% |: n
   {
6 E% h9 j1 D- c  c8 |      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);; k1 G  M' ?4 N1 k" `
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
9 e/ A8 L7 q* ]0 c   }
3 ]+ X- I8 {' s" \6 \   else
& H' v# E8 l% @& b, }4 ]   {5 ?8 A: f2 F) W* j
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);. ^4 {7 c1 e& C
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
1 Y0 q  l( e! W3 s   }! q( u# ?5 g) C5 k1 [7 p
   7 Z5 C9 [, _" _: w: l' A# ]* U- }
   if(ret<0)
( [2 V" A) x/ D! [* u. @   {( s- v$ Y" _. j2 M  _
      printk(KERN_ERR "register chrdev fail!");
2 i. l) S9 _1 A9 B  I      return -1;
3 x# H. W, j# V7 o7 Y   }+ g3 p: [& I' M9 V6 Q6 ]. ?
   ) K3 ?+ X$ Y; |, a& g0 B
   mcbsp_cdev=cdev_alloc();/ @2 _/ n  k' M# d4 ~$ f. p& T
   * K5 x/ y- }5 ~( a4 F4 Y& |
   if(mcbsp_cdev!=NULL)( z( g) ]( u0 a: {' k3 p- E" J, t' v/ n
   {9 ?" g. |, X% I+ |
      cdev_init(mcbsp_cdev,&mcbsp_fops);2 V! M; d9 B6 w- b5 I! c
      mcbsp_cdev->ops=&mcbsp_fops;
3 Q$ a2 A7 _, O* Y( K      mcbsp_cdev->owner=THIS_MODULE;" p; n, B( T/ ~8 C' ^
      
6 z! T' t6 E, s0 [2 d9 I8 v      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))/ s2 ^8 P/ b4 L$ C  u6 V+ |) S) v
          printk(KERN_ERR "register cdev fail!");
. h1 `  F. a: ]# v      else7 W  w; f5 h% h, A6 d
          printk(KERN_ERR "register success!\n");7 c0 I$ v& }0 o/ `1 O, w
   }. {. `! E/ J& S
   else
# H4 v( ~4 }" @( T# K5 Y   {
+ n2 b, k9 n; ^" d( M1 K: v8 {      printk(KERN_ERR "register cdev err!");
' @5 }6 C8 v* J! c# A% A      return -1;. ^+ h% l. G, B$ t( d0 g
   }
0 {1 x7 \+ Q2 [+ ]3 ]; F2 m   7 w$ D% G% D) E- d. S
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 L0 j) y2 K8 u+ d& H8 S' f3 U   if(IS_ERR(mcbsp_class)): b. V) T7 \9 o1 d
   {
5 m% m+ A8 T7 c% R      printk(KERN_ERR "register class err!");
# F" R! @7 ~1 r! V  u1 s   return -1;
0 ^- w+ j: f( U/ K7 I9 {   }1 {$ I1 p% `. m9 F- z* R
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, f3 q# m) m8 Q+ d/ k/ a
- ?  o; Q# z+ t% N# g: r   //PSC
& K6 p, c- f7 _0 e   //add Enable MCBSP
0 R8 G% S/ K2 c* h4 x   //test
( p, U1 l/ X) o% x$ U" N* r   temp = 0x80000003;
0 n0 S# R4 _4 ~; y, f- A  y9 C   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 v0 g' V% X. g2 D! ]   temp = 0x00000003;
2 {: f* ~4 W& J   writel(temp, IO_ADDRESS(PTCMD_ADDR));% r" S: C( Z2 v. x

- r1 t  D/ Y$ |* E6 R# z8 a   temp = 0x001FF201;! r& y+ u. z) E5 A# L
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
; |- J, r( I. b' n* l: \   
$ s$ R8 U: l$ ~8 B" X) }   //PINMUX  ' \8 o  h' X/ n- {: N4 R7 O2 C
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,5 j% _; T# @/ s( ^. E& P
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
. K3 J3 {& T* i5 A7 k' S2 u- [   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
1 d( |' O; j7 m3 S" C7 O5 A9 ~   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" c; m+ C3 b1 i6 K5 r5 h   
  N+ p$ u) |4 @) l2 [4 j   //SLEEP_EN,EPR,L138_SHK1,L138_RC) P& p4 _% d/ o; |; f$ h2 t
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  4 |( K$ R8 _9 ~" a& x+ N
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
# j+ T+ o. _& ]6 T   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
( n$ |0 o8 |( O. z- V
$ U9 t2 X9 U/ L5 k6 C. |* m   //RESETn,L138_SHK2
, f9 |. z3 ^2 S   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  . @) Q) z! B& T- v) Y
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
6 a+ C% o6 j! x7 `3 [   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 @! B  z- K/ F: O" K, B

# ^; x8 C+ B, ?
+ G3 u& n4 {" _( ^  //SPCR Register0 T( t& f" G7 x/ E. T0 s2 B+ M
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
% s5 a9 ~. I3 X' V( f8 Y: E  temp = 0x03000000;//(DLB=0)8 X0 C5 g6 r" W: [* U- a3 L
// temp = 0x03008000;//(DLB=1)# L8 U/ ?$ z- h
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset9 \$ y3 ^4 l. c' i0 `
  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ n1 {& ]9 B$ v5 A2 A$ Q2 R" M9 |  printk("temp=%x\n",temp);. w# `4 [" I; S6 Z2 t# a

7 J- Q5 e* E. D! S   //PCR Register
# f, T, X  R! D" f! h3 m1 m   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* F3 y1 f5 G3 {  // temp = 0x00000F0F;. v# W0 G, e3 Z
  temp = 0x00000B0F;  U) ~1 o, {* o2 [
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
  Z, R- I1 d4 L/ J8 ?+ \4 L( i  temp = readl(IO_ADDRESS(PCR_ADDR));
& r; q1 X2 m) [6 s; ^7 @4 v/ \  printk("temp=%x\n",temp);  ; E4 H2 k; d5 f4 u
   //SRGR Register; h0 H* Y1 \: L; t- m% r
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==116 }) F1 c, L3 i. j- @
//temp = 0x301F000B;  w3 M! N7 }, O& d  s" ^) z
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized * M+ N7 Y4 `; t" z3 n& @
  temp = readl(IO_ADDRESS(SRGR_ADDR));2 N2 A4 f- M' U' Y0 s
  printk("temp=%x\n",temp);% x" [% X. y0 o7 _5 L4 ~7 {
   //RCR& C6 o! m4 Y( N4 w9 u' Z: {
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
5 M$ v9 X! |) `, [. l& U   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0' S" |) ?4 {+ d/ I6 K  T& i9 V0 Q
   temp = 0x00440040;! x- L7 g# v, ~
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   - b: h. K1 p' v# C3 k
   temp = readl(IO_ADDRESS(RCR_ADDR));
$ C/ a6 O5 _5 g9 I# l# V   printk("temp=%x\n",temp);
2 W5 r* ]$ F; K  {( S& m% Z   //XCR
( Q( f/ g8 |! [1 R/ ^4 o9 y   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 i7 b0 @3 N" \# k" \8 V, [* t. g1 {
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0$ f) x1 X7 V3 _) c9 o: X6 Z/ K
   temp = 0x00440040;
( q0 Z# y! T! U0 T1 [  T0 [& \   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   , s% ~6 R* k5 l& |% D
   temp = readl(IO_ADDRESS(XCR_ADDR));
0 c2 @# X8 d% N9 M; J   printk("temp=%x\n",temp);
/ H9 I! a, Z  b/ G  udelay(100);
% o9 E, t, s  \4 |: m  //SPCR Register9 `9 I5 l6 L% f# {! v
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-16 s$ L. Z6 x* m& H4 G, M" [
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
$ \' V$ s' S# s. g! ]( B! T  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
" B- ^$ _1 ~7 K- T  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 `1 T! Q" V7 r  G7 W( ^* f; I  printk("temp=%x\n",temp);
* h+ M$ t# O% F/ o/ U% C  udelay(100);
( O" z+ \9 f+ X# R6 t6 Q: a+ _* v# }% F7 K; W& s
  //set GPIO direction
1 S, [0 z$ O$ I   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ F' g, M- t: g1 K+ j+ W
   temp = temp | 0x00000100;//EPR----input
3 P; {$ w9 S  ^( _  B   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ V$ j* U; u2 v7 e: Z+ `7 E; y   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ) a5 x7 V! \3 E
# F2 {% \+ L3 [
   return 0;
  k- J7 L/ e- V% d& p5 }}0 d. [6 M8 B7 T6 S- u* z4 Y8 \
static void __exit MCBSP_exit(void)8 V; T! X- R- Z
{
6 v! f' Z9 J& @% X. T2 P   printk("mcbsp chrdev exit!\n");! m: s4 o# O3 t1 I* m( a
   cdev_del(mcbsp_cdev);  S% O( R5 S4 J, H& w7 X6 ^
   unregister_chrdev_region(mcbsp_dev,count);
) W( B- ^2 h+ P8 K   device_destroy(mcbsp_class,mcbsp_dev);& H: u: ]4 C: j4 {8 V
   class_destroy(mcbsp_class);* r! G' c3 I; Z
}2 D! @& _: S' V$ z* O" J
module_init(MCBSP_init);7 O" M9 f7 f4 V! G1 @
module_exit(MCBSP_exit);
; A% \; y" d5 o$ m' u7 H" s! z2 H6 P' l1 c6 c! w
MODULE_LICENSE("GPL");
3 s2 V& U' }  G* z' E+ V/ f0 p5 k: d) G, [
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 J! Y" X9 O: Y& t我的应用层的测试程序如下8 u, r, E: {1 {
#include <stdio.h>
% O, O, j; ?6 j+ {5 Y/ k#include <string.h>+ ]% V; U: t- A; J* U7 |
#include <fcntl.h>
2 h; }) n' m8 p3 f#include <unistd.h>% j' \/ s3 N! H3 a
#include <signal.h>
0 K$ o4 b$ F; f- |4 ?6 d  `#include <pthread.h>       //线程, q6 b, M5 H! u5 v4 K
#include <stdlib.h>, `: r. i% Z' }, ~4 G+ l
#include <pcap.h>          //捕获网口数据  C7 N1 p4 A9 ]5 Q" U  K
#include <semaphore.h>     //信号
5 [% p' I& {1 P7 U& X#include <sys/types.h>     //消息对列
! b* J0 W5 \9 n$ A2 G, D/ Z% Q, A#include <sys/ipc.h>       //消息队列" U5 l% N' X+ H. v
#include <sys/msg.h>       //消息队列; J2 p* c) S  }/ m3 o* m
#include <sys/select.h>! d. }1 d1 b- J2 O2 R& z$ j. c
#include <sys/syscall.h>
$ Y# j) |3 K9 S0 C#include <sys/stat.h>) b4 \1 B% ?  p1 d9 h
#include <sys/mman.h>
# c# O9 M& W; Q. g#define msleep(x) usleep(1000*x)
, X0 K9 v% ]; s) [8 }3 f# h
! F/ F( l# R- Z5 vint main()1 r8 ?, [' d, S) M3 r4 a/ W. L/ }. d
{ 4 k9 b! B9 y/ c; E" q* s3 i
    //MCBSP,ARM与AMBE2000交互设备# [, K( x  }4 @$ t( s4 Z) F
int fd;/ C: y# c: M# u0 W: v/ G# n6 q
unsigned short data_write = 0x5555;
* \5 t1 t6 v4 V' D( w unsigned short data_read = 0x00;
/ _) z  X8 H2 ~" A; d8 N9 ]  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);- o8 D4 o- t3 B* U& S- W
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);% q6 N' Y( Q3 w: |( m, Y
   
6 a7 f' b7 z+ @* @7 g- J! v  if(fd < 0)
4 b$ @. g/ j8 w) ]$ Q& X: g  {
" p  t* B4 k5 x2 o1 P/ q5 V     perror("open failed\n");
. l0 V* ]7 y7 Y4 B* u( e' a     return -1;% M# J# e+ {$ j/ v' r5 l* t
  }
* s4 J. @) h/ z  2 t, P3 X% A0 O2 z+ k2 l* }# }
  while(1)
# i  ?! H. r; t  {
2 t" o" f% s9 w+ @( W5 I   
- j/ l3 I8 `4 G; H$ @. R   //AMBE2000每次读写是24个字为一帧0 O, [/ o, j1 }0 A+ P0 O% P
   //写数据时将数据在底层存储起来,等到中断的时候再发送/ X# r0 k# z( A7 z+ X% @
   //AMBE2000输入数据是以0x13EC开头的
. T4 k; S( a( K% Q' b! ]) T   write(fd,&data_write,sizeof(unsigned short));
) ]( F7 g3 X% N. [   
( D$ \+ ?+ K. E3 {+ L; B6 z. _   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
* q. H4 c! ~, X% V, Y& Z9 ~   read(fd,&data_read,sizeof(unsigned short));
. u  l( p/ \& G+ S0 b/ k7 c   , x9 H% p; G7 F% ^: \7 f
   if(data_read == 0x13Ec)
) f1 h  V0 B3 I   {
( G$ Q' D) U" X/ P+ C     m, D' o9 b; m" N) Y! C
    printf("data_read = %x\n",data_read);" e! J$ B3 J$ R; S  R
   }
, m9 t; h& U. [, J5 a   ! d/ _% d- x) G& W) q  b% N: ~- i/ W8 u6 A
   msleep(10);
( E2 }! \6 ~8 o* F0 \  
; ^; o$ B1 ], |' W5 r6 E8 |  /*
3 r% e' j1 D3 ?   ioctl(fd,1);   
0 z1 }2 o( W2 g! ? sleep(1);3 m. a: o# N* x4 u
ioctl(fd,0);
3 P! Q. [: _5 T4 [& l; {. q sleep(1);# Y' N4 q% v4 F) y  ~; \
*/
6 v4 m( _+ H- ?! f  }   
' u( u4 N: D0 z1 E, f, _ return 0;
, n9 g; i' h% X0 D% D  M0 k3 k
9 I/ v& z6 J2 `, y4 h}
' |3 H7 v: H0 V# W  S( r
) S2 }- |) I6 X# e# R5 p多谢各位指教,谢谢! 急- z& U& ?0 I* p$ J
6 |9 \% M% |& m9 O# l
4 ]+ o7 Y9 b  p* m6 P: x
* j; Q4 G( h: u

/ H; B1 q7 ]/ x- n) V
6 k3 Z6 q) I$ O9 d/ ^, b# O( B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-31 02:58 , Processed in 0.050142 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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