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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
+ K; _$ g3 J# ?& R( t% b/*
4 j# F5 {) V. | * Copyright (C) 2009 Texas Instruments Inc
! A+ i- ~  W. d2 k6 D *
( j2 ?; F% |8 A6 z0 M$ K * This program is free software; you can redistribute it and/or modify( G. c/ r7 X' n2 j+ v
* it under the terms of the GNU General Public License as published by
! M' f6 c3 l; q, E8 j8 `& s * the Free Software Foundation; either version 2 of the License, or+ Y, q$ b8 w2 w+ K/ t
* (at your option)any later version.$ t& F9 D- d2 Z3 |& g; K" ^. L
*& q9 }  I1 ?9 \0 U2 N$ ~- g' X
* This program is distributed in the hope that it will be useful,
) G8 V+ Y! d5 J. e# E) c2 D * but WITHOUT ANY WARRANTY; without even the implied warranty of3 N" I6 P0 o! ]$ {5 O  S) G2 |: U
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 b+ F  Q9 j7 B! R: i
* GNU General Public License for more details.1 T0 v, F/ {6 f
*
" v2 n3 m) G* j1 e * You should have received a copy of the GNU General Public License  ^) T$ k' v1 [# c4 C, c! [; J' v$ S
* along with this program; if not, write to the Free Software
  \  L- x& o$ u. U4 l) V5 [ * Foundati
# P! Z: b/ B! n9 Q. f0 p' T*/
! A( I: P: s# d1 K. W6 [#include <linux/module.h>
, W, o* z0 g# E- l8 h#include <linux/init.h># P+ W& P" l& E8 Z
#include <linux/errno.h>) z' Z1 W% R8 Z; O: d) A
#include <linux/types.h>
8 Y% Y1 R7 f; {4 m#include <linux/interrupt.h>% t3 j2 z# b* m% z$ D( j/ Z* K  s
#include <linux/io.h>) r0 K$ a; I3 n! B% I+ `. z
#include <linux/sysctl.h>% U1 S( i" p9 E; L. J, {% j+ T
#include <linux/mm.h>& G$ A$ C- O4 G4 L: U
#include <linux/delay.h>
# S$ a1 _$ m/ }' }, S) {#include<linux/kernel.h>
; M. w' x) Z/ n7 L5 O#include<linux/fs.h>
# e$ f3 q7 T# s; {' g9 f; o( n: B#include<linux/ioctl.h>, t% d* _7 @: `3 H7 u/ L
#include<linux/cdev.h>
+ q" `+ X" x& Y+ h6 ?#include<linux/kdev_t.h>
$ f! r! o6 O0 i9 m1 d. F+ \/ ]6 z7 O#include<linux/gpio.h>
5 t) q% @5 r0 L5 Z+ G#include <mach/hardware.h>
3 c" z, z% A: Q" K' b9 W#include <mach/irqs.h>& I9 ^: v) V3 N9 u* c

/ ?9 |3 {9 |. G#include <asm/mach-types.h>
1 E! Q8 e$ z5 ]: y. ?5 G7 y9 `/ G#include <asm/mach/arch.h>
5 b: x+ H  r7 b& ^% E( h#include <mach/da8xx.h>1 n- i; t+ a  i/ a# ]
#define  SYSCFG_BASE   0x01c140000 H7 z2 G- N" E9 L
#define  PINMUX1_OFFSET   0x124
) j! [+ u3 q; U& Q6 a#define  PINMUX18_OFFSET  0x168
) L; T% O' k- x- }#define  PINMUX19_OFFSET  0x16c
, b: ?* U6 f4 o* ^7 \- a7 Y#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR" Q( a7 r- L9 k0 N
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
, V+ S# ~7 U& Q* {2 O4 f#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
/ x. S7 W3 }1 U* U# u#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR  t, b" b. g1 Y- \4 T, \
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
' c$ j* d0 x' g" [1 c9 f2 Z                           
7 A* Q( O5 Z: \. Z0 H#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
0 I( l0 F+ [2 c) L/ a. P5 m#define DRR_ADDR      0x01D11000  //MCBSP1_DRR. H. p" k; {6 n: _5 Y7 j
//PSC
8 y, V8 m5 [) u4 C( P3 N#define  PTCMD_ADDR   0x01E27120  
! u. U+ Q' r9 K8 P, t#define  MDCTL15_ADDR 0x01E27A3C
8 Y) D5 e& X7 P& g7 I#define  PDCTL1_ADDR  0x01E27304# ?6 a. }0 b  ^+ U
//GPIO8 direction
, P' O- M- ]4 |% ~$ c5 \#define GPIO8_DIRECT  0x01E260B0$ X. j+ Q  Q' `% Y
#define GPIO8_OUT     0x01E260B48 i6 T6 q. ]' I2 `) Q$ s
#define GPIO8_IN     0x01E260C0  T' H  F' V: v; a6 c3 y
0 ~- n) {! w& O$ M- n4 o+ F. f
//#define MCBSP1_RINT    99              1 z7 L6 Z# L& c( a" ^0 Y. Q
//#define MCBSP1_XINT    100  : F- f+ [9 `0 ?$ C2 N0 E; E% p
static int MCBSP_MAJOR=239;
( K# u/ M3 V4 |1 A- w( xstatic int MCBSP_MINOR=0;9 M2 G6 H* @( p% N( a1 ~& Q) }
static int count =1;
  r3 P8 S  K( r! s; r. s: v+ |1 A2 J& T
#define MCBSP_NAME  "MCBSP-device"
0 Z* u: a, @5 [2 z3 K# k4 J7 E: }+ p. `3 T: l, Z: c! H  v
static struct cdev *mcbsp_cdev;: m! L2 @. D6 K: V  x
static struct class *mcbsp_class;
4 z- y' R2 O  o; Xstatic dev_t mcbsp_dev;( }  t- M* ]1 @% h0 y# U
unsigned int DRR_data;
& O, n* K) ^8 O( j$ U9 M! N# X: J3 junsigned int DXR_data;
: N$ t$ G$ d0 r2 e5 {9 xstatic int mcbsp_open(struct inode *inode,struct file *file)* j) C7 f2 w$ A2 j5 F, G: @1 |
{
, G! E: [7 Z- W. @7 o$ e   
2 x! X! t$ m$ ~   //interrupt enable,initialized
; x' Z9 H7 v' n- x   unsigned int temp;, v, ~/ N, V. _, v2 c- L& M' C
   //SLEEP_EN(GPIO8[10])---0
3 ?$ y) }5 z' I: Y- [) H* J   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; @$ o- P. R' w* q/ W; g  t. u
   temp=temp&(~0x00000400);
3 b9 S! Y* y# ~4 ~% x   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( E9 N& x6 [# Y1 g
  //RESETn(GPIO8[8])----0----1' y- ?# ^. C  B- g# v1 R" n
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 o2 M; c" R0 |7 c4 N% o& M   temp=temp&(~0x00000100);
- M+ y, S) M' J# b% I$ H   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
& ^8 L% b4 R& ]& w9 y3 F$ k5 m: W   udelay(100);1 L! J, B0 X5 H; n4 r7 d
   temp=temp| 0x00000100;; c0 b1 a% o# c6 Q  J' W, @
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& P1 b$ C# `8 s8 ~" `
   udelay(100);0 I4 C. G, p* o5 O
   printk("open success!\n");
* g7 ~2 p( y; G7 d" l. ~   return 0;9 l" }7 T  I+ w7 e9 J/ Y
}7 R) h% K! i  q

