智能车制作

标题: MC9S12 SCI总线接口 学习 [打印本页]

作者: 蛋求无悔    时间: 2013-1-17 19:29
标题: MC9S12 SCI总线接口 学习
MC9S12DG128为例,该单片机包含了两个SCI模块。
从硬件的角度上或者从封装上看,SCI模块仅仅复用了PS口的4个引脚(0~3位)作为RXD0TXD0RXD1TXD1。当SCI接收/发送器被允许时,SCI将控制TXDRXD进入相应的操作。
一、寄存器的描述
1、SCI波特率寄存器:
   作用:用来设置SCI通信的速率(注意:不是频率)
   公式(计算波特率):SCI波特率=SCI模块时钟/16 * BR)
BR是SCI波特率寄存器中的内容,该寄存器中的内容可以从1~8191.
2、SCI控制寄存器1
3、SCI控制寄存器2
4、SCI状态寄存器1
5、SCI状态寄存器2
6、SCI数据寄存器
二、SCI应用举例
可采用简单易懂且便于实现的查询方式,也可以采用高效但较复杂的中断方式。
无论是查询方式,还是中断方式,实现串行通信的编程首先均需进行SCI的初始化,主要是完成波特率、收发数据格式、通信方式的设置。
下面程序的功能是向PC发送“HELLO”字符串。
PCCOM1/COM2 RS - 232标准端口可以与单片机的SCI模块相连,实现点对点的通信。由于单品阿基的SCI接口并非RS - 232标准,因而在单片机一侧必须接入电平转换器。具体程序如下:
#include <hidef.h>
#include<mc9s12dg128.h>
#include “crg.h”
void uart_init ( void )   //SCI的初始化
{
SCI0CR2 = 0X08;  //发送使能
SCI0BDH=0X00;   
SCI0BDL=0X9C;   //设置波特率为9600
}
void uart_putchar ( unsigned char ch )  //SCI发送子程序
{
While( ! ( SCI0SR1 & 0x40 ) )
{}
SCI0DRL = ch;
}
void main ( void )
{
uchar str[]={ ‘ H ’,’ E ’,’ L ’,’ L ’,’ O ’ } ;
uchar i = 0;
SET_PLL ( ) ;        //设置锁相环
EnableInterrupts ;     //使能中断
uart_init () ;      //SCI初始化
for ( ; i<5 ; i ++ )
{
uart_putchar ( str [ i ] ) ;    // 发送16进制数
}
for ( ; ; )  {}
}


作者: 老学童先生    时间: 2013-1-17 19:33
crg.h  这个头文件要自己写吗
作者: qurrer    时间: 2013-1-17 19:38

作者: liuyuliuyu1216    时间: 2013-1-17 20:41

作者: 蛋求无悔    时间: 2013-1-17 20:53
老学童先生 发表于 2013-1-17 19:33
crg.h  这个头文件要自己写吗

不好意思,我也是刚开始学这个芯片
不过,我觉得应该是自己写的,因为我看到在其他的程序中是不包括这个头文件的


作者: 王谦623    时间: 2013-1-18 19:31
我想咨询您一下,如果要发送高于8位的字节,比如是12位,应该如何发送?
作者: 蛋求无悔    时间: 2013-1-18 20:07
王谦623 发表于 2013-1-18 19:31
我想咨询您一下,如果要发送高于8位的字节,比如是12位,应该如何发送?

不好意思,我也是刚开始学习,不敢误导,请另请高明

作者: hbqyzpy    时间: 2013-1-19 09:01

作者: 846375642    时间: 2013-3-3 14:20
程序中没有定义SET_PLL()这个函数
作者: 蛋求无悔    时间: 2013-3-3 15:33
846375642 发表于 2013-3-3 14:20
程序中没有定义SET_PLL()这个函数

这里主要介绍的是SCI的通信,设置锁相环实际上在crg.h中,并没有直接显示在函数中
作者: D_catcher    时间: 2014-2-20 14:05





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