智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5596|回复: 11
打印 上一主题 下一主题

新手提问xs128SCI

[复制链接]

28

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
865
威望
393
贡献
348
兑换币
0
注册时间
2010-1-2
在线时间
62 小时
跳转到指定楼层
1#
发表于 2010-1-14 13:31:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*=========================================================
        ProjectName:        SCI_TEST_V
        Description:        A SCI TEST PROGRAM for 9S12XS128,CW4.7
        Author     :        lucev       
        Date           :        2009.2.15
        Notes           :       
==========================================================*/


#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"



/*=========================================================
        MACRO  DEFINE ( FirstSndThd )
==========================================================*/

#define BusClock        80000000                                //8MHz
#define        BaudRate        9600                                //SCI baud rate (hz)




/*=========================================================
        GLOBAL        VIRIABLE DEFINE ( FirstSndThd )
==========================================================*/






/*=========================================================
        FUNCTION DECLARE ( Module_Func_ADDITION() ) ( GE = general )
==========================================================*/

void        GE_Delay( unsigned int x );                //延时控制

void        SCI_Init( void );                                //SCI初始化函数,波特率根据宏定义
void        SCI_Tx( byte TxData );                        //SCI发送数据函数
//byte        SCI_Rx( void );                                        //SCI接收数据函数
interrupt        void        SCI_Rx_IRS( void );        //SCI接收中断处理【回显】函数





/*==========================================================
        FUNCTION DEFINE
===========================================================*/

void main(void)
{
        DisableInterrupts;
       
        SCI_Init();
       
        EnableInterrupts;
       
        for( ; ; )
        {
//                SCI_Tx( 'a' );
//                GE_Delay( 50 );               
        }

}


void        GE_Delay( unsigned int x )
{
        unsigned int i,j;
        for( i=0;i<=x;i++ )
                for( j=0;j<=10000;j++ )
                        ;
}

void        SCI_Init( void )
{
        SCI0BDL        = ( byte ) ( BusClock / BaudRate / 16 ); //必须/16,不能写出后两项相乘
        SCI0CR1        = 0x00;                                                //8位数据位,1位停止位,无校验
        SCI0CR2        = 0x2C;                                                //接收中断使能,使能发送与接收       
}

void        SCI_Tx( byte TxData )
{
        unsigned char        ReadStatus1;
       
//        ReadStatus1        = SCI0SR1;                                //为清除标志位,读状态寄存器【下次写入后完全清除】
        SCI0DRH        = 0;
        SCI0DRL        = TxData;                                        //将待发数据写入寄存器
        while( !SCI0SR1_TDRE );                                //等待发送结束
        ReadStatus1        = SCI0SR1;                                //为清除标志位,读状态寄存器【下次写入后完全清除】
}

/*
byte        SCI_Rx( void );
*/


//不能有返回值
interrupt 20 void SCI_Rx_IRS( void )
{
        byte        ReadStatus1 , RxData;
       
        DisableInterrupts;
       
        ReadStatus1        = SCI0SR1;
        RxData        = ( byte ) SCI0DRL;
        SCI_Tx( RxData );
               
        EnableInterrupts;
}
不明白的地方是:1.        SCI0BDL        = ( byte ) ( BusClock / BaudRate / 16 ); //必须/16,不能写出后两项相乘
                   不太明白要强制转化为byte类型
                 2.        ReadStatus1        = SCI0SR1;                                //为清除标志位,读状态寄存器【下次写入后完全清除】
                    这句话是读取状态寄存器,不太清楚是怎么清除标志位的

10

主题

208

帖子

0

精华

常驻嘉宾

新手

Rank: 8Rank: 8

积分
3455

论坛元老奖章

QQ
威望
644
贡献
2693
兑换币
0
注册时间
2009-12-18
在线时间
59 小时
2#
发表于 2010-1-15 13:38:27 | 只看该作者
[b]公式是[b]BaudRate= BusClock  /(SCI0BDL *16 )
    所以
               SCI0BDL = ( byte ) ( BusClock / BaudRate / 16 )
回复 支持 反对

使用道具 举报

10

主题

208

帖子

0

精华

常驻嘉宾

新手

Rank: 8Rank: 8

积分
3455

论坛元老奖章

QQ
威望
644
贡献
2693
兑换币
0
注册时间
2009-12-18
在线时间
59 小时
3#
发表于 2010-1-15 13:45:42 | 只看该作者
ReadStatus1        = SCI0SR1;            是为了为清除标志位,采用的方法是读状态寄存器,就可以清零该 状态寄存器的所有状态标记位;程序中在收和发完1byte数据后必须清除标记为才能进行下次的收和发
回复 支持 反对

使用道具 举报

1

主题

167

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2829
威望
1486
贡献
669
兑换币
147
注册时间
2009-8-14
在线时间
337 小时
4#
发表于 2010-2-12 07:12:20 | 只看该作者
顺便看看啊
回复 支持 反对

使用道具 举报

1

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
QQ
威望
255
贡献
31
兑换币
0
注册时间
2010-3-15
在线时间
7 小时
5#
发表于 2010-3-16 23:28:48 | 只看该作者
看看
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
威望
179
贡献
31
兑换币
0
注册时间
2010-4-8
在线时间
0 小时
6#
发表于 2010-4-8 22:24:00 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
威望
201
贡献
49
兑换币
12
注册时间
2010-4-9
在线时间
3 小时
7#
发表于 2010-4-9 20:48:05 | 只看该作者
明白了 哈哈
回复 支持 反对

使用道具 举报

1

主题

127

帖子

0

精华

高级会员

Rank: 4

积分
607
威望
424
贡献
117
兑换币
0
注册时间
2010-3-6
在线时间
33 小时
8#
发表于 2010-4-15 23:00:05 | 只看该作者
回复 支持 反对

使用道具 举报

8

主题

90

帖子

0

精华

高级会员

Rank: 4

积分
802
威望
455
贡献
185
兑换币
85
注册时间
2010-5-11
在线时间
81 小时
9#
发表于 2010-7-2 21:28:24 | 只看该作者
学习了……
回复 支持 反对

使用道具 举报

16

主题

69

帖子

0

精华

高级会员

Rank: 4

积分
732
威望
452
贡献
164
兑换币
33
注册时间
2012-3-26
在线时间
58 小时
10#
发表于 2012-4-6 22:35:34 | 只看该作者
是8M还是80M啊??
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-6 05:05 , Processed in 0.338101 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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