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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
( P; g+ x0 Y6 {$ F- H/*" q/ D# r8 F7 K7 |" ^' T
* Copyright (C) 2009 Texas Instruments Inc+ Z7 s& Y5 X+ s  t" u
*
! L6 ]  L* {/ y * This program is free software; you can redistribute it and/or modify
/ Y% W1 |$ a% @: H) l" e * it under the terms of the GNU General Public License as published by% B6 L* ?) w/ P% f' @
* the Free Software Foundation; either version 2 of the License, or
! K/ Z% g0 f# {' z3 p * (at your option)any later version.
$ [- U( A+ N% o, M6 N *: F# u+ J% g3 p/ U& D% J5 q( v
* This program is distributed in the hope that it will be useful,5 [+ p- _; A, H
* but WITHOUT ANY WARRANTY; without even the implied warranty of% \8 ^; F$ p" x. i2 W' `6 C" o$ G
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the. e% x, t2 V, v
* GNU General Public License for more details.
2 v2 F5 x% Q% x, N4 ^; j4 ?9 t *! ^$ f" t& r' ^/ }9 H
* You should have received a copy of the GNU General Public License8 @0 X9 H- r* f9 o$ R
* along with this program; if not, write to the Free Software( W5 M# v% Y. x6 K
* Foundati! y% ~! ^$ P  R+ {/ m
*/
3 R4 J( a1 L9 Q! I#include <linux/module.h>
2 A+ h' c8 w# j; ^. I#include <linux/init.h>
: s( @+ O! ~8 h& T2 s#include <linux/errno.h>
( u6 c$ A! x- e  `#include <linux/types.h>1 D* Q% b" p% I  {
#include <linux/interrupt.h>
8 j- v# l2 n# U* v#include <linux/io.h>4 l/ u7 L- w$ e( R9 t
#include <linux/sysctl.h>
: N1 w' ~4 k6 @6 h8 \. o5 C0 T4 Y: ~#include <linux/mm.h>
  |7 p* D5 D" \. l#include <linux/delay.h>
) L! f7 v8 s7 s#include<linux/kernel.h>+ e4 D$ F. |" _+ v
#include<linux/fs.h>% g) Q  N, l/ }* h9 o* L
#include<linux/ioctl.h>& Q* {3 `/ p: _- T
#include<linux/cdev.h>
# w2 w4 I4 Z8 {' V- j#include<linux/kdev_t.h>
& }. W, J# M# u/ T0 Z#include<linux/gpio.h>' K$ b, p# t0 n" Q5 F+ q6 v& n
#include <mach/hardware.h>: h: D+ ?4 `) |1 f3 y
#include <mach/irqs.h>  l# y, n' q; g6 O
- {, g4 g5 b! |8 b9 x
#include <asm/mach-types.h>
+ t3 i3 |& w1 |; L#include <asm/mach/arch.h>
, L. m* D4 m' u6 J4 h$ k% K9 e8 s7 }#include <mach/da8xx.h>
) @/ q. g8 v8 z) J. I/ s+ Y8 E  a. u8 u4 [#define  SYSCFG_BASE   0x01c140009 _( }4 Z( Y( o2 E; t% i1 N+ A4 A
#define  PINMUX1_OFFSET   0x124 4 t5 U3 o7 y  j1 ]
#define  PINMUX18_OFFSET  0x168 . W5 b$ X" b  H& c0 R
#define  PINMUX19_OFFSET  0x16c
  z1 D, W" a4 t. n2 @) M( t#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
% l; m. K, b) q9 F# ?, a$ |7 \#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR/ U) j7 F) x- A% l7 r/ w
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR* U, X4 ~& `7 U- W
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR% c5 U7 b3 v4 N9 e" {4 I
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR! J# Y$ J& k* u0 o
                            : w( v" O* A+ Q% o# {* t
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR) }0 W, C# T2 d. a/ H9 G: |/ Y
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
7 `; G" R  r0 \$ V) X//PSC2 ^* o  u0 N$ D( Q5 L
#define  PTCMD_ADDR   0x01E27120  0 F9 H$ [+ l( X( V: z- c
#define  MDCTL15_ADDR 0x01E27A3C
5 i8 I) v6 u! H: i#define  PDCTL1_ADDR  0x01E27304
# y5 R  J) u. u, ^' R9 m/ ?//GPIO8 direction
+ T7 l; L3 D, i6 C+ B0 i#define GPIO8_DIRECT  0x01E260B0
7 g' `- @/ i# L- l+ ]5 J: s#define GPIO8_OUT     0x01E260B4
0 q  E" A$ V9 X$ T7 I: G+ R, R#define GPIO8_IN     0x01E260C0
$ S! ^# m  O+ r  d* Q
  V) a1 p3 V$ a8 W- R- v//#define MCBSP1_RINT    99              
# X' ^# q: h3 k% X! t//#define MCBSP1_XINT    100  
- y( x0 H! \8 I1 _: bstatic int MCBSP_MAJOR=239;6 X" w! v( l9 A& Z3 v
static int MCBSP_MINOR=0;
- Y! I' Y$ O# P' p; Fstatic int count =1;
/ x) q7 ^' [* S$ K
( {) J2 H, {- _1 @% v8 g#define MCBSP_NAME  "MCBSP-device". p% S4 B+ y$ t9 B& p9 Q

% S- D8 ]5 Q' b: e, kstatic struct cdev *mcbsp_cdev;
2 y; u7 M% ]/ @! wstatic struct class *mcbsp_class;
$ [$ j. S2 w7 fstatic dev_t mcbsp_dev;% H- ?, w6 M, P1 k3 k7 f
unsigned int DRR_data;
0 G% ?4 d: Y/ H' B/ ]unsigned int DXR_data;' c8 U0 h" @# E! b8 S6 J
static int mcbsp_open(struct inode *inode,struct file *file)
* T% I) s; ~8 p{
5 e9 C' u  I+ c+ \# ^( c! p   
: i  O% m" S" g6 }   //interrupt enable,initialized
. J' i' ]! R" v$ A% f' e   unsigned int temp;
# u1 Q8 a2 n3 b+ v; e. E   //SLEEP_EN(GPIO8[10])---0
9 r4 C' r! A4 o) t) |   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% L; _4 D, B5 F* r2 q9 E, k* A   temp=temp&(~0x00000400);3 h  x% `% m( V5 j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
; N$ \, G! l# ]3 F4 N5 {" N6 B  //RESETn(GPIO8[8])----0----1
: c* `% n: N3 n9 S* D1 F/ B   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ w6 E1 K' r7 W! T0 ^: _; r" X9 I7 t
   temp=temp&(~0x00000100);
# `/ K$ _0 \2 n# [   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---01 Z  q1 T+ o6 w5 c
   udelay(100);# c& C- H) {1 s  U
   temp=temp| 0x00000100;
