智能车制作

标题: 新手提问xs128SCI [打印本页]

作者: 山孩子    时间: 2010-1-14 13:31
标题: 新手提问xs128SCI
/*=========================================================
        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;                                //为清除标志位,读状态寄存器【下次写入后完全清除】
                    这句话是读取状态寄存器,不太清楚是怎么清除标志位的
作者: 极意旋风    时间: 2010-1-15 13:38
[b]公式是[b]BaudRate= BusClock  /(SCI0BDL *16 )
    所以
               SCI0BDL = ( byte ) ( BusClock / BaudRate / 16 )
作者: 极意旋风    时间: 2010-1-15 13:45
ReadStatus1        = SCI0SR1;            是为了为清除标志位,采用的方法是读状态寄存器,就可以清零该 状态寄存器的所有状态标记位;程序中在收和发完1byte数据后必须清除标记为才能进行下次的收和发
作者: f43    时间: 2010-2-12 07:12
顺便看看啊
作者: liuxianghua    时间: 2010-3-16 23:28
看看
作者: shawn0926    时间: 2010-4-8 22:24

作者: i852774842    时间: 2010-4-9 20:48
明白了 哈哈
作者: zou317    时间: 2010-4-15 23:00

作者: swfc_qinmm    时间: 2010-7-2 21:28
学习了……
作者: SC电磁    时间: 2012-4-6 22:35
是8M还是80M啊??
作者: 大同农村人    时间: 2012-5-4 14:53
极意旋风 发表于 2010-1-15 13:45
ReadStatus1        = SCI0SR1;            是为了为清除标志位,采用的方法是读状态寄存器,就可以清零该  ...

高手
作者: ㄟDemo''    时间: 2012-12-7 19:46
SCI在智能车中主要作用是什么




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2