嵌入式开发者社区
标题:
McBSP时钟、同步、数据线不正常
[打印本页]
作者:
gaocaimary
时间:
2014-10-16 10:58
标题:
McBSP时钟、同步、数据线不正常
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
' e+ D" Y7 P% w: Q8 B; G
/*
( i+ {) u$ x/ d) v
* Copyright (C) 2009 Texas Instruments Inc
! `, O* L: T1 ~" M; }
*
0 u0 |* l- A3 H: ^
* This program is free software; you can redistribute it and/or modify
3 G0 n3 d9 i7 f4 ?0 U/ t# T
* it under the terms of the GNU General Public License as published by
3 ?" S$ O* R! L8 v4 A) H
* the Free Software Foundation; either version 2 of the License, or
7 ~6 L# e% Z4 E+ r% T
* (at your option)any later version.
: m9 g4 j3 F5 t5 v3 r1 w1 r8 w
*
. n4 C, b ]/ z4 f/ s& b0 N" I
* This program is distributed in the hope that it will be useful,
; k/ L3 l& I# V n2 h
* but WITHOUT ANY WARRANTY; without even the implied warranty of
7 _7 e. [3 I7 J
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" H$ k1 s' \9 t& x+ ]) K: a
* GNU General Public License for more details.
Z, U4 M4 Y q$ s) g
*
- y# ^: f6 O3 r* O
* You should have received a copy of the GNU General Public License
- q* B! j e) D& i
* along with this program; if not, write to the Free Software
4 C$ }- U; S5 a& C# Q: K( o
* Foundati
4 W& P' S4 d, n G3 z9 k9 d; B% H3 Z
*/
7 x+ j& U2 w; B& t: O
#include <linux/module.h>
. H& i/ z; i( W! a
#include <linux/init.h>
# d' \+ o( Q5 k/ v
#include <linux/errno.h>
; I5 \9 c, C7 w. Z) a8 _) C, {' U
#include <linux/types.h>
6 h ?# S# V: {
#include <linux/interrupt.h>
( G2 E/ [ X" x0 P4 [1 N
#include <linux/io.h>
- n$ {1 o' p0 c- G) N
#include <linux/sysctl.h>
& V' a, W3 y' R: |2 d6 X/ Z
#include <linux/mm.h>
7 N9 r0 D2 a# [. A( ^ u8 Q' [
#include <linux/delay.h>
! L2 D( t8 T6 t4 C
#include<linux/kernel.h>
6 ?& P# h" Y$ r. a9 T. C' e" N
#include<linux/fs.h>
, j% H# J, }) D2 ^
#include<linux/ioctl.h>
8 V& F1 F+ O6 l' w
#include<linux/cdev.h>
, N9 [/ K. U9 [
#include<linux/kdev_t.h>
3 y1 l7 x/ d' l7 n4 |
#include<linux/gpio.h>
7 Q6 a+ w, [7 @6 d
#include <mach/hardware.h>
1 o0 a) |; x# r6 d( u' G
#include <mach/irqs.h>
# a- }% j8 o% S
9 T+ I4 {' d- H% s
#include <asm/mach-types.h>
: X! W$ g+ b v+ N! a2 g
#include <asm/mach/arch.h>
2 F: T& Q; D/ R4 B# U4 @' H0 a6 ^# T
#include <mach/da8xx.h>
# s/ @7 [% l6 D8 h9 i7 e3 v8 K
#define SYSCFG_BASE 0x01c14000
/ y/ s$ c, r3 `8 K J
#define PINMUX1_OFFSET 0x124
2 }# t! |# |) @. v& Q
#define PINMUX18_OFFSET 0x168
& \* w: h% ~; Z7 @: P
#define PINMUX19_OFFSET 0x16c
* s0 ~3 j9 J* x
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
9 k* L6 x1 ?7 E& X: j( \
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
3 D7 V$ I \; {! I# O2 s$ t+ Q
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
: M4 D e, q3 b. l7 v" I: z. P
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
, M* W$ e# _1 Z
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
. ~3 m) S/ f% k+ V- {
3 P) e% c2 o- s% w* j4 a2 t
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
' M W& C% S% @- ~- i' y' L
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
. H: {8 b4 |" R
//PSC
$ U% U- Q( u+ i7 a8 g& f2 v' r* p) b
#define PTCMD_ADDR 0x01E27120
% F7 \8 @5 H& _& w+ n) P* m
#define MDCTL15_ADDR 0x01E27A3C
! m( E, q* D$ t, k) j" U" L
#define PDCTL1_ADDR 0x01E27304
% n2 Y( V5 ]3 m N! ?
//GPIO8 direction
$ ?+ P% x+ S! o' z3 J9 \
#define GPIO8_DIRECT 0x01E260B0
p0 ~& w5 L# I6 p8 l
#define GPIO8_OUT 0x01E260B4
/ w3 r) S* x$ r( a0 n
#define GPIO8_IN 0x01E260C0
8 ^8 g/ _% ? o! F* T" {; d
/ Z/ ^/ f+ y7 ~) Q/ d
//#define MCBSP1_RINT 99
9 [/ c9 M8 n# g1 h0 i; ]0 E0 ]
//#define MCBSP1_XINT 100
$ ^4 }* W* p0 l8 W' F
static int MCBSP_MAJOR=239;
7 M( v1 n4 \4 `/ `! @+ [$ e
static int MCBSP_MINOR=0;
7 [) _* c0 k0 c/ H4 l% ]+ Z
static int count =1;
4 w! e: c' c, @3 i% o( N R
' N, C) ]5 f9 b2 _5 a7 ^8 D! E8 L4 G
#define MCBSP_NAME "MCBSP-device"
! d6 ^7 G( n: a2 n/ c4 A
@/ T. ~# E8 m9 l8 y2 T' m! `
static struct cdev *mcbsp_cdev;
! M, J0 ]% m Y+ x2 C/ `
static struct class *mcbsp_class;
" s7 ~! c: I0 @" {6 R/ x
static dev_t mcbsp_dev;
" n& i# u6 N8 G& x
unsigned int DRR_data;
% q% ~' ]- z G/ O/ }+ d
unsigned int DXR_data;
0 \0 P: P Q- U# a4 o' K
static int mcbsp_open(struct inode *inode,struct file *file)
5 s# S! z6 d( W$ P
{
) {1 \' z$ g4 Q, i
+ D1 J! p9 h8 B7 r
//interrupt enable,initialized
3 f' n9 t E% k) b
unsigned int temp;
) v6 V1 j" q" O
//SLEEP_EN(GPIO8[10])---0
. R4 {" _7 `6 y! `3 X2 E" x2 a
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 @# z! {9 }% c/ X, V% `/ [
temp=temp&(~0x00000400);
2 ~- a) n- r5 K* N0 C8 T9 [
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
6 a! r1 U7 c0 h) ~6 x
//RESETn(GPIO8[8])----0----1
2 ^3 S j% }7 [& ?5 e2 h) B
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- T; Y9 `( p3 I% B5 u
temp=temp&(~0x00000100);
, [( ?1 d0 C$ g: Q- }& O2 F
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 `1 K5 s% x0 A" J% I/ Q2 I
udelay(100);
1 J* y! @. T$ s g
temp=temp| 0x00000100;
" T( c1 h1 Q- Y
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
$ L: P8 n7 W ?$ _1 J
udelay(100);
6 s% H4 j' [- D2 s( J, {6 E& R
printk("open success!\n");
9 E( R) k# b8 i3 f9 V9 \2 g) X! w
return 0;
( t h' Y: \& t7 ^9 I4 W
}
" J2 y: Z0 o4 w2 ]' C& q" W
% j7 U% o# z9 F6 L* E; I
static int mcbsp_release(struct inode *inode,struct file *file)
! d) s, ~& F4 ]; W
{
+ L h* a$ l/ _& v A
printk("release success!\n");
6 s* U! E2 z- b0 Q0 s
return 0;
m& c7 L1 F# k% s
}
9 X/ s# V8 R* i$ l: ]
; U4 E' }- n5 B# b' v8 G
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
. q- Y5 S& v% s- k: L) U2 O8 l
{
6 ?# ` ~ l( q, L( J
copy_from_user(&DXR_data,buf,len);
$ O* [ @; o3 l" k
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
* l8 R( l" ^; ?# Z. H* ?' h
return 0;
8 @: l: w2 a# a$ Q
$ Y# _2 f8 {* g
}
" h: t5 k$ W3 J3 i
; O! |8 E w0 i0 P9 c* \. K
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: S1 c: y# w6 ?( x3 l
{
6 y8 x/ f: A2 Z
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- q" \% y C) o' {$ t2 U
copy_to_user(buf,&DRR_data,len);
d. m. d/ v: _& |
return 0;
* |! h, Z) Y% f4 J3 c/ Y
}
! ]2 |( w+ G# s" p; n. u
$ ~# _6 H& h% B. ^( z: s
& w+ g; z& `# h# p, q
static struct file_operations mcbsp_fops=
5 A! ^' \$ |" A
{
- t1 k ~+ ?4 K' R3 s( Z
.owner=THIS_MODULE,
6 ` s/ O0 l0 i) ~0 K0 A6 B
.open=mcbsp_open,
P }3 n0 O2 a0 P4 ]
.release=mcbsp_release,
2 }4 g2 @# p, @" U! l9 B q
.write=mcbsp_write,
2 T3 B# s/ E- V2 f! J5 b
.read=mcbsp_read,
) X% C/ p3 {" s3 a
};
8 u6 x3 |) n G0 G" a( T
static int __init MCBSP_init(void)
$ q1 E+ f2 }, O( o. m
{
/ s3 l3 j/ O& o5 V1 d: i
int ret;
- [2 U: Z3 X2 b3 M7 j, i S
unsigned int PINMUX1_REG_old;
! U8 e4 e; [- ^2 L8 R, a2 X* l
unsigned int PINMUX18_REG_old;
9 Y7 E. s7 C& J" E
unsigned int PINMUX19_REG_old;
; E* Q0 r8 Z/ ?: z
unsigned int temp;
1 h+ K% Z! A) r2 k) F
if(MCBSP_MAJOR)
8 w1 P2 x7 i+ ]6 H8 f, A+ p
{
) z& e% j3 P6 }+ A2 M# N
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" g9 z+ E( ` _( w! p5 H
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
" x/ g& A6 G: C7 `4 L
}
' c9 W, Q' _- r7 P) L
else
, p/ E6 B5 ^: \& i0 a" U
{
1 U; y5 D* z/ W: X# K/ j
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
' N" X2 Z6 Z; {2 t2 [" G
MCBSP_MAJOR=MAJOR(mcbsp_dev);
2 s6 |7 z8 \3 N% A0 p
}
/ p) i3 \4 z( [
: l! ]0 o/ y- U
if(ret<0)
; H0 Q2 w5 o) s* q/ o8 c! f( K# i
{
) C9 `5 {# {& v9 |8 e4 B
printk(KERN_ERR "register chrdev fail!");
7 {+ M, X$ [/ X
return -1;
! \0 {4 A, e. {0 K
}
# ^; [% w$ G. s$ X8 w
1 j7 p& t1 F9 `4 F) w
mcbsp_cdev=cdev_alloc();
; j0 Q2 Y. R$ j0 b
$ c. ]- c; Y; ~0 o
if(mcbsp_cdev!=NULL)
' O, u# A3 j: }5 W% C$ C0 C
{
% T/ O+ m% H) p5 z; S. K1 _: @) D
cdev_init(mcbsp_cdev,&mcbsp_fops);
; v" V. ], C/ y B9 u3 W
mcbsp_cdev->ops=&mcbsp_fops;
+ }! a2 f& G. x* p& a
mcbsp_cdev->owner=THIS_MODULE;
1 U3 w; x% B4 M0 K- ^5 U
7 {/ R. E5 E- |1 M" f, L
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
* W9 ~; }3 a% p1 u$ [, F
printk(KERN_ERR "register cdev fail!");
* b- s$ H8 K* W ]
else
- O+ p" T; V1 O: p. b$ Z
printk(KERN_ERR "register success!\n");
' L/ s2 {8 M1 t0 T( k2 g0 p3 K0 r
}
# H/ ^( @1 [* g7 n: V
else
5 b; G' |, ?! r+ x
{
7 X' ~( j$ s& w5 z
printk(KERN_ERR "register cdev err!");
4 k3 x/ ?7 G$ q4 O
return -1;
^' l0 I! R7 N+ m5 u5 L+ v& ^
}
8 V) P% j9 b0 b- }. {. X s
( t2 P- d6 ?" \/ }# V& l% g: `% ^
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
) h$ B6 F7 C; w6 _2 d$ B& P: H0 c1 E
if(IS_ERR(mcbsp_class))
8 p, U& k1 `- I% F2 Z
{
0 c; N% I0 [, P, v
printk(KERN_ERR "register class err!");
( b: S0 m# E- a, D3 _
return -1;
0 l# T' m. a6 }$ v- @5 ^( N
}
3 \+ c$ G% b2 x5 Y8 g$ V$ N+ l$ d
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, Y3 T7 B# ?, i
" ^! {, ]/ \9 k8 r
//PSC
' I: s; @/ B3 i
//add Enable MCBSP
1 T0 h5 c& z, n* y- g/ A. k# K$ C
//test
2 _& X& x7 @) e' l( D
temp = 0x80000003;
! ^/ e3 E+ X. k! Q
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
k. M' |5 B6 x; U5 {! m4 K2 H! I
temp = 0x00000003;
% y* f+ b$ Q+ a, ^% r# N
writel(temp, IO_ADDRESS(PTCMD_ADDR));
. E6 r/ h8 ]" l5 f$ Q
1 T0 I' \% L! \$ H( W* k
temp = 0x001FF201;
; o: _# y0 D- Q3 j$ W K2 l
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ u3 p+ C0 J" S1 r: m% D9 [
' H& k' m0 x7 X% a& t, @* Y1 j
//PINMUX
d }; e2 E3 U D3 R2 ?7 X5 F5 p
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
, y( n+ W" U, m3 E f' m( u3 r( ~
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ @! |* j+ p# V& b; K b+ V9 [& }
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
: T! U; q8 N7 j1 J6 i' @) h) ^& ~
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( h/ i$ W0 b% b+ H, T( u2 s4 m8 k& _0 Q
: |6 @. _6 x$ U8 W
//SLEEP_EN,EPR,L138_SHK1,L138_RC
& l. W- B- @3 o( a5 ~3 I& B
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% K6 n8 |/ I) L& R* p: s# t
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
+ K, ]: w* i4 o) b0 U9 H
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& u# C: N/ ~, @1 P2 }1 e
+ h" k4 X) F* z; \( P
//RESETn,L138_SHK2
% S: `% u. e8 @& b% j a% Z( N
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
# Q6 B( Z; _' a" ?8 i, E. C
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
' Z+ q& Z8 I5 v$ P
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 Z6 r- @. ~2 }' O& W
, `+ G" a4 ?3 k2 |) P; |! z
& x$ _( {9 Y4 u6 V3 m0 ?. p+ W
//SPCR Register
9 d; z4 B0 }6 S7 w; a0 E* P3 D) T' K0 [
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 K( W# `6 x* M2 K% q
temp = 0x03000000;//(DLB=0)
5 E- p' W7 c) E, u. Z
// temp = 0x03008000;//(DLB=1)
0 O+ x6 Z& N j8 ^/ _
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
* f4 V) q; }$ q0 A7 W" C
temp = readl(IO_ADDRESS(SPCR_ADDR));
( }- b. j" p) P0 F% D& r
printk("temp=%x\n",temp);
1 u6 ^6 a: P1 V5 m- S3 T
$ t! P8 ^ a3 g% M5 |* V; t
//PCR Register
+ t9 i! t8 d* ?4 h1 Z$ K# h
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( P' X) _$ @1 C" M6 m* ~5 t- o& ?( V
// temp = 0x00000F0F;
8 Y8 r4 a; p2 q% }0 H
temp = 0x00000B0F;
4 g3 J' G! i2 P! U/ v s! |
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
4 }/ y. B% L% ?' ~4 `- f2 G
temp = readl(IO_ADDRESS(PCR_ADDR));
8 z1 H0 _! p+ d" L9 L0 Z
printk("temp=%x\n",temp);
8 R: ~0 U' T3 Q3 {
//SRGR Register
% N$ N/ P7 ?& M: |
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
7 t: [8 R2 ^1 y3 P! v$ U
//temp = 0x301F000B;
# x: y5 M- G- K- j% V% N; R* l( g
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
7 ]( A- ~. g5 ]6 L e& a
temp = readl(IO_ADDRESS(SRGR_ADDR));
1 a6 d) k4 E* h/ h& g3 ~! ~9 Q; Q
printk("temp=%x\n",temp);
' N9 v$ B. U" J$ ?/ ~
//RCR
- v1 A! a3 o, L" ]
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
! j! P4 R- R; w
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; A! x/ d" Z2 I1 k
temp = 0x00440040;
5 D* [( ~ }+ D6 g9 H6 n
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
) S4 ?$ j( _8 |+ U" }3 @3 Y
temp = readl(IO_ADDRESS(RCR_ADDR));
7 l0 d+ ~# S1 l
printk("temp=%x\n",temp);
+ F- }6 y9 j' j( e* w u: b% Q
//XCR
& g/ w: b+ X% V) d: [3 k5 j* w3 T
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
3 M& J) `1 p) x. B% ~
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
1 Q% J2 m- O) N
temp = 0x00440040;
$ O; o* X2 w8 [# v ]
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
0 E6 {( k4 f. e/ c
temp = readl(IO_ADDRESS(XCR_ADDR));
$ b9 { s. a. I+ D# d$ u/ _4 {8 a
printk("temp=%x\n",temp);
, M/ P( V" X9 P# W2 }
udelay(100);
" j" y3 t2 c/ B% _4 f2 R
//SPCR Register
- n; u' l; Z9 j6 G* }9 p% h
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
3 G" x6 m! y% v
temp = 0x03C10001; //DLB = 0 VS DLB = 1
' E8 ]. l. L( Z: J
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
7 \& c' I) O( V
temp = readl(IO_ADDRESS(SPCR_ADDR));
M$ I" B' t ?( H; S
printk("temp=%x\n",temp);
( [/ t7 W- V# Z- U, z
udelay(100);
9 K5 U, v; u, l Z
5 q8 h9 a" v7 g7 D- M1 |. Q, Z
//set GPIO direction
+ \) E- K' L3 N
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
1 f! T) Y; B; M- a
temp = temp | 0x00000100;//EPR----input
9 g' A$ M& p( E
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
* |' w1 A3 t w" C2 ?
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 F/ F4 v* G" g! ` R7 X
4 Y/ M+ E3 Y+ J$ a0 R" F* q. t. n
return 0;
$ |8 P8 P, L7 J, @' u( x2 }
}
: Y3 s4 p3 L; n: f# d+ n
static void __exit MCBSP_exit(void)
# y, a3 J0 A' M$ O0 i
{
8 U# U2 K$ q) X0 u" S8 f _
printk("mcbsp chrdev exit!\n");
2 P% ~0 C) l) n9 |% a% e7 F
cdev_del(mcbsp_cdev);
) T9 i/ W2 h: c" v( S K; C
unregister_chrdev_region(mcbsp_dev,count);
! D1 h6 S+ U% B# z
device_destroy(mcbsp_class,mcbsp_dev);
" F$ Y# Q( O; a1 M9 Q4 {
class_destroy(mcbsp_class);
6 x& y0 H$ ~+ t- X! H
}
$ w& y1 S( C" {% L4 A6 N# k
module_init(MCBSP_init);
1 {5 I" j! s- E. U9 o, e' a0 N0 n" b
module_exit(MCBSP_exit);
5 z; P" X. `5 f2 v e
6 t3 c: `5 w5 O$ ~
MODULE_LICENSE("GPL");
& Y& e. s d# K. V' M
, z- w; k. C9 D8 f) ?( U4 g
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
- s F7 W0 @$ `0 ]
我的应用层的测试程序如下
( i9 E7 W/ H. v9 G. f: N
#include <stdio.h>
% j# T) X. q Y# A# h6 S e: O
#include <string.h>
$ ]- b0 U, X: D+ D+ S
#include <fcntl.h>
2 m( j; F" z# Q$ M: o; O9 w
#include <unistd.h>
& x* Z3 u1 @6 g9 C3 B
#include <signal.h>
2 r4 |/ ]& f4 I) e% r' R
#include <pthread.h> //线程
; B7 P/ o% y8 F
#include <stdlib.h>
, ?9 S3 i6 u8 S1 @7 V) H! p% u. q
#include <pcap.h> //捕获网口数据
5 \; V" T( M% v6 n0 k
#include <semaphore.h> //信号
3 w: z4 Y- A: Z* M2 {/ O' e. ]+ p
#include <sys/types.h> //消息对列
1 L3 u: b" R' d; `
#include <sys/ipc.h> //消息队列
0 J+ T/ l# t, H) u
#include <sys/msg.h> //消息队列
* J1 i& Z" W( h+ L& E' R. m
#include <sys/select.h>
$ K' y9 [% w9 }2 r# l3 e; B
#include <sys/syscall.h>
9 g1 Y3 J ^: n8 ` `3 u
#include <sys/stat.h>
/ X( I9 Q8 I2 j9 [/ K$ F* }' f1 w
#include <sys/mman.h>
9 \( Q, \1 q( o% |8 N/ q
#define msleep(x) usleep(1000*x)
2 T5 _) c- |5 a" a6 x
E) ?5 ]4 O+ ~( V) X
int main()
" Z! p' ~3 R) d7 I. x$ l
{
+ T6 c8 i- Z, i8 T3 Z7 F
//MCBSP,ARM与AMBE2000交互设备
m$ d+ ?/ _& H! l2 c% G9 M- R5 d
int fd;
. d% h$ D; Z+ e# x3 Q( u; O, [0 N
unsigned short data_write = 0x5555;
8 W# x! h: S' L: c7 f/ O- l% ~
unsigned short data_read = 0x00;
; n* l3 W* s1 t. I% a% }* ^1 ?
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 v0 r; R3 [3 J
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
( c& B) _ M6 ^$ Q
' j8 I' C$ N7 W+ K
if(fd < 0)
- J4 L9 S! E" W9 p/ U; o1 A9 @
{
. O4 j8 E, ^( d2 C9 N
perror("open failed\n");
; o" j0 C3 M1 i+ p( k0 N
return -1;
4 L; C' N/ _/ f' O( h: y; O
}
% a( u4 }2 t% s$ n5 R8 d2 D: s
$ v; v: I5 ], L/ X
while(1)
0 U* N& ?% {$ A- }) t9 h3 w
{
- k; t1 {8 D- A
0 _; B- ]$ Z+ F* s
//AMBE2000每次读写是24个字为一帧
) X2 h5 e$ ~0 Q0 p i0 m' E( {
//写数据时将数据在底层存储起来,等到中断的时候再发送
/ h7 g% e) P' B) \) j
//AMBE2000输入数据是以0x13EC开头的
2 i Q2 z6 p0 C+ H8 S B' L; R' P
write(fd,&data_write,sizeof(unsigned short));
, H3 z N- d+ P7 B. S
# W' f8 E% ]1 l1 ~& L* u
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
$ m, ?2 c6 l, U$ g- c' c2 ^0 j# H
read(fd,&data_read,sizeof(unsigned short));
, }% \$ F. O) o$ Q
1 N; m! O7 N0 ^: ~) g
if(data_read == 0x13Ec)
3 a% G; C6 m9 l8 S+ d
{
0 @+ S0 v+ [& `( O2 n
" x% V$ T, M( ?- E& l
printf("data_read = %x\n",data_read);
# g0 m# i. X/ C& c+ [2 t% }
}
! P. C- F$ |6 A! l
! h) o1 e; p' C0 q4 D# J; N1 ^; Z
msleep(10);
7 x/ i9 Y: }3 T! f7 ^
- g0 H$ s5 l2 @- b& S( p0 [2 q) q3 u
/*
; f9 z) P y6 e/ L- A" E
ioctl(fd,1);
) _1 ?. J, Y2 {9 s4 v8 @% N3 u
sleep(1);
* U& C+ H- M" K. \
ioctl(fd,0);
6 D c( g. {; S7 `. w4 O
sleep(1);
/ p, e3 O7 U9 x
*/
# K& \5 z4 Y! G) {9 s& t" W7 ^
}
. \7 B8 A# ^( u
return 0;
+ [# Z% n7 h b0 J& j
* k2 w" |% P* G E t
}
% B3 k/ D2 O% o
* y# i* `2 t( h) X
多谢各位指教,谢谢! 急
( ~2 n. Z) b6 ]0 E+ w7 P$ u/ T
- E2 k( n9 R; `% b
' B3 ^: L0 X) e) J
6 G" d. ?8 n. @# c" p
- W4 b I. Z( A
8 k8 @/ B& p; \% z1 C
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4