" o+ G+ ?* F+ r   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
' R: _. Q. m& P! `- p+ x, H   udelay(100);# m) x* `) U) {4 d; {. F( }
   printk("open success!\n");
% e: S; A' A: G9 Z2 l# L   return 0;
  r0 c4 p0 u  |( M$ ~0 p}$ M( B$ O6 G& R2 V3 V
$ F8 q6 a7 z0 @1 r6 Z5 \+ F
static int mcbsp_release(struct inode *inode,struct file *file)
: C8 [& j& \2 K! V" F5 h{1 G! `8 X4 P) A% n
   printk("release success!\n");
1 p4 ?3 y" [! b7 e. T2 v& @   return 0;/ h' A1 x$ c/ B# s7 H# E
}
0 X  f5 v2 y+ p  h1 X% q8 X7 g- i6 g2 n, n. {) t
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): b% ^& ]; W* |+ A( K6 h! l
{
" P! Q# |: q$ x# J    copy_from_user(&DXR_data,buf,len);( R5 \7 z2 u: P
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       7 b, f9 L% ?( w3 m! L
    return 0;
* K5 O# G( E2 w: [/ F. t9 L
8 Q8 B, C* f4 c# o' u}% U0 O  ?9 v4 R' I+ ^2 d

+ u# Y. x! n; r7 u, U& z! Dstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 E# A, a" d+ ^( \2 ~$ u2 l1 _{
! j+ J: ]- J- q( l+ |0 l) r) x5 Y   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
3 `' {6 n, u: u8 b6 E   copy_to_user(buf,&DRR_data,len); 2 @- _& c( e" @$ j( I( ?
   return 0;
$ f  o8 J* e  k: t2 K9 y}* d) H6 c: ]$ x6 q6 P
3 k7 F- q8 z# ?- c
' o( M- O" t4 t
static struct  file_operations mcbsp_fops=
, q$ \. y( K2 F{
- _0 q4 A4 C( d& P8 j* x4 Y( b3 r   .owner=THIS_MODULE,
! y  Q* A0 l% S) }% |+ J( q, |3 c   .open=mcbsp_open,' x7 c" _# x# a( p: C* [# d8 u: _
   .release=mcbsp_release,7 ^+ s4 Y- I  n/ J7 D
   .write=mcbsp_write,
; a0 d; {8 ~. @% a   .read=mcbsp_read,
3 z! M0 L: ]- w1 H# i) D};: I8 T. a( P* j, M; L% L' D" ^0 j
static int __init MCBSP_init(void)
. t4 i* ~' Z2 t' N/ P{
& g  E/ ]$ m! K- Y# K2 Y   int ret;& W& O. V/ \: Q. b* U- d; x/ x
   unsigned  int   PINMUX1_REG_old;
) r# Y0 p1 B1 @   unsigned  int   PINMUX18_REG_old;
8 Z. n- K9 U2 d$ z   unsigned  int   PINMUX19_REG_old;5 ~- }4 m. Q7 T
   unsigned  int   temp;  6 ~& G1 K# T/ N9 j' e/ N) H' s
   if(MCBSP_MAJOR)1 a+ r$ N4 o# p9 |$ [
   {
" E5 c- o7 K' R5 w      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 t7 R  k' D- T  [; f& o& i* `
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);( J+ W2 B  H# g. H9 e1 `
   }
