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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
* R$ w) l9 `6 K  b  x. `/*
# M. l+ G( p2 U. V0 F+ J * Copyright (C) 2009 Texas Instruments Inc
7 l, b( @. S1 [7 k *
& V8 S* J3 q3 `! T& I9 B* r; x/ g * This program is free software; you can redistribute it and/or modify6 j) {' Y' z9 T' f
* it under the terms of the GNU General Public License as published by
# O4 M1 f3 Y7 Z7 q" T  U * the Free Software Foundation; either version 2 of the License, or" @. ^) M" N9 {) r8 R, k
* (at your option)any later version.( X* ?: }6 M* t8 G
*
% L3 M  s7 }, G4 F$ c1 a: g; d * This program is distributed in the hope that it will be useful,0 V6 l& D6 K. P& [; M* H
* but WITHOUT ANY WARRANTY; without even the implied warranty of
6 f4 w) _: }6 [0 q/ y. Y  F * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% L0 [8 z. w  {0 O * GNU General Public License for more details.
5 {2 J9 X" V" X" k$ x *& q5 U3 \; J  y9 @& o
* You should have received a copy of the GNU General Public License
/ q% H9 T6 x" m  f$ b * along with this program; if not, write to the Free Software
2 y# G/ U6 L; w( @4 c* U * Foundati
1 D. y% X0 g+ |% g8 U*/
2 ]* K# Q$ H/ u. L#include <linux/module.h>
% v1 Z9 H2 T8 n1 N; Q) ^#include <linux/init.h>& J" w  C" H. v! r3 o
#include <linux/errno.h>
; k( |/ _$ j$ O2 Y#include <linux/types.h>
" h; j4 V1 d# t+ K' N0 q#include <linux/interrupt.h>" l$ G: \8 k4 h" j
#include <linux/io.h>
! x4 U; z+ e1 v#include <linux/sysctl.h>! O  {; E& p5 f1 K; f
#include <linux/mm.h>0 e; {# F. T' L, C+ P8 [
#include <linux/delay.h>
0 z  i) X# l2 x#include<linux/kernel.h>
4 ]$ J6 i; w6 F#include<linux/fs.h>' Z0 P/ m& m9 c) ]2 B2 W/ @
#include<linux/ioctl.h>$ ]8 @) L, y1 j  b  s' n
#include<linux/cdev.h>) ]' \9 I5 ]9 V' @* U3 e
#include<linux/kdev_t.h>$ x4 s! l9 y0 q/ c6 F
#include<linux/gpio.h>7 A  ^2 C. s: x) b. n" |" O. `
#include <mach/hardware.h>
5 y, C8 m( V9 x  M1 Q; t#include <mach/irqs.h>
! h% S1 C& K! j5 q* T9 j- w7 T* z7 P5 Z* d
#include <asm/mach-types.h>
  R+ Z  d& o8 P5 ]/ i. z9 l#include <asm/mach/arch.h>
