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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
% E- g2 q2 I1 R$ y, [$ y$ ?' e/*, A3 u2 O& ?, ?3 \7 a
* Copyright (C) 2009 Texas Instruments Inc. L# s% R1 w! J& l
*
* y9 D2 F2 p- |. d * This program is free software; you can redistribute it and/or modify
9 N" w& V1 }9 x: X; t, {! z! ` * it under the terms of the GNU General Public License as published by$ z) ?6 M  I* M3 G6 t5 W0 `
* the Free Software Foundation; either version 2 of the License, or( r6 }6 y: e5 O1 N& }9 {: `
* (at your option)any later version.
! A2 E) u4 I% W# n8 G+ q *
& e' E& k3 l9 ^5 _/ d: ?9 E8 a: N * This program is distributed in the hope that it will be useful,
. v, V8 [# a2 G4 Z# |7 P- { * but WITHOUT ANY WARRANTY; without even the implied warranty of+ L* G5 j1 c5 H. e; J: Z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! ^3 t  ~, K8 h+ S  h5 B$ h' i * GNU General Public License for more details.$ \9 v$ |6 q2 P/ d( Q
*
7 c  U, P- x9 f7 v2 e5 c * You should have received a copy of the GNU General Public License5 b" F$ I4 d0 G+ U
* along with this program; if not, write to the Free Software9 B# G- f% C: @
* Foundati0 y. D% c- L& a+ d# O# [9 D3 n, l- q3 `
*/
1 Y6 m: u1 }* C% N#include <linux/module.h>
8 O% f0 v0 d1 O; D, O  G#include <linux/init.h>
* M0 Y  a/ S, E+ H% e% X4 X/ N6 i#include <linux/errno.h>: ^7 h/ e. z: c3 y$ j" K8 ^
#include <linux/types.h>
6 C3 B" `1 X/ {! }; ]1 F5 a+ D, q#include <linux/interrupt.h>+ G5 r7 m; o+ c9 q
#include <linux/io.h>+ X& F( B$ q7 C2 \. `& ~1 n2 j
#include <linux/sysctl.h>
7 E% r2 g7 t6 |" k3 }#include <linux/mm.h>
4 |0 C5 Q& Q4 `#include <linux/delay.h>
- B4 f+ F: S( X0 b0 Y7 d#include<linux/kernel.h>9 b4 V4 `3 D7 l6 x' W( ~' s4 h
#include<linux/fs.h>
; `. Q9 z' E5 K#include<linux/ioctl.h>; {/ m7 m9 ?" W# Z
#include<linux/cdev.h>0 E6 T! T$ B. z2 H' \: ^$ ~  c
#include<linux/kdev_t.h>9 B; J6 i2 b7 r
#include<linux/gpio.h>+ R' i$ n" Q; E/ a+ C# X6 k
#include <mach/hardware.h>
: ^- Y' ?: R9 t#include <mach/irqs.h>
& F9 u9 s7 y/ D& ]' C- ~( X6 y& l  `- m! E
#include <asm/mach-types.h>5 d5 r9 ?% }! S/ J5 Y
#include <asm/mach/arch.h>
2 S! g1 x1 n8 a1 n#include <mach/da8xx.h>
. J: D5 m0 @- ^! j#define  SYSCFG_BASE   0x01c14000- R) p1 Z/ r0 j+ G& x( b0 O
#define  PINMUX1_OFFSET   0x124 " `& K0 Y1 F4 z% h3 E' I+ \
#define  PINMUX18_OFFSET  0x168
2 q, D$ }. M, Z8 o" i7 P, m3 U#define  PINMUX19_OFFSET  0x16c
! m6 m3 C4 Q% }* h#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR7 O% p* c" K* g$ l+ n
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR' |- B# T5 Y$ W2 s0 b
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
( F# j% {1 R, y6 I% \. P1 X8 ?#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR0 ^3 T" U* `7 K1 [* F. F8 g
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
, X# L$ O/ E+ d1 r% Z7 i. o5 Z                            4 u* e* H+ j5 K3 v: _1 `) M% h
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
3 c' g4 J  e  H9 r, H#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
# k" o. X, g: Z# \5 N! o/ @# r//PSC4 W) r1 p: }# F) Y
#define  PTCMD_ADDR   0x01E27120  : i/ ], l9 F; I
#define  MDCTL15_ADDR 0x01E27A3C
( ^* A9 H, K% R' |2 A' V#define  PDCTL1_ADDR  0x01E27304
0 [" C) P4 h3 `! B//GPIO8 direction* f! p; r# i8 D5 `; _
#define GPIO8_DIRECT  0x01E260B0
( g# N! I- N; _" m! N3 W#define GPIO8_OUT     0x01E260B42 ?9 |- M3 S& m
#define GPIO8_IN     0x01E260C0
4 T3 K8 l* n5 h
% {0 T& l# y' A- ^2 {/ j//#define MCBSP1_RINT    99              . O4 P- D1 ?  v, w( M
//#define MCBSP1_XINT    100  # h$ ~3 q" G+ I5 w8 Y
static int MCBSP_MAJOR=239;
  V9 j, ?- ~* v) d% ~" |% qstatic int MCBSP_MINOR=0;1 }8 s: p0 [4 ]5 J+ R, \& V0 P2 n0 @& r
static int count =1;* [8 A$ p& p1 {+ n

. Q6 X; |) o8 H: J8 H  _#define MCBSP_NAME  "MCBSP-device"
8 a/ j* n" M; n  z( @5 v# X; U2 [. L. r
static struct cdev *mcbsp_cdev;
. Q4 F- t- A* @" W" bstatic struct class *mcbsp_class;
' r% H0 H5 J. J1 Astatic dev_t mcbsp_dev;
4 y& t7 f4 Q: m4 Lunsigned int DRR_data;) F* n. K# U+ g7 m
unsigned int DXR_data;
& M6 d( |; l( {' F. Cstatic int mcbsp_open(struct inode *inode,struct file *file)
$ M& A% w- I# _4 B2 [; r% L{# ?- W8 s1 {9 K+ ^0 E2 \
   5 a1 M% p/ N( }: ^
   //interrupt enable,initialized1 U4 t( i% g8 t' |8 a
   unsigned int temp;
! h8 L) G; m/ e) Q; E/ x   //SLEEP_EN(GPIO8[10])---0
. e0 D: y8 ?; h8 f  j/ J   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- c: Z, S. B) L" |8 q: K7 ?' H   temp=temp&(~0x00000400);% q: r  n: _2 o1 A, `& j7 I
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ I1 |0 E+ |  |
  //RESETn(GPIO8[8])----0----1
1 a% T3 V  x7 i   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 j* L! R3 k: s' ~; j; h   temp=temp&(~0x00000100);( T6 H9 R1 J2 H8 k7 ^6 q- C
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 I0 \) Y7 N# v8 m   udelay(100);
4 |4 S3 R- H6 P+ s   temp=temp| 0x00000100;4 O' p6 D+ ?, T* U( r; j; T" m
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
. ^* Z* X4 [/ i5 B   udelay(100);; U( Y! z* `) q, F4 ~: g* `) V
   printk("open success!\n");
  X" k! B$ B2 U   return 0;, T6 o# s( }) y# Q4 z5 E
}
" n0 f- q; P9 b0 V8 Z+ V  X
. w; h5 o( H1 Z1 T( Fstatic int mcbsp_release(struct inode *inode,struct file *file)
* [( x* i. x; [, d{
5 _6 ^. O; |+ U. F, Q( S- _# `   printk("release success!\n");
+ \8 u3 ^* W9 h1 S! T3 r   return 0;, z5 y9 l. Y: s  [6 f
}; U& D; `* R1 o2 f
" R  W* j5 k% T8 a- I
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)9 ?8 O  C9 s0 ?6 I0 V: y1 C5 g& B
{
0 P2 ]# K& w# z3 }    copy_from_user(&DXR_data,buf,len);
- z  y9 u0 p$ g6 L1 J  c    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       + l3 y& `3 j0 |( o
    return 0;
! _- @( W( M( s$ ` " J4 h, E$ j' o7 G2 B: u- K% B, }" U
}0 j+ m' _2 v  u9 ?/ w" r
: D4 M5 }7 [3 e) @6 B. [* @
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 Z+ O' M9 \; M6 B) q& g$ {{ * p$ H& p$ K- L' c9 F
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; A0 Z% O5 L  d3 u+ L$ W: L   copy_to_user(buf,&DRR_data,len);   n$ X: t( ^0 u3 h$ D
   return 0;4 h! X4 F( d9 G
}
, ?* d$ s9 T; `* J- q' M' R( V8 B3 }7 }# y% i% U/ @0 ~
( `' D- p, H" h7 a; F+ K
static struct  file_operations mcbsp_fops=
; D/ \9 k& t+ i4 a* p{
+ k( ]# k* Q2 f% [* c   .owner=THIS_MODULE,1 S8 A; H# J! k! a$ c- I% @
   .open=mcbsp_open,
% R# B, M, B# ]: F# T. |  C   .release=mcbsp_release,1 Y' |# M7 I0 ?: f9 v
   .write=mcbsp_write,! L: s" e. g7 V9 v6 q7 A- T
   .read=mcbsp_read,; i3 }% o# V- v! `- t: u! Z
};2 x# Q2 V& B9 g5 p  W" N% U
static int __init MCBSP_init(void)
3 U- P2 `; J, P" ~{
1 d0 V) P- |# i, h1 N   int ret;
1 g. d& a6 ]. Q# }  [" x   unsigned  int   PINMUX1_REG_old;
- e! M# b9 ?& Z! O6 h5 ?+ n   unsigned  int   PINMUX18_REG_old;
6 }7 X: s5 D! s8 s" R6 q: Y0 y   unsigned  int   PINMUX19_REG_old;% K. I4 R8 I$ p. u
   unsigned  int   temp;  2 a! r- A% |3 b
   if(MCBSP_MAJOR); j, W7 S1 A+ O: ~/ g& U
   {
& N6 v) B; N. H) w1 [2 }      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);5 V# D6 {4 X% ^4 l' x% r, A/ u
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);' D" `9 k0 O! L, e7 |
   }" {* ]; h; F- L
   else- Y5 T  G( @1 _9 q7 Y6 _& I' i
   {, k$ R' M1 U/ f2 w
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! i, a) |9 k7 K  C2 S      MCBSP_MAJOR=MAJOR(mcbsp_dev);" @2 T9 q+ [* ]% n+ g9 F
   }
1 b+ z6 ]+ v& `1 J4 p8 T$ h, I   
. w6 _! V% x4 P. s1 D5 l1 z" I   if(ret<0)
% u+ c, z8 |% M5 y7 o0 z   {
+ g1 U( [$ \  \! O3 |# z) E( O      printk(KERN_ERR "register chrdev fail!");0 I0 y, f+ b- G, b
      return -1;& R* B" Y( m4 u  ~/ m% \, d
   }# H- }1 M/ _$ k# y& A- H' j4 _
   
  z" g7 \+ C( H* e4 D$ J   mcbsp_cdev=cdev_alloc();" z% A) z+ |1 @/ F0 K! T$ ~9 H
   
+ W* Z2 E. Q- ?& ]   if(mcbsp_cdev!=NULL)
9 R1 _, s0 `( y' g   {2 S, W4 `+ b1 b4 }8 K) _# R
      cdev_init(mcbsp_cdev,&mcbsp_fops);
& X' {# l0 W6 m4 A      mcbsp_cdev->ops=&mcbsp_fops;
6 b8 i# Q- G- f  |! H  T! p# {% S      mcbsp_cdev->owner=THIS_MODULE;) }% _9 V; |, ?/ g
      
" _- V& y: ]  l; S4 [1 P2 X& r, h  A8 D      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! u( E# m1 g8 B- K          printk(KERN_ERR "register cdev fail!");
$ p& y) j  B1 C# b9 U# V( w1 l# y      else+ g% a1 t1 s6 c
          printk(KERN_ERR "register success!\n");
2 s9 D. |3 ?* S$ e1 ^/ |5 x; u   }
" Y# @% U) j. I0 W! y2 h   else& f: W" j) _9 i6 {" H
   {
( |6 M* V5 ]2 h9 z      printk(KERN_ERR "register cdev err!");
! p7 @1 d: x2 f2 r5 w' g4 t. \      return -1;
4 d2 V8 |! G; q+ C: E! W" p. m   }
0 F1 P0 r. k* g& {/ E   
; X  W% U6 }0 u4 K% D  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
, a2 K& h1 W, \6 c+ e   if(IS_ERR(mcbsp_class))" I. D5 c3 n9 ]0 ?
   {* s" X; u& [  Z1 E+ h% |3 R
      printk(KERN_ERR "register class err!");
  Y% z0 T. a& ?8 L# @8 P( X) {8 l   return -1;
  G) T1 u$ Q7 K, X   }
' f: y8 v; @" s+ X   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);; r& s- g# t, X; Y$ r( C9 u! f

# O! \0 f! [0 Q9 |# r) j   //PSC2 }0 `  B7 q- a
   //add Enable MCBSP+ p# b  s, L/ X( w- H. ^* A/ N2 i
   //test5 }" @# M9 O8 f  k8 N" Y$ _
   temp = 0x80000003;
. d- [7 ]6 w/ N1 M   writel(temp, IO_ADDRESS(MDCTL15_ADDR));' C1 Z" W/ J# M( @
   temp = 0x00000003;
2 t+ `/ }$ m0 g2 k   writel(temp, IO_ADDRESS(PTCMD_ADDR));; S  A3 |! m8 t- d" @

0 @; R" e/ f3 `; K! a7 ?   temp = 0x001FF201;
! ^* ^4 G  _4 ]( ^; y! S4 y   writel(temp, IO_ADDRESS(PDCTL1_ADDR));  ^* Y) |4 F) x0 B5 Z  A
   
5 J+ w% U, i9 \$ _! c7 W   //PINMUX  7 L8 v* Z$ A+ y; h
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* b1 p: M* g& Y2 w
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
; N. Y2 m6 @: L8 H7 [% H; \, R' U3 ?   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   . k1 L/ [/ Q  Z, p! S: J
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; @: Z. `6 k' C6 X& I4 s   
! x$ y! `. ^. I. ~& W1 s0 b1 ?   //SLEEP_EN,EPR,L138_SHK1,L138_RC7 y9 U2 `' S( @1 w+ ]* h
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  - R  g2 R) {* d* W% v
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ' m9 G8 P( `  y: L
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);6 D  y" `9 Y8 B) `' f" Y4 D
6 q' q  T- Z6 R6 D$ M0 k5 _) z* g
   //RESETn,L138_SHK2
6 S* B: I& _* @4 Z+ ~& s   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ; K, s, D& j1 j9 e  b
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
1 K& ~7 b! B6 _' W   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 d% E; r8 S2 [* |. W
7 f1 i9 C  {" o. U& G( P
- F4 m( T8 }/ h) u, m8 T  D  //SPCR Register
. v5 Y7 n! _4 M& D4 X( S7 B/ P  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
' ]5 v% w3 u9 ]$ z! R; U  temp = 0x03000000;//(DLB=0)! h9 G9 _' ?# H  C3 k% E0 j# @5 E
// temp = 0x03008000;//(DLB=1), {- ?2 j5 E: V# Y; U4 b/ s
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
0 b1 R& C7 o& h7 t  temp = readl(IO_ADDRESS(SPCR_ADDR));# }" O0 Z, w1 O0 h2 f1 U* ~
  printk("temp=%x\n",temp);
' @9 o7 i% \+ o) o: u6 K! N# M
' A2 }8 `# O" D- d# m   //PCR Register; S# l" q( K9 ?# `% G
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0" X' G( B2 r0 U; a
  // temp = 0x00000F0F;
* g6 L- M1 P/ w7 @7 L  temp = 0x00000B0F;
+ _& w& [2 G8 W6 j  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized + O# e* w$ G6 F' r6 f2 _
  temp = readl(IO_ADDRESS(PCR_ADDR));" Z3 n  L' B; T  Z+ |
  printk("temp=%x\n",temp);  
, b; l, [+ R2 i4 o   //SRGR Register
8 _8 h% F, S) l   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
& v5 i: E0 y7 @ //temp = 0x301F000B;. b/ p3 A& c# i: y1 v
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 1 s# C& z* N( F) a; M
  temp = readl(IO_ADDRESS(SRGR_ADDR));
5 x; P2 r+ x6 x! }  printk("temp=%x\n",temp);
$ x, [' L/ j5 P& k* Q   //RCR: E( H( g& U7 c7 Q5 @$ Y+ H. s
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
$ n: ^  I: S2 P  f$ {) u# y. u   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0! ?9 |! r2 z4 l5 ]9 U6 Q
   temp = 0x00440040;; R& u# {5 l7 t' ~
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ' B0 c8 \5 Z( L( J' q
   temp = readl(IO_ADDRESS(RCR_ADDR));( r, `6 W7 f& s# z. u0 f; f
   printk("temp=%x\n",temp);0 I( y/ H& X) d4 \# }; e- P* Z
   //XCR. ]$ y7 M6 ]( M$ `# U- b& S
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1' ], e+ ?+ |, {- E* I, a8 E/ I
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; t$ M' v! R# z4 H
   temp = 0x00440040;$ U1 q; j5 h7 h- ^( `' a' `& A# J9 T
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   6 C0 M, j, T( C
   temp = readl(IO_ADDRESS(XCR_ADDR));$ U: X0 v$ R+ o
   printk("temp=%x\n",temp);9 b, T2 m/ f; S' A' r
  udelay(100);
0 H8 x2 A& w: U' ?3 j  //SPCR Register
* |) u6 w+ \) n5 {$ |7 X7 y  o6 j  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
, G$ o' p, \2 y& D( U  temp = 0x03C10001;   //DLB = 0 VS DLB = 1' J. i6 ^& U: c: G
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
8 _; W: b4 o$ [  temp = readl(IO_ADDRESS(SPCR_ADDR));
* B7 W: Q/ ^7 N  printk("temp=%x\n",temp);
0 O2 w- }# s' i! C( p5 |2 t  udelay(100);
% |4 ?/ u7 w' u
& R; U& |% e, q( [# @  V1 t# e  //set GPIO direction: Z6 P# C& B5 k- N; o
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ z* }, R) k% Z4 O" g
   temp = temp | 0x00000100;//EPR----input( {9 W7 \' ?  P
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output% J3 _) U8 K/ j6 F- w8 ~' _
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
. q; _& j' l+ ~+ K4 z) w, o( ^
3 w$ v$ K' R! }) \& P% E1 ?# N   return 0;
1 U. i! y5 H) q0 L}- ]. g/ e) V/ j7 Q7 E- K5 e% v& t" v
static void __exit MCBSP_exit(void)
" }8 X$ m& ^3 L  ]{& ]$ A1 R  _2 r- p4 B
   printk("mcbsp chrdev exit!\n");3 \- q0 B4 K- Y: I. D" Q: d8 Z- y
   cdev_del(mcbsp_cdev);! V" N( s5 n7 @$ f; x/ ^# A# O0 v
   unregister_chrdev_region(mcbsp_dev,count);
5 l' @2 M/ a% ]2 D  F! ^, G5 [   device_destroy(mcbsp_class,mcbsp_dev);% |7 L0 M3 W6 W( e- w5 m
   class_destroy(mcbsp_class);
' y8 G* e: M. E- r1 p}: M  H+ U4 V- Q
module_init(MCBSP_init);. t; D9 v! ~# N
module_exit(MCBSP_exit);: j/ o# b0 l, K% y3 h$ F

6 H8 E, M0 A- A) wMODULE_LICENSE("GPL");
- k' e  L3 R, o) N8 ~/ W( d- @3 C# i4 j; [& r& X
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。) m6 ?- L4 H( R- D7 F: ^- X7 `: z
我的应用层的测试程序如下
1 Z) i4 E7 q. F#include <stdio.h>
) _! x2 u+ x# |8 k: G7 M* n' Q#include <string.h>
4 [- _6 I2 F4 x#include <fcntl.h>0 @! j1 A& I+ K: m) F( {
#include <unistd.h>3 G( K8 Z8 J# n- d+ Z
#include <signal.h>, ~) c0 u7 V  |, E8 p7 |6 B9 U7 [
#include <pthread.h>       //线程
; e# T; j, I; {3 }#include <stdlib.h>+ R8 A4 g1 v1 N# k% b
#include <pcap.h>          //捕获网口数据
1 Y7 k6 h$ Z# M#include <semaphore.h>     //信号
% ^9 ~- G2 D$ g9 m8 y1 X#include <sys/types.h>     //消息对列
$ T8 k% e- m8 c5 t#include <sys/ipc.h>       //消息队列- Y  Z5 z  a8 J1 F( ^
#include <sys/msg.h>       //消息队列
( ]# X  o" {- a& L#include <sys/select.h>
( u3 d( Y  ]% ]1 n7 E4 F: j) [#include <sys/syscall.h>
0 p, _9 H% h5 I# ]9 O: o0 D  B# c/ F#include <sys/stat.h>
. K: V1 P, o& Y# E. q) K+ Y#include <sys/mman.h>
) q  V. r3 k) x- Q7 r#define msleep(x) usleep(1000*x)
4 M' d/ I# ~5 d  f
: W4 }6 f0 p% e& ~) ]6 bint main(): u) I+ ]- \: M& ?1 w
{ 4 z1 O# {3 j7 |
    //MCBSP,ARM与AMBE2000交互设备
5 P! L8 r  Q% g( n int fd;
, x# ^! O. b# Q9 G$ B0 H, m0 L unsigned short data_write = 0x5555;# z8 Q: k$ s2 ]& m
unsigned short data_read = 0x00;
2 L% @& Q$ \/ C  A  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);2 g* W  h$ L% j. h$ @: V1 D
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);3 J2 \2 C+ g( e# |# P- ^. p
    5 r1 H, ~7 i& z8 u' R4 T# m
  if(fd < 0)
% l3 T# p: G. @* z: }  {
# i8 x" e3 L7 j! {- j, |     perror("open failed\n");- I6 b3 |/ C2 }' a, m
     return -1;9 I' C( B) K7 P2 ?
  }
% V" c% d' K% c/ N6 D5 b  P5 s$ F  # W; v6 R1 _. g. |& Y! e
  while(1)
2 h# t4 c" K" F7 ]7 h& y) T  {
7 C# c* A$ V4 a5 K- K" L4 S0 a   / `  [3 x# Q8 X! _
   //AMBE2000每次读写是24个字为一帧
$ ]. v/ x& Y. g' i; `$ a   //写数据时将数据在底层存储起来,等到中断的时候再发送/ D( o2 t5 {) R9 Y3 h+ g) H0 j
   //AMBE2000输入数据是以0x13EC开头的
1 |3 P, A7 [% {0 M5 N   write(fd,&data_write,sizeof(unsigned short));
8 I$ {- m0 k- q0 P   
& \( T& z  A; R# C   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  , H/ t# S" V% \+ o* V; {! X
   read(fd,&data_read,sizeof(unsigned short));
. e# ]! N# z, o2 `4 z   
( }9 K3 t6 O2 j# T   if(data_read == 0x13Ec)+ E& q+ J- b. @- [% ]: A* S
   {( s+ {; M3 M# L' K9 M: K8 p
   : |! M: M. i/ x$ z' a5 B5 j
    printf("data_read = %x\n",data_read);
  \1 b/ ?9 r) \2 e! W% P3 }) F  n) v. e   }
8 B1 U8 E. R1 I9 c! Z   
5 j9 s, u3 S0 L' t% D% X   msleep(10);& U3 @) R- S5 A8 d& o7 `) s* K
  
2 g4 o% ^" p! A' h4 d  /*# z7 c: O0 B0 [
   ioctl(fd,1);   
( ^$ g: @6 o) B sleep(1);) I* i' t$ ]- f2 G& Q) I8 K
ioctl(fd,0);
. H4 r5 u0 R0 y8 Q sleep(1);
2 K! r2 G% Z4 G# j  u9 ` */ + m( i4 {- [1 t" M
  }   
, `9 L; Q& P: _" Z return 0;. X- q! }0 K3 M( Y7 z& V& j

2 `6 ?4 J- r( w}/ ^$ ~' p5 z6 G, J
! h7 b! K( z$ J+ p
多谢各位指教,谢谢! 急
# `4 F" V5 N2 t* ^* H$ [, N
: M( Y& ^' g/ r/ k$ f. w, |
, c* [/ h2 _7 G  x: Y* L0 R* ?5 u  R' f5 M2 w! _+ ?2 H9 k7 {
5 N# Q6 c( e& a1 S! k

' t9 {- H) I+ w4 D: @- l! Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-2 01:58 , Processed in 0.049104 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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