0 w( f2 X$ l0 Z. V7 B   else
: Q0 {8 p& a( S   {
( l4 S; n2 y. G! w# R1 }      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
, K% }/ E; Q& Z& Q      MCBSP_MAJOR=MAJOR(mcbsp_dev);
  I. T9 h: r- t% v7 G, P( b   }
) Z$ q* c9 c% L& k$ h   3 l8 M/ ^6 z; r- D, \$ B- n
   if(ret<0)9 P( o9 L" b2 |, ~9 v0 v7 V5 `
   {
& I+ H' b' Q$ G0 q' F      printk(KERN_ERR "register chrdev fail!");
6 T3 Z- \1 v$ |3 o: l      return -1;
! y$ P! ~5 Q; W6 J2 I  |  P   }7 g/ L3 Y6 x4 s% i
   4 p' F& j0 [$ t8 U+ `2 J
   mcbsp_cdev=cdev_alloc();  @: o% ]( ]6 n8 G. `
   % H. k+ ?, h/ n, ?' L$ \
   if(mcbsp_cdev!=NULL)" Z( N( l! v2 P& [5 q' U
   {0 O( Z" A9 p1 T/ d8 ~6 c
      cdev_init(mcbsp_cdev,&mcbsp_fops);# x$ K9 o% P! N7 ?( ~
      mcbsp_cdev->ops=&mcbsp_fops;( S" r, ]& d' r
      mcbsp_cdev->owner=THIS_MODULE;' E0 {0 ~% S8 H( E
      ; H8 I  b! k0 L) C+ H
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- O+ Q" p, Z. \          printk(KERN_ERR "register cdev fail!");$ D" L* v9 @2 s. @, ]0 C) Z
      else0 p/ H- M: E* N' w6 H5 ]
          printk(KERN_ERR "register success!\n");  f9 `. {$ w& g; A
   }
0 \% Y! F9 m9 n, l/ g2 t, \# u+ G   else
2 \' |+ d+ k% I4 J   {( [0 F+ I1 F" X+ h: f7 G
      printk(KERN_ERR "register cdev err!");8 e' c! }9 w' u8 {, Y/ v
      return -1;/ A  d4 d& x* F
   }
) s% q/ a& `0 V4 f   * x( F( f  {3 a8 p" J1 z4 u
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! s' H: d3 M6 u
   if(IS_ERR(mcbsp_class))# L0 y+ b2 Q" m, ~; u: p
   {
) p" ~! u: E4 y; U      printk(KERN_ERR "register class err!");5 |8 r; R* \) J' k- @" S. \+ s. ^
   return -1;
/ n" \* {# P" j- u, z   }
" z6 ~9 q) V  E   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);5 u4 d; t/ n) ^

/ S" ], u& F. b# l" |4 P   //PSC. T! V2 z) `5 s% t! v# P3 @
   //add Enable MCBSP+ c8 X7 Q4 @' K3 i3 y
   //test
+ a/ [9 U' [/ r6 B, A   temp = 0x80000003;( y8 ^5 O% X% q8 {; A5 M
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));' x' }( O: J4 J! F. R. w8 G7 i% v+ x
   temp = 0x00000003;
: p; ?- M( z" R1 G& f# w   writel(temp, IO_ADDRESS(PTCMD_ADDR));- S" [/ A$ {, X+ a: X/ J( u
& e- S+ D% d) S
   temp = 0x001FF201;3 f5 H% Y0 b" u/ ]! H! H
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
0 A- k; |9 S, Q) y2 E" M& r   
' _) J$ N$ k: X8 X. c( S   //PINMUX  # L+ D5 N% ^% c
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. K7 a2 ?) i3 r' C8 Y" J: U
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
/ Y  n* e) y- M/ P' e% a   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   & I- y% D' a) Q) F9 ^0 N2 p9 [; |2 U
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);+ f/ ^" O2 [2 T  _
   ) E1 o) S! A9 C* K4 L- _1 I
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
' j4 T3 m  j* c7 `# K   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  . S9 t' k7 J# h& ?+ m, S' _
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
4 \& k% D6 ]& {( @# C! R* ~; L+ V   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
, ?% m+ v( P5 d0 L+ U8 o
2 s4 U+ f" b. D+ a2 \1 a- _5 m0 E. n) A   //RESETn,L138_SHK2
' e/ D+ ~: Y" S- s/ n   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  & w* J, p4 t) c: n
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
6 }/ E+ l' p4 O" ?+ s$ k9 O& d$ j   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);( o- m' Q) u) S4 c  {: B- X7 z- c1 D
" w  k+ S/ h6 p; \

- V0 r( }7 k5 m  //SPCR Register/ s6 F% n. M! u& ~& b7 T
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
* c# K1 N- {% ~/ [+ Q  temp = 0x03000000;//(DLB=0)
" @  B. \% {6 b6 w // temp = 0x03008000;//(DLB=1)
' {  Z( e# j9 I9 o  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
2 e# `9 F& P: V6 a  i6 C% z  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ o* e; i- V; z8 _4 w/ J2 D! O  printk("temp=%x\n",temp);
2 I9 X8 }8 F( W3 t
% T; z5 o. Q5 t' L8 {# P   //PCR Register5 C/ u" d7 D3 d0 p! n& C7 @6 P5 G: ^
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ s0 A/ K5 J# N0 T
  // temp = 0x00000F0F;
9 u; F+ p" y8 ^  D' c0 X  temp = 0x00000B0F;3 _: v# H! X; `3 o  F8 t: {, W
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
$ g5 D( z  A" G( Q. P4 a- S% ]  temp = readl(IO_ADDRESS(PCR_ADDR));/ V# ^/ y" s6 Q7 O. H+ B0 o
  printk("temp=%x\n",temp);  7 X+ ]/ y0 x5 b# n$ \
   //SRGR Register- f3 }( [$ Z+ r3 @7 v: O$ M8 [
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
2 O2 M( E& u4 }8 F; s //temp = 0x301F000B;8 m, D8 s) G1 A) N1 c# M' I
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
; P1 R, |. a' B( c& L  temp = readl(IO_ADDRESS(SRGR_ADDR));( g# H7 M( E' L# B5 M9 N
  printk("temp=%x\n",temp);" A6 {! Z& I$ Z/ a/ k1 b
   //RCR
! K" f$ H1 O6 H   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,* ~* w& j: m# t# y% I- a0 S
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
6 J( d/ r1 a0 O) ^7 o. H   temp = 0x00440040;
5 @7 |; s9 i: w; ~6 s+ q# b' s   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   5 h6 k( r7 J5 X& S2 p* N) p$ R$ R1 |
   temp = readl(IO_ADDRESS(RCR_ADDR));# Q& m  Y& H' X5 }  W8 {- R/ J
   printk("temp=%x\n",temp);/ P; Y' A  X$ P. g. N5 C/ }" i+ x
   //XCR, c# Q+ j3 p" Y. I2 S, V  ^
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 G. \5 }* R5 R& T7 j% }) @
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
0 S0 l; l, s' }$ `6 t4 o   temp = 0x00440040;9 N7 z) v. H  ~! J8 W0 C" I
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   & J% F1 ^/ S$ f& G2 A
   temp = readl(IO_ADDRESS(XCR_ADDR));
) `1 {3 K2 a- [   printk("temp=%x\n",temp);
  M* r2 o3 E8 X- ?! l  udelay(100);
# f4 h8 n( `4 I  //SPCR Register
- o8 |; t& z; S. n1 T8 |  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-15 M; l3 X$ M' U) H" \# i
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
/ }" X( V! S. h' ?  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
2 V8 T% p# A0 y4 F9 g/ b  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ s9 f' u  l7 ~. T  printk("temp=%x\n",temp);
: ^( i) ~% w3 C' l, @+ I1 h/ Z( D- T  udelay(100);
+ ?* Y( f4 K7 e# h1 c3 d* w9 v% j4 c' `* k. A: o5 d- ~
  //set GPIO direction% \4 |3 Z# a& v' j9 r
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
9 g& Z5 D* \. x. b! L5 N3 r   temp = temp | 0x00000100;//EPR----input
- K) [% t( F1 i5 \  A, b5 J   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 P' `1 d7 r. L) W& M- p3 ^6 m0 X2 h   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); / n4 X2 V, ^2 |; x' x0 x( d

0 n3 j7 x7 @( c1 Z# d# c; P* d   return 0;3 Q% A9 l! G- T- M' q+ s
}
4 X! W! M+ r6 g# c/ w0 istatic void __exit MCBSP_exit(void)
7 I% ~" L8 E$ `6 K; S{
) O: k5 _2 s! T! y+ F8 ?7 i   printk("mcbsp chrdev exit!\n");3 u+ U- ?) d4 ]. K. W  J- p5 U6 `
   cdev_del(mcbsp_cdev);
) N* L& W- b' W% ?   unregister_chrdev_region(mcbsp_dev,count);
4 o0 ~$ K  u/ [. `# q5 v   device_destroy(mcbsp_class,mcbsp_dev);% T1 A9 U. D( g: k" w7 L! O
   class_destroy(mcbsp_class);