5 H1 a+ R' \. c1 G7 W' X/ V#include <mach/da8xx.h>
+ j8 @% e. d; }: i' v" D" _#define  SYSCFG_BASE   0x01c14000& o' T# U) |, H) _3 C4 ~
#define  PINMUX1_OFFSET   0x124 ( f/ `: l# f1 S7 v$ V+ Z
#define  PINMUX18_OFFSET  0x168
5 t6 X* {7 a8 F: B: R- Z#define  PINMUX19_OFFSET  0x16c
4 {; M% U* p# D8 x) z) X#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR7 i' S( G% w2 a9 a" ?: i
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
5 g  k2 s% ]5 k( q- ^#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR8 y' X0 J+ {+ [' Q
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
! u, H, ]3 E9 D8 g3 q( \#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
- h" b& R. W( \; f4 c$ z5 r; r                            # V6 Y5 ~0 O5 z) X* ^9 |
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR+ h( a9 z3 z: B5 t1 j
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR# C/ T( q) J7 L, J+ K
//PSC
' X* Z1 X1 i1 K" E2 f2 n% u#define  PTCMD_ADDR   0x01E27120  
6 f. x8 y4 S! z& D5 F#define  MDCTL15_ADDR 0x01E27A3C8 n& p4 V8 d6 y
#define  PDCTL1_ADDR  0x01E27304/ O2 B; m; u) }. D0 g) b8 J: s
//GPIO8 direction
, h  g8 K* a- k8 q#define GPIO8_DIRECT  0x01E260B06 i$ k2 _6 ^8 @+ ^& O8 N1 t
#define GPIO8_OUT     0x01E260B4" g( k+ w. Y- q
#define GPIO8_IN     0x01E260C0
. y8 l6 e# S  U- \; G0 I  t) {. f0 U+ ]4 ~5 [
//#define MCBSP1_RINT    99              ) s! Y' {. F3 j" I
//#define MCBSP1_XINT    100  
# n9 W3 p5 d' _static int MCBSP_MAJOR=239;
8 H  N. L0 h& N1 V: T. K) Cstatic int MCBSP_MINOR=0;
7 d5 y0 O. J# |7 \- o9 Y5 O# Dstatic int count =1;
3 c: z) m' \- P8 V9 n+ D1 L
' v- f+ h  e2 ?! w, K#define MCBSP_NAME  "MCBSP-device"
$ [  E. Z: _3 L! i$ ~
# M" w5 q" f$ F- p, ustatic struct cdev *mcbsp_cdev;
6 M6 @9 l. _0 Estatic struct class *mcbsp_class;
! s; t, ~" f) M: Bstatic dev_t mcbsp_dev;% [6 Z  E; ~  W( l% ^  K
unsigned int DRR_data;
/ H# n! c& i  Bunsigned int DXR_data;3 q. D; ]! J; n; `: n+ x. {
static int mcbsp_open(struct inode *inode,struct file *file)2 u5 J( y- m" W) z+ A: A0 z. F' X
{
: N- S9 f4 ?/ K9 J+ W   
% i( c: S, {; q1 v6 T% s0 i   //interrupt enable,initialized
( w  O$ [9 p4 T7 c7 h   unsigned int temp;
$ e$ S1 K1 W" _+ l   //SLEEP_EN(GPIO8[10])---0( t& ~' K1 F3 y
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- g6 i. \. H- s0 ^
   temp=temp&(~0x00000400);
. \1 l5 ?/ _1 Q  N- O8 e   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
  Y) s- t% M6 n2 u, m9 f  //RESETn(GPIO8[8])----0----1
: H4 z+ D. p6 W$ ^0 f   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' O3 E! g  [/ j8 U' A   temp=temp&(~0x00000100);. {, \3 c- U3 y+ O$ |
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. O# d4 _$ l4 }) P   udelay(100);8 z3 I/ N4 s5 N1 }! x5 c, [: [
   temp=temp| 0x00000100;
5 e4 N8 J- H: Z3 |5 F   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---17 K9 F" N3 w1 S
   udelay(100);- K, n' f4 [" I% ]# u% z
   printk("open success!\n");3 B) l- v8 [; x
   return 0;0 D1 s( h* b  k* b! }1 Z7 ?
}/ \; A6 p6 {3 x" J; O) u( _
5 C' N) e' l7 o
static int mcbsp_release(struct inode *inode,struct file *file)
9 Z- s# [- X2 F4 H/ [{& O; |6 R$ G5 O8 l  `; G& P
   printk("release success!\n");
" Q! l  C; D6 O9 T: {6 G0 \# n   return 0;
- e: ]" D2 T, g  r}) L& \+ }4 f, i5 S# Q
6 a' q. H1 ?- ^/ i
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- e8 c6 a" p6 M" |, F. w* e{
0 ~: L2 g; G. ~, N% R" o    copy_from_user(&DXR_data,buf,len);
# o' U  ]# O; l$ F: U! Y    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
" R2 g7 r3 D% b& {# T    return 0;
8 h* W8 \( r+ F2 W! w& Y
) y, [/ w' T( l5 y; Y4 e$ g; |}3 F5 O. @" y1 |. q- U# n6 P. g: @

2 R$ k% S: G& \static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
( g0 J& s1 `1 ~- D* A0 a( j" r) x1 `{
, }4 p1 s$ F1 o. n% p   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
, Z$ a! b$ E5 Q" e, G% N   copy_to_user(buf,&DRR_data,len); 7 z# g- a6 Z" Q3 h
   return 0;
$ D9 x' x, f( h) s7 _}2 W) w5 `" P' J8 D5 B+ I
; o' J+ g! X. T' ^+ O
! a/ o8 Q9 w. v+ `( _0 ^+ H3 n- K
static struct  file_operations mcbsp_fops=) x. A: m. q4 g; w+ N+ C7 I
{& n4 t3 f  B" H: C
   .owner=THIS_MODULE,
6 F% |, e* q8 B0 b0 R( d   .open=mcbsp_open,
( N8 l! X7 M. o2 V( r5 ?) p6 j6 r   .release=mcbsp_release,
9 N0 p* U* w2 V; h! r, q   .write=mcbsp_write,% H* [4 u7 h' f
   .read=mcbsp_read,
- I' x8 Y' u2 q  j6 J4 _: L. R- t};
6 N( p) n$ N4 z6 q9 istatic int __init MCBSP_init(void)1 S! r& ]  X, w# R
{$ o/ O: h2 ?( l% R- M6 O
   int ret;' Q0 u. C3 t, ]$ q# L; z  v- K
   unsigned  int   PINMUX1_REG_old;+ t1 \% D/ s( F$ ]3 d
   unsigned  int   PINMUX18_REG_old;
' T  a# m0 n3 p: @; h9 v/ G   unsigned  int   PINMUX19_REG_old;; {8 h- o$ p+ k9 `
   unsigned  int   temp;  ! w5 L* f0 w1 a& s8 d
   if(MCBSP_MAJOR); r! H0 M, G1 n4 w2 h6 ^& f, e7 V
   {
* m, f4 N0 J) U2 r, R      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);( K# K7 o$ s( ]  a# A
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
; \  E% _" N/ i3 Q$ b" I   }+ M! y+ }1 t! g1 C2 m; S; j/ g
   else! z4 _( R3 d8 O$ F! B0 Y$ `
   {
, b7 @' q5 f5 Q3 h6 y      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- w  s. A; K" _; B1 C
      MCBSP_MAJOR=MAJOR(mcbsp_dev);) ~; N; S8 U! E. }* g* s
   }, g; Y% I) I4 b' E4 M: l
   
. B% j$ B+ s4 a4 L  X! I   if(ret<0)
2 l4 X; p7 v2 L( g: Z8 K4 f   {
* ]0 ]; b: W! ~$ T7 ~: r      printk(KERN_ERR "register chrdev fail!");# Y; c  [* P4 V, F
      return -1;6 S) z  T) b5 u  B" o8 D
   }
7 A" f5 R% x. I4 [* y+ ]   - b3 T: P( y1 }0 }8 u
   mcbsp_cdev=cdev_alloc();) {' o) v( V: {, _
   . {+ R. F3 F' |0 n* }
   if(mcbsp_cdev!=NULL)2 G) A. r: m2 v( F) p1 f
   {
: ~1 T, F. `" z9 k6 K( V* o# x      cdev_init(mcbsp_cdev,&mcbsp_fops);
& V: ]- X- L; J& d& e& B" g      mcbsp_cdev->ops=&mcbsp_fops;( t( v% _# m# Z( y: Y/ ?+ ^) n
      mcbsp_cdev->owner=THIS_MODULE;+ I8 x! o; f1 K
      
9 c/ ^6 t+ \( M, g/ l+ R      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)): Z) m  S2 C7 H' p* P
          printk(KERN_ERR "register cdev fail!");
( N5 F, u3 ?" T/ r# R7 O! U1 e      else9 I2 B5 V% [4 M
          printk(KERN_ERR "register success!\n");
7 x; A/ @+ p. n( P   }" x" H( I) J, e; G2 p, ?3 i
   else
8 t: N' s' N+ Q  H% T- r' {; D   {
) v; M# Z# P$ e/ Q& k# _      printk(KERN_ERR "register cdev err!");" ^- H( R6 O2 b5 Y# ~; l2 S% y
      return -1;2 Y9 P5 [0 g$ H, e# M2 X- B& I- v
   }( r# [4 k- T1 n7 k; [  w: g" k
   4 }2 h! U* b2 |" n! Z* [5 `
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
; [+ W# B6 i3 b* l4 M   if(IS_ERR(mcbsp_class))
" q& H& H  p+ l   {
9 k6 |; }+ z% I  d7 b! P      printk(KERN_ERR "register class err!");
% g  w: j- g, Z  _9 f: l, x- Y   return -1;( K& D" j+ ^) ^6 `
   }
7 i' a5 D. w+ t/ I! |, q) y   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
- `2 k- w1 w- z: n6 _, D# G9 i0 W
/ N5 B0 p: M* ^! [- n   //PSC
$ Y2 ^+ ]& q& m( }3 n$ Z* y   //add Enable MCBSP1 w2 }6 @' g& k# u
   //test, Z: y: o' x, h( {; O
   temp = 0x80000003;
8 f3 b% a. R/ c& o   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
4 t  M2 Q. e# P6 V5 n( |+ @   temp = 0x00000003;
& @' A8 n% I( l: A5 J5 _: K   writel(temp, IO_ADDRESS(PTCMD_ADDR));, f8 M: W  y' X2 x4 r1 d. H
) s! f; d" e: Q  [# n/ C6 }
   temp = 0x001FF201;( I8 x# n7 O: z; Z* A
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 d+ X! H7 @* P7 n7 {
   8 D0 s: b  E7 q6 R; |1 n& ?  N; v
   //PINMUX  
2 R$ `* h- ]8 x( y0 a! ?   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
) h" R/ f% }" |   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  2 |5 Q7 R7 Z: N6 w) q' c  V
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   7 j: p6 T- [- \$ q
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 C+ c# x6 S0 W/ E9 V( y* w8 v   
( O6 C) g9 F1 ?$ h# ^   //SLEEP_EN,EPR,L138_SHK1,L138_RC
( y& f+ O- A2 L7 |   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  1 v: ~% f! n3 h" P# {
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   % @# T, C4 A7 I: R
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
! G2 o. p+ E. @" C! |- b  P
7 r7 h  ~  X( O, s! t: z' E   //RESETn,L138_SHK28 Q& _" {4 }6 N4 `
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
* H) v3 J' o; P4 H! t   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
1 R/ {- `6 ^5 X* `$ T: S   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" z5 b5 D, c3 q: b7 K. l% v: \

3 F* q, ]$ c2 B  \  q9 |; k % C" M& y; `7 m
  //SPCR Register# c5 m! N8 l; D1 Y2 o/ Y" E- v( L
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
! P9 b4 C8 j( b* n4 L  temp = 0x03000000;//(DLB=0)2 a( n2 a4 u# @. `  s# O/ F
// temp = 0x03008000;//(DLB=1)
0 p+ W, M/ N- b$ ^0 E1 `  L7 s  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
! j6 A& f+ Z+ [, w( v( x  temp = readl(IO_ADDRESS(SPCR_ADDR));7 o1 F: M/ v, Z0 b* r! H+ s
  printk("temp=%x\n",temp);
$ i  H# Y7 z' J1 F0 Q& D
  P) `  K) q( n# @   //PCR Register; ~$ U3 x$ q! `! ?& T5 T
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0/ V. U- M! Z/ I& N7 s9 y8 K" a
  // temp = 0x00000F0F;/ F8 E+ E2 I3 Y
  temp = 0x00000B0F;
8 ~* L% O! F) @1 s9 c# n. ^. D  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 9 }7 L5 K$ y9 R9 l" D4 E( u
  temp = readl(IO_ADDRESS(PCR_ADDR));
; ?( T+ m; G5 N' c& }( m5 P  printk("temp=%x\n",temp);  
" n0 e+ y% p' Q+ }4 k5 \   //SRGR Register
; }: }! x, }: R" p   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- e: w" w6 l% g% c2 v& b
//temp = 0x301F000B;  h; d' r- U- T" s- m! V
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
7 c  E8 g' T6 `2 N/ t+ z  temp = readl(IO_ADDRESS(SRGR_ADDR));0 ]8 {$ ?4 A  j& R$ d. o+ p
  printk("temp=%x\n",temp);
% I7 e- ?7 m! m' H5 k   //RCR
2 l' }7 l5 `/ u! i) u* [+ N  p   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
' m+ V* B: a1 W5 V! d) M( v   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0. ]4 y& C& S. X1 n/ E
   temp = 0x00440040;6 P/ i2 i* v1 _6 B
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   / _4 g7 {4 N5 E$ ~
   temp = readl(IO_ADDRESS(RCR_ADDR));) O) ^6 g2 j' S! X; H3 ]
   printk("temp=%x\n",temp);  @4 h5 v% ^8 [' K% H/ E2 e! j
   //XCR7 S+ _/ K9 j& K' c6 i* {; @, o
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
/ b# _' m" G0 P% v* G( P   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% z1 K$ G5 Y# |* \/ D8 W1 I8 H
   temp = 0x00440040;
/ w* ^7 }) t! S   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
- o; c' y  u/ W) ?; C$ {$ e: a5 y& V- v# I   temp = readl(IO_ADDRESS(XCR_ADDR));2 f  h9 e/ x9 c1 J2 s' X: K
   printk("temp=%x\n",temp);4 y2 n' y' O" ^: w/ G9 q
  udelay(100);; V- k: S. M  Y+ q
  //SPCR Register
, B" z1 r0 J; Z$ U" M# W. S! Z' F1 Y  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
( T' `8 Z% v; p0 O  u9 N6 u  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
6 s" E, K: r! Q" A  N  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
  X5 s; }# C8 d3 f  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 M, k* f6 d% R8 K1 w  printk("temp=%x\n",temp);
$ f" D  a2 j# [* |  udelay(100);1 t8 c) ?9 U$ A/ c

. W, ?% [% d9 D7 l6 L7 g- `  //set GPIO direction; A7 \* d2 e2 p5 ?# V
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
+ N7 [0 i7 J8 @5 H+ P& `   temp = temp | 0x00000100;//EPR----input1 {6 M4 V. n9 \' h+ o' K
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 [0 U5 M/ R7 D. I! o4 u   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
9 t* |: E) _* c" z% _% @
8 R8 z: Z2 W8 i, H" z, X$ y  p! S   return 0;
! |% D, B8 C" W# \8 ~- A" B}$ C6 o4 }& m: A, E
static void __exit MCBSP_exit(void); A. G$ U1 o. m
{( S6 p9 Z8 I5 q$ r# C& h9 o) y) H) i
   printk("mcbsp chrdev exit!\n");  I: b7 J2 `" V3 h" B* ^( v
   cdev_del(mcbsp_cdev);( X8 X) F2 O& u  \) |' `
   unregister_chrdev_region(mcbsp_dev,count);0 Z1 u% o" r$ g- I1 d- H% d; s
   device_destroy(mcbsp_class,mcbsp_dev);
, T: z3 |2 {1 u0 }6 Y   class_destroy(mcbsp_class);
  y( v/ l0 s* z: V1 ~}
# u+ ]3 [8 ^7 x- N3 l8 H7 Dmodule_init(MCBSP_init);% U& i# k  G0 E5 E* B1 f+ X
module_exit(MCBSP_exit);$ y- ^8 h* k7 s- C6 H
; x/ R5 ?& }5 T" S* Z7 F" `
MODULE_LICENSE("GPL");9 F& T6 @. z  a- K
  Y% }. o0 v( k8 s( _
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
# N4 T9 r3 I! Y0 m我的应用层的测试程序如下
* |! P6 O) P7 G' V: k9 u# p. C7 N#include <stdio.h>! C6 o: g/ p) o6 ^, m5 o! _& j
#include <string.h>4 j# _& x) `" [. ~' R
#include <fcntl.h>
5 c( G7 B' |- S0 ~% _#include <unistd.h>
" ~3 F$ p) G$ B& `9 b#include <signal.h>: o  N7 p* I6 E1 }% O
#include <pthread.h>       //线程, K& V4 D* e' |7 f5 {8 q# E1 Q3 g
#include <stdlib.h>: T4 H! R& X& d& q* Q# I& A' @2 ]
#include <pcap.h>          //捕获网口数据
0 v/ |1 V/ Q) H* O#include <semaphore.h>     //信号$ s# V  I0 T- U$ ?
#include <sys/types.h>     //消息对列
" E% w$ F( t0 v3 T& C& e( I% u#include <sys/ipc.h>       //消息队列' u5 j! L; M4 }( H. z% x' v+ g- g4 ?
#include <sys/msg.h>       //消息队列1 U* L- C  z5 i) [3 o+ V' i
#include <sys/select.h>
: K5 _) P5 Y9 O- @( P- k#include <sys/syscall.h>
/ _6 a. c, M1 }! S; w#include <sys/stat.h>
  A  t( d3 z4 e2 ~0 H5 B) r#include <sys/mman.h>. z# h  o# T) {3 U
#define msleep(x) usleep(1000*x)
' L' I  Z6 J0 Y6 k( N
; R3 y0 a" Y6 f5 lint main()
3 O+ J; ]5 |; I+ r{
# d! }; e7 R6 q% O  j3 u    //MCBSP,ARM与AMBE2000交互设备
5 _! L: b$ |! Z" o9 L# h int fd;
* }$ X. J3 u/ c% U) \+ l unsigned short data_write = 0x5555;
: e. S3 A7 u1 X' p" V6 m1 `# n unsigned short data_read = 0x00;
% T$ S0 f8 l& h' a: j$ c+ s  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
8 \' d$ K0 n+ I. d# R7 e5 c  E* U$ A //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);( v' M1 _2 W, F6 R5 J
    ( _- W1 [. x+ Z2 S" ]+ c: p* _
  if(fd < 0)! J4 x" s+ {! O4 m
  {
1 u% V8 k) D5 O9 s$ g     perror("open failed\n");
! S$ j$ {3 k% F: W% x* a/ P     return -1;2 I* G: P  \3 X
  }+ G0 A9 n  }1 V* _
  
, l! t- s2 B2 t/ ^2 \  while(1)
/ k  K% u& f; D0 ]2 @4 q  {2 J9 F; m. h, o5 t( ?
   ! T* E! q/ A6 k2 U% P. a$ b1 {  k
   //AMBE2000每次读写是24个字为一帧' {$ H3 x7 ~* _+ f
   //写数据时将数据在底层存储起来,等到中断的时候再发送8 t0 e/ L% t0 w; ^$ A) d) W2 }
   //AMBE2000输入数据是以0x13EC开头的2 ^5 v/ Q' F7 E- Y
   write(fd,&data_write,sizeof(unsigned short));
3 K2 O& v/ _: ?7 {# D; Y: x& N" r   
( ]4 Q' T7 S* |5 R   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
5 U& o9 Z; H5 N* X2 O   read(fd,&data_read,sizeof(unsigned short));
& K8 J0 G0 }" @$ V& \$ z* d2 t   - X1 P' d# P5 ?* t3 V2 E* b& ]3 g
   if(data_read == 0x13Ec)- C0 u' H! U7 ?, Q- Y9 e
   {
. o# W: h+ d7 x$ R# z- H. o   " V" Q. A1 e, W1 Q
    printf("data_read = %x\n",data_read);
$ `9 ~9 G& E( {& w8 O# `, I% z   }
+ \/ {+ a$ }* O+ g  Y   
, D% I! |& m5 ]: }) r   msleep(10);5 P3 x- F! E. r
  
% y% {# {9 o: A; y5 a  v, H2 H6 i  /*
# N" z9 X2 e* q! f   ioctl(fd,1);   
4 c% L  m6 J3 y! ?. ~ sleep(1);
- s2 U4 B6 }! ~- o! X8 Q! ] ioctl(fd,0);
% Q9 n0 v$ O, {$ e4 j sleep(1);
& B, x. w% H7 }4 i( Y) Q' `7 w* y1 G */
+ e1 r! _. z; d  u2 n3 w6 |  }   % N% r0 x' C* w
return 0;
& d2 u+ t: t" W4 I" n9 y& G8 i 0 J+ k# A4 D. B
}7 T. ~0 d& p/ D8 {
$ V& p! ]+ p; `! Y
多谢各位指教,谢谢! 急; q: x. J1 b! {

/ M" t  m2 Y6 R3 [3 U2 |
1 X) L; |$ N9 i: s0 Q7 _' Q; C2 _' _( p) @* r$ y& }+ s

5 A" \5 S/ ^% v- t' s6 Q: j9 S9 P
+ \# v9 w% l5 X. h: Y3 X& V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 12:01 , Processed in 0.047299 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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