, ]+ v- n3 }; r2 W( H# A0 W  fstatic int mcbsp_release(struct inode *inode,struct file *file)
: @$ s, p& \1 A% r  d{
# Q: R' P0 {) G/ ]) e7 D   printk("release success!\n");
9 ~1 q6 @7 R( i! M% E( L9 P   return 0;
5 J4 S1 [" [. q! _5 \2 B}$ h( x' s, E6 H+ U
" [2 W/ \# c$ U5 T7 F" P
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 l! U4 Q3 \) x  ^- J
{/ C& n; I4 m3 h; ?
    copy_from_user(&DXR_data,buf,len);
5 b. ?. p+ m5 Z3 D* q    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
+ G- j' u$ z( P    return 0;! e1 ^4 }. U/ n5 i
) Y! G* q: S4 s& {8 W
}  T/ |8 y- {; d' X9 t  n
/ P  v: k: A- t% B$ \) Q: o, S
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 f2 Y" v8 t  s{
! n0 ]% |7 \7 o5 [/ G   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));9 V" P. J9 L' m- V6 p3 Q" v
   copy_to_user(buf,&DRR_data,len); 8 g; X, t+ [% `. ?( K
   return 0;
# v  G6 U7 I+ D* T' \$ }}( }, O; ^6 H& J/ g: g# }" b# Q
* X, V  O9 z- U5 |$ b% ?
# u' P. c# ~4 H
static struct  file_operations mcbsp_fops=4 z7 A( [5 T; R8 T$ g7 N3 \
{
8 M) n" c$ Z+ V+ e. c+ j$ {' |   .owner=THIS_MODULE," S6 V4 n6 j# y# ~" [
   .open=mcbsp_open,, N# L; ~& J  O$ t9 r  E* Y  y
   .release=mcbsp_release,
9 S9 m& J7 L6 Q8 P2 s/ v   .write=mcbsp_write,* ?+ p. L2 s- r
   .read=mcbsp_read,0 j, U- ], k, @, y
};0 s( N  e! z% D4 \7 z
static int __init MCBSP_init(void)
# C7 l+ O% ?) [9 S* Y( O{
: G* A  j) Y$ ?  t& K8 h) t3 P, v   int ret;
$ |' `% @$ Y" l& O- k7 I' G, j   unsigned  int   PINMUX1_REG_old;: z. j% R- R7 }
   unsigned  int   PINMUX18_REG_old;; o6 n4 n9 m/ r: t
   unsigned  int   PINMUX19_REG_old;
# R/ E4 c5 I  I4 X   unsigned  int   temp;  & F  y0 W, U2 [( o
   if(MCBSP_MAJOR)( Z* d6 j0 f; [, O% _
   {
5 w% @. t7 \+ \. ~1 X+ d7 d      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 h; c0 t8 B# b0 D, |' U
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
9 q! c% }7 n4 g( w5 T( s   }  M5 N+ A, d8 h% C" d, n; o
   else. ^3 j* K3 P/ h6 p$ T+ r
   {
, G% L* R- l* i5 Z2 Q$ }      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);: m1 t7 J' X6 m
      MCBSP_MAJOR=MAJOR(mcbsp_dev);- q5 ?9 k" v/ t" E: {( |0 ^
   }
$ ?: A. L: W7 k; B# m! M   & I; I9 W0 b- E' l7 ]! h
   if(ret<0); R, n4 S$ y0 {2 c6 ~1 N6 ?9 n
   {
- ~" E; U$ t& J$ t+ P      printk(KERN_ERR "register chrdev fail!");5 c  B5 k6 a1 t
      return -1;
& M1 I# i' t5 p, t   }, O$ k/ r  l- J. d, f
   - ^8 E7 x* F& n: l
   mcbsp_cdev=cdev_alloc();* a% x+ E& t# q
   
& S* O) c2 J4 O) V& S   if(mcbsp_cdev!=NULL)
0 l4 x  X) f. l6 x, f) [   {
0 `/ P* c! Y% T3 a- ], R      cdev_init(mcbsp_cdev,&mcbsp_fops);: J/ X( K; ^: \
      mcbsp_cdev->ops=&mcbsp_fops;
) D- w- F' y7 c( n( t7 Q      mcbsp_cdev->owner=THIS_MODULE;
! u- n. j8 P- Y      
" x$ c, O1 F2 c5 v5 X% o5 G      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 Y3 R: t& M) y3 y" Y2 ^, [
          printk(KERN_ERR "register cdev fail!");
! J9 d: n- i) O6 {      else, B, D% X8 a- [2 d* V6 _4 t5 h
          printk(KERN_ERR "register success!\n");
  v+ C7 I: j0 a- m5 {+ e   }7 ?/ i. P% D1 ^0 W9 [0 \% _: I+ K
   else% z, M+ {6 N+ @# G: ]% `( I
   {
2 s- p5 K- j2 z5 ~      printk(KERN_ERR "register cdev err!");+ \( ~2 T( W, c) T& ~0 O& E* R$ b
      return -1;
7 s$ l/ b* g8 Q3 v' H( R6 q  m   }
9 ?1 |  c' p5 d2 D   
7 A. R$ {/ l) B& F) L  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
3 W: q: H5 `& n, t1 w3 ?   if(IS_ERR(mcbsp_class))) U7 e2 S* w) {% {$ v; b: z
   {
7 w: }9 S9 j% D2 ~/ V2 a0 \/ F; h      printk(KERN_ERR "register class err!");' H; e/ Z# w1 R
   return -1;
  D% ?( U) _) U3 t6 ?   }7 h$ Q& Q2 }0 x
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 F7 C1 s6 ^9 H0 `0 Y

9 J  ]2 d' R3 D$ m) j   //PSC/ D- N3 {, N) B3 |1 c( a7 f
   //add Enable MCBSP' T0 T" ^. }% U& L/ W. a
   //test
/ c* M# D, ]* Y, Q( T   temp = 0x80000003;" M6 U7 w, H7 h8 J6 Z; k% a2 f3 Z; P
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));9 |# c0 K5 S6 j- C) O% m
   temp = 0x00000003;
' ?" @  W* Q" O( J% l& I   writel(temp, IO_ADDRESS(PTCMD_ADDR));
4 G; W6 Y' N, g; h0 x. A: h
6 r# }4 Z. H$ T7 G6 j$ @   temp = 0x001FF201;4 F, a- R6 M, G  T1 E$ `' m
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
' E+ b( j: j9 R0 H   
2 C- W  X( {' E+ j" R7 C$ J   //PINMUX  
. b2 B* m7 g* E2 h   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
; Z) t5 D" R  V   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
* |- e+ w3 V2 p/ l# z   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ; R' g" {$ b" p( a8 I; N5 B8 ?
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
& ?4 g+ N, S% y0 \% I6 h- S   
, L+ b" G- b/ K* t   //SLEEP_EN,EPR,L138_SHK1,L138_RC! G& w# M# @7 u: e/ v; {
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
8 Q! B  o6 S; A' _- V' y   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
. K2 K& E" @+ A& A   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);; D0 z( W9 i% ~: g

$ y  |$ H1 r) O4 \; U/ x5 G   //RESETn,L138_SHK2
" V' I+ N. Y  T3 C) u+ n   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
$ G0 G! R# p: k" |   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   0 {' {3 ~" s! |  s( Y5 P
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% r, u, d+ B! P& W , {  k5 x: W8 R: _8 |$ z! J
, C* \+ r& Q) [6 E) S. X
  //SPCR Register
/ J3 q2 Y' c& H3 D, w& @  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset5 i5 T! V" b: [0 K/ X* B
  temp = 0x03000000;//(DLB=0)
+ F. G9 n4 y( t6 L" ?) q, `# u // temp = 0x03008000;//(DLB=1)
- U6 u: U9 {4 o  d! J$ Z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset9 k# e& y- ^8 f6 `; |" v
  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ }5 z9 ]2 H! B  printk("temp=%x\n",temp);
9 s$ B2 K# ^2 H* w
( f0 q+ D5 l" a! ~( f5 s8 Y% f   //PCR Register
# d. F6 M9 B. s7 ?   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0* V) f7 G7 |' r& H. V
  // temp = 0x00000F0F;
9 Z) m* ]* @$ z  temp = 0x00000B0F;  z! Y2 ^& o  I
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized # V; l# z- w, N) N" b) }  n
  temp = readl(IO_ADDRESS(PCR_ADDR));/ \0 |2 d3 a0 }5 z
  printk("temp=%x\n",temp);  
8 D, }. ~3 ^& y+ M  ~% W6 f8 ~   //SRGR Register
, B4 ^& K# r: N$ v3 i! D! L' B/ y   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11: ]+ _: A. p, @1 V
//temp = 0x301F000B;% s5 k! @# U$ P2 ^- ^
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
; X8 _: |( y# V. V" S$ k- Z6 ]  temp = readl(IO_ADDRESS(SRGR_ADDR));9 A* b0 g/ v. \" ?* C
  printk("temp=%x\n",temp);/ Y, K) s$ @" A. a7 X
   //RCR
" R' ?8 [8 j% a# L   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 @* W5 r% e: P/ }$ I# b   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0& W( A4 b2 e; ?( y2 c
   temp = 0x00440040;
( P" E! m, S# c' C2 I" r1 z   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   4 E% X% N/ A  h/ b
   temp = readl(IO_ADDRESS(RCR_ADDR));/ y3 F" \2 Q1 C9 k0 W8 u/ t
   printk("temp=%x\n",temp);
' N' q* i: I( P9 g   //XCR. h# B, c& J. M9 o' e
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
, D: u* ~) K" E# J6 f4 s   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% A* s" `4 J4 O
   temp = 0x00440040;" i  {8 o6 K7 e$ }2 m
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ' K) f( q. \7 ~" f5 ]! ~
   temp = readl(IO_ADDRESS(XCR_ADDR));
: x& f2 u; F' q7 u   printk("temp=%x\n",temp);
, P$ ^& }$ w3 @- _) y7 n5 a, {4 j, R  udelay(100);* e/ v9 K: ^" o7 {4 x% i
  //SPCR Register
( {; V9 m0 H2 y* ^  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, X2 B( B# o# Q( _# f/ {
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1( w) f7 z3 Q0 `/ T0 O; r
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
: h% Q- [+ v5 h" W  temp = readl(IO_ADDRESS(SPCR_ADDR));8 {' r( ]# T" Z& @8 j2 g' F# r4 e
  printk("temp=%x\n",temp);
" ?& P. s4 ^5 Q7 |  udelay(100);
8 f+ F% r4 A5 L
3 u& {% k1 o' a& I6 O  //set GPIO direction9 h3 o+ U* ]) O" s- L( [
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 K9 S$ V/ Y) G; ~$ W! y   temp = temp | 0x00000100;//EPR----input
# @0 p) f( G' S8 d. _4 G! N   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 G1 Z' |% v) C
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
  B6 N4 _8 l  I( h% W! j/ y
& U, J% G% ?6 N7 H! I: o   return 0;
5 ^7 V: T' q8 H/ B8 o}$ {5 O  x( e# q
static void __exit MCBSP_exit(void)! G( q4 u" z& n; w  v7 k- G
{9 M: F( X3 B' f9 E1 @4 E1 `% l
   printk("mcbsp chrdev exit!\n");
9 x( V% R; m) Q, ]; e" L/ ]   cdev_del(mcbsp_cdev);
' b( h+ e, A7 B$ y% k2 ^, `   unregister_chrdev_region(mcbsp_dev,count);
4 Z. `0 h" L' l; y7 j/ B   device_destroy(mcbsp_class,mcbsp_dev);$ `; h! E7 q: m! O  {
   class_destroy(mcbsp_class);( `3 ]; Q# Y& s' ~
}
; }+ h, `7 q8 qmodule_init(MCBSP_init);
* @% _: a1 F' b- E7 o9 k3 l. qmodule_exit(MCBSP_exit);" F3 ~2 z, F2 N* j' o
5 u0 n6 n! E' E/ h3 c# l; S- P+ G7 T
MODULE_LICENSE("GPL");
/ G; s, C8 U, n* {( ]6 I: T* o4 a0 R  H1 ^& C4 T0 M+ J9 X
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
0 c% S( U6 K1 n2 a  r我的应用层的测试程序如下8 h# B5 J# ]- }: V
#include <stdio.h>
8 l( |" S& j2 e( k: e#include <string.h>% m( H- N: f0 _* o  _
#include <fcntl.h>
6 k) W' k2 a* O( x% P$ `" N* `#include <unistd.h>
1 ]/ {; S; t( G$ `# @% T#include <signal.h>1 z$ V8 O- O6 s! H' m& i" p" E
#include <pthread.h>       //线程6 o8 c/ h4 p- h3 x
#include <stdlib.h>
$ E' S  n8 v2 ]. ]0 J& m#include <pcap.h>          //捕获网口数据
5 b1 l) s8 i; o( h  ]3 f; G#include <semaphore.h>     //信号
+ z; @; ?8 x4 g9 O4 u#include <sys/types.h>     //消息对列
1 y; ?  A& \# A2 b9 E#include <sys/ipc.h>       //消息队列
1 J- `+ N8 t+ U5 W7 u  @#include <sys/msg.h>       //消息队列+ `$ g1 x1 m$ l" \  B2 h( @6 e
#include <sys/select.h>
' k8 u8 K+ [; C9 ~8 Q  u: B7 U8 j$ x#include <sys/syscall.h>  B2 S. d4 N" t' s2 y6 q
#include <sys/stat.h>0 E" I- u- K8 |2 m9 Q! d* T
#include <sys/mman.h>1 W5 U$ P, L0 d5 o
#define msleep(x) usleep(1000*x)
4 M. W* _) o% \2 E6 }" t# _% R8 N: `& O$ Z$ e0 L# N# O
int main()
  k, o! l6 M' q9 Q" C4 p9 B' a{
' \6 G. g5 e2 ]/ h" W* b9 T    //MCBSP,ARM与AMBE2000交互设备/ n( L& M; }8 m* u3 [6 V6 b
int fd;
& |3 q/ n7 F: m  N* ~% i unsigned short data_write = 0x5555;" k3 F1 m& s. ~) A! Z  O4 m
unsigned short data_read = 0x00;8 @# u+ ?2 f9 ~5 }$ g) w! I
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);3 j( r+ h4 u$ X) U* B3 N% }. L
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);+ h2 X( v6 i' h- H( _$ t9 J) \, ~
    ' W/ U4 L- a- R$ U
  if(fd < 0)  m2 F/ k# f) C# N
  {
8 }9 k- f; B7 b     perror("open failed\n");
9 P, ^; }( s. f& a* f; s     return -1;2 O, M4 B) q% W
  }/ g% }1 u& m2 t2 _- I1 W$ l% c9 ?
  
5 Y* j6 c3 S0 m2 j% c  while(1)5 }) A' N9 y! l/ q. ?
  {9 J+ d) U, ]8 ^. l# `
   ; v* d; K/ ^# U0 X1 N# _9 `/ U8 ^
   //AMBE2000每次读写是24个字为一帧
5 P$ ]+ o: o: x0 h# ]3 ?   //写数据时将数据在底层存储起来,等到中断的时候再发送$ b% h- ~! D9 X( n0 W2 A( j
   //AMBE2000输入数据是以0x13EC开头的
9 x4 J7 f" c3 \. b   write(fd,&data_write,sizeof(unsigned short));
: d: J" K+ v4 W2 ~   
. }% L  R! }6 h, _# K3 L0 K   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
  {/ }, E7 L) R( r  P2 g   read(fd,&data_read,sizeof(unsigned short));4 \- P( Q  R9 m5 o
   0 X* `5 I9 v- C+ l
   if(data_read == 0x13Ec)4 z. o8 R  I5 d1 X7 s1 i
   {, a4 }  Y0 K( g; B) j
   . K8 T0 p2 i/ v/ h0 i8 f
    printf("data_read = %x\n",data_read);
* m# S# M# h1 B2 I6 K- N3 m" e1 u7 r$ b   }- Y5 D: e/ {( \, t
   
0 A. X0 X! z! v$ C. k. H   msleep(10);, S. b: ]. A0 _! A
  ; @$ }3 w" }6 @$ [6 n- M+ Q; T: ]
  /*
+ U5 G0 O( l( `/ v  e   ioctl(fd,1);   + u5 W5 z0 m" C7 Y* k
sleep(1);
7 l- g5 v2 L+ f" ~$ K9 W ioctl(fd,0);1 S8 G; _. B" X! B" u0 s) Q  N$ L
sleep(1);
" d  G$ G& T! e; [: y8 V */
9 t/ ^! {. M5 G  }   & m) B! m! V/ C
return 0;  H' T) v6 S# ~( v% W2 M% ^* M% E5 I
* d" D9 q2 Z; h2 p! B9 s
}
* Y  ^. i$ R' W5 `2 f( s% Z5 e7 h) `( f+ @0 B
多谢各位指教,谢谢! 急
. S1 ~2 }! `! D, R/ V/ I9 l  E+ s+ q$ G+ Z$ |4 s+ n

- `" X0 ^1 p: p# {' x
) x1 E# V: q0 u" ~; z2 ^# A( s) M& M
2 B% n# e  j! F9 O( g: b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-1 23:02 , Processed in 0.049352 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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