社区导航

 

搜索
查看: 4055|回复: 2

[求助] 新手,苦思很久了,就是解决不了关于CodeWarriorV6,.2中关于SCI串口调试的问题

[复制链接]

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2011-6-1 21:38 | 显示全部楼层 |阅读模式

正在学习在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命令显示的数据不是很正确,显示的位置也不是执行完输出语句就显示的,我是个新手,所以很多地方还不是很明白,哪位高手给点指点,这种做法是不是正确,该怎么做没有板子的情况下的程序调试呀,谢谢了


回复

使用道具 举报

763

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2011-6-2 23:25 | 显示全部楼层
模拟器这种东西不要太当真,我的经验和体会是不要用什么模拟器(如proteus)来学习单片机或嵌入式。这都是不靠谱的,还是买个板子来学吧。
现在各种开发板也很便宜了,hcs08系列是高度兼容的,可以这么说,随便买块hcs08的板子都可以作为学习的好工具
Nicrosystem专业提供freescale、TI和STM32高性价比开发板、解决方案
http://nicrosystem.taobao.com

回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-6-4 11:33 | 显示全部楼层

回复 楼主 laorenmen 的帖子

这是我曾经做过的一个产品里用485通讯的SCI驱动代码。献丑下,互相学习啊。

/*
*******************************************************************************
*                                                                                                                                                                                       
*   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
*******************************************************************************
*/

回复

使用道具 举报

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

关闭

站长推荐上一条 1/3 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-4-7 11:43 , Processed in 0.145163 second(s), 19 queries , Gzip On, MemCache On.

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