! _5 c+ q9 ?' C1 p5 K$ ^}" x* q2 L. @% w
module_init(MCBSP_init);/ o) a9 d  @- {
module_exit(MCBSP_exit);
, @3 x3 \  G# U' `4 ?  S: n$ u
; e* F- [- ]+ ]+ q* MMODULE_LICENSE("GPL");( s3 Y$ j- X1 S

1 H/ A' X8 E0 _+ Z我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。; e. h% V( Z( F7 s
我的应用层的测试程序如下
# P. Y' z2 y9 n5 r" |- U#include <stdio.h>  I. y, g2 c$ J- o
#include <string.h>
/ s  w* X4 x+ j. L#include <fcntl.h>& W  N. f2 }. o1 _0 s+ p
#include <unistd.h>
0 P, K8 e  r" y6 X* D#include <signal.h>
. Q( Z0 c' S0 b1 w- Q8 p#include <pthread.h>       //线程( V* c" p! j+ t+ w# x: r# k
#include <stdlib.h>
. Z! g* N! B3 |8 {$ I: h8 R. h3 A* H#include <pcap.h>          //捕获网口数据+ K2 @7 d/ V$ B9 S; t* t
#include <semaphore.h>     //信号5 Z: f, r- ^# E& o
#include <sys/types.h>     //消息对列
8 p; y4 U: s9 Y2 z; e  p9 d#include <sys/ipc.h>       //消息队列; G% r& E9 X8 O- T. d0 J
#include <sys/msg.h>       //消息队列* z7 _: X: Z' q; a9 d  d
#include <sys/select.h>0 _% e8 s7 J# Y& f1 `4 ]. R. M
#include <sys/syscall.h>4 Q0 r, E- u  V/ L/ h$ Y# J
#include <sys/stat.h>! `8 e/ r# Q% l, q& s& }$ R" U
#include <sys/mman.h># i9 A* S4 P6 o8 x8 ~  N  @. D4 a
#define msleep(x) usleep(1000*x)
; B, _& D( ^- M. x5 f) s3 X! z- W- m( _* ~* X
int main()
+ j& \6 r" n0 _. ~1 t{
- R0 @) ]5 |1 Q8 K    //MCBSP,ARM与AMBE2000交互设备
$ W) F8 _) C6 Z0 r$ e5 G8 h, _ int fd;- d- D0 D9 q$ ~0 j$ a" n1 f3 b
unsigned short data_write = 0x5555;
( |% |% j6 O) e unsigned short data_read = 0x00;" S+ d6 P1 H  u, n) ~
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
! E6 h  G# s2 f; { //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);* k& O0 ?* K2 K2 `& @
    8 u. U3 z* U! }& K" Z+ V. D
  if(fd < 0), J0 t) K- M) S; Z- i1 R
  {
0 v& ~: f. s( {6 ^# K8 k  C% K) d     perror("open failed\n");- w, @4 o5 t% M
     return -1;
! _+ G# O1 g! }& p  }, L: h2 V/ K4 A$ W
  
0 N8 \7 S' w! ^- _4 b  while(1)
" {2 }8 h2 c. }/ L  {
. q- v8 u! H: t   1 ^" L2 k& y  l' n+ g. `( }
   //AMBE2000每次读写是24个字为一帧
1 i+ }* p- V* ]) \; t1 V  p   //写数据时将数据在底层存储起来,等到中断的时候再发送
( J8 Z- p9 c5 j" @7 _   //AMBE2000输入数据是以0x13EC开头的
& a8 H0 _3 `' K" K: r; b   write(fd,&data_write,sizeof(unsigned short));
" Z+ f7 ~/ t1 u% f# U/ Q4 t7 c4 m   4 s/ u. J/ u/ Y
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  - U# V0 v, Z' ~: D
   read(fd,&data_read,sizeof(unsigned short));
5 ^$ z& \. Z3 D9 p4 j4 h   
2 x* t3 S4 Y" `0 Y5 w4 Z/ P6 E+ b   if(data_read == 0x13Ec)6 h/ j% i& w$ {6 f6 }1 Y% `- c" b
   {
6 M* D1 p+ ?/ O   
7 r; D7 a8 B% d# m, H    printf("data_read = %x\n",data_read);$ l) H7 c1 a3 o; o) i( |) X" s- f
   }
0 @" [1 h7 [9 p, V   
. L/ u$ c* G0 m- s' u) B) X2 r8 K' f# z   msleep(10);
6 u% e9 @  h. C7 _  
9 a& _5 V) W; v% x  /*
) k, O: G8 ?: J   ioctl(fd,1);   : H' C8 u5 Y( n# V# J9 H, ]' q& S
sleep(1);* T$ T5 ~# i3 i5 l6 m  N
ioctl(fd,0);( L) p" z$ x) p( q, J
sleep(1);0 y3 N3 q. d7 Y; ]
*/
3 j9 Z/ Y+ l, ^) b2 E! O  c. _  }   / I7 T0 j$ B6 {$ G* p* B9 \" P" [
return 0;2 Y# ~/ M  C& r+ _6 }1 ^* r6 {! J
; Y1 M4 v0 P5 @1 J
}8 j$ U, M: _) D4 \" F! x& i, s; O

. B6 |0 V% v8 y  H/ [; G7 |多谢各位指教,谢谢! 急
7 b- V. q) K* }7 F8 ^- S
6 u3 m. Q/ J% @* @" z5 \% Q3 b" ~$ C; _8 i  b
( I/ {: I" l% x) F! k8 g

( l8 I/ b8 H! U# F5 n: p  c  b
, N+ D% Z8 d, {: |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-11 19:21 , Processed in 0.059939 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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