正在学习在mc9s08dz32的板子上移植操作系统。现在是能跑起来了,身边没有板子,想要利用SCI进行串口的模拟调试,在CODEWARRIORV6.2的版本中好像不再支持HCS08了,于是自己写了SCI的驱动,代码如下:
void TERMIO_Init(void)
{
/* SCI1C1: LOOPS=0,SCISWAI=0,RSRC=0,M=0,WAKE=0,ILT=0,PE=0,PT=0 */
SCI1C1=0x00; /* Configure the SCI */
/* SCI1C3: R8=0,T8=0,TXDIR=0,TXINV=0,ORIE=0,NEIE=0,FEIE=0,PEIE=0 */
SCI1C3=0x00; /* Disable error interrupts */
/* SCI1S2: LBKDIF=0,RXEDGIF=0,??=0,RXINV=0,RWUID=0,BRK13=0,LBKDE=0,RAF=0 */
SCI1S2=0x00;
/* SCI1C2: TIE=0,TCIE=0,RIE=0,ILIE=0,TE=0,RE=0,RWU=0,SBK=0 */
SCI1C2=0x00; /* Disable all interrupts */
SCI1BDH = 0x00; /* Set high divisor register (enable device) */
SCI1BDL = 0x4E; /* Set low divisor register (enable device) */
SCI1C2_TE = 0x01; /* Enable transmitter */
SCI1C2_RE = 0x01; /* Enable receiver */
}
byte TERMIO_GetChar(byte *Chr)
{
byte Result = ERR_OK; /* Return error code */
byte StatReg = SCI1S1; /* Read status register */
if (StatReg & (SCI1S1_OR_MASK|SCI1S1_NF_MASK|SCI1S1_FE_MASK|SCI1S1_PF_MASK)) { /* Is any error set? */
Result = ERR_COMMON; /* If yes then set common error value */
} else if (!(StatReg & SCI1S1_RDRF_MASK)) { /* Is the reciver empty and no error is set? */
return ERR_RXEMPTY; /* If yes then error */
} else { /* Intentionally left empty due to compatibility with MISRA rule 60*/
}
*Chr = SCI1D; /* Read data from the receiver */
return Result; /* Return error code */
}
byte TERMIO_PutChar(byte Chr)
{
if (!SCI1S1_TDRE) { /* Is the transmitter empty? */
return ERR_TXFULL; /* If no then error */
}
SCI1D = (byte)Chr; /* Store char to the transmitter register */
return ERR_OK; /* OK */
}
可是在程序的调用中,借助SCDO命令显示的数据不是很正确,显示的位置也不是执行完输出语句就显示的,我是个新手,所以很多地方还不是很明白,哪位高手给点指点,这种做法是不是正确,该怎么做没有板子的情况下的程序调试呀,谢谢了
此帖出自
小平头技术问答
/*
*******************************************************************************
*
* Copyright (c) 2008
*
*******************************************************************************
*
* 文件名: sci.h
*
* 应 用:
*
* 描 述:
*
*
* 编 程: YXF
*
* 日 期: 2008-08-12
*
* 版 本: 1.0.0
*
*******************************************************************************
*
* 编译器: CodeWarrior IDE version 5.9.0.2404
*
* Metrowerks ANSI-C/C++ Compiler V-5.0.14.7285
*
* 控制器: MC9S08AW16CFGE
*
*******************************************************************************
*
* 记 录:
*
*
*
*
*
*
*
*******************************************************************************
*/
#ifndef _SCI_H_
#define _SCI_H_
/*
*******************************************************************************
* SCI0定义
*******************************************************************************
*/
#define SCI1_BAUD 9600
#define SCI1_BR BUSCLK/16/SCI1_BAUD
/*
*******************************************************************************
* SCI1定义
*******************************************************************************
*/
#define SCI2_BAUD 9600
#define SCI2_BR BUSCLK/16/SCI2_BAUD
#define RS485_RD PTCD_PTCD4
#define SET 1
#define CLR 0
/*
*******************************************************************************
* 函数原型
*******************************************************************************
*/
void InitSC2(void);
void SCI2Transmit(U08 *data, U08 length);
#endif
/*
*******************************************************************************
* END
*******************************************************************************
*/
/*
*******************************************************************************
*
* Copyright (c) 2008
*
*******************************************************************************
*
* 文件名: sci.c
*
* 应 用:
*
* 描 述:
*
*
* 编 程: YXF
*
* 日 期: 2008-12-04
*
* 版 本: 1.0.0
*
*******************************************************************************
*
* 编译器: CodeWarrior IDE version 5.9.0.2404
*
* Metrowerks ANSI-C/C++ Compiler V-5.0.14.7285
*
* 控制器: MC9S08AW16CFGE
*
*******************************************************************************
*
* 记 录:
*
*
*
*
*
*
*
*******************************************************************************
*/
/*
*******************************************************************************
* 包含头文件
*******************************************************************************
*/
#include "main.h"
#include "sci.h"
/*
*******************************************************************************
* 函 数 名 : void InitSC2(void)
* 功 能 : SCI2初始化
* 描 述 : N/A
* 入口参数 : N/A
* 返 回 值 : N/A
* 设 计 : YXF
* 日 期 : 2008-12-04
* 修 改 :
*******************************************************************************
*/
void InitSC2(void)
{
SCI2BD = SCI2_BR; // 设置波特率
SCI2C1 = 0x00; // 开始位+8位数据位+停止位,无奇偶校验
// 允许发送和接收,接收中断使能
SCI2C2 = (SCI2C2_RIE_MASK | SCI2C2_TE_MASK | SCI2C2_RE_MASK);
}
/*
*******************************************************************************
* 函 数 名 : void SCI2Transmit(U08 *data, U08 length)
* 功 能 : SCI2发送函数
* 描 述 : N/A
* 入口参数 : U08 *data, 数据地址指针
* : U08 length,数据长度(字节)
* 返 回 值 : N/A
* 设 计 : YXF
* 日 期 : 2008-12-04
* 修 改 :
*******************************************************************************
*/
void SCI2Transmit(U08 *data, U08 length)
{
VU08 c;
RS485_RD = SET;
for(; length>0; length--)
{
while(SCI2S1_TDRE != 1); // 等待发送数据寄存器清空
c = SCI2S1;
SCI2D = *(data++);
c = SCI2D;
}
while(SCI2S1_TC != 1); // 等待发送器空闲
RS485_RD = CLR;
}
/*
*******************************************************************************
* 函 数 名 : void interrupt SC2RecIsr(void)
* 功 能 : SCI2接收中断服务函数
* 描 述 : N/A
* 入口参数 : N/A
* 返 回 值 : N/A
* 设 计 : YXF
* 日 期 : 2008-12-08
* 修 改 :
*******************************************************************************
*/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt SC2RecIsr(void)
{
VU08 c;
c = SCI2S1;
c = SCI2D;
DataProcess(c);
}
/*
*******************************************************************************
* END
*******************************************************************************
*/
一周热门 更多>