查看: 2067|回复: 0

[S12] MC9S12XDT256MAL的SCI串口无法接收到数据

[复制链接]

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
13
最后登录
2015-4-19
发表于 2015-4-19 17:24:16 | 显示全部楼层 |阅读模式
无论是使用查询式接收还是中断接收,SCI都接收不到数据,不知道为啥?求大神指点,程序如下:////////////////////////

main.c中的程序//////////////

////////////////////////////////
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "includes.h"
#include <mc9s12xdt256.h>

#pragma LINK_INFO DERIVATIVE"mc9s12xdt256"

unsigned char t,ch=0;
void main(void) {
  /* put your own code here */;
   PLL_INIT();
   SCI0_Init();
        EnableInterrupts;

  for(;;) {   
            t=SCI0_GetChar();  
    //_FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED

interrupt 20 void  SCI0_ISR(void)
{
  ch =SCI0_GetChar();

}
#pragma CODE_SEG DEFAULT  

//////////////////////////////////////
initial.c中的程序
//////////////////////////
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#include "includes.h"
ulong i=0;

void PLL_INIT(void)
{                                         // 总线时钟初始化
  CLKSEL=0X00;                            // 初始化PLL前先使用外部晶振
  PLLCTL_PLLON=1;                         // 开启PLL
                                          // 锁相环时钟=2*fosc*(1+SYNR)/(1+REFDV);设定锁相环时钟=80MHz;
  SYNR =0x04;                             // 锁相环时钟=2*16*(4+1)/(1+1)=80MHz;
  REFDV=0x01;     
  while(!(CRGFLG&0x08));                  // 等待PLL稳定
  CLKSEL_PLLSEL=1;                        // fBUS采用根据PLL频率设定;总线时钟=80/2=40MHz
  while(!CLKSEL_PLLSEL);
  COPCTL=0x00;                            // disabled watchdog
}

void SCI0_Init(void)
{
   SCI0BDH = 0x01;                      //波特率设置为9600
   SCI0BDL = 0x04;
   SCI0CR1 = 0x64;                      //设置串口和外部通信
   SCI0CR2 = 0x2C;                      //启用接收中断,SCI可以发送和接收数据
}
void IO_Initial(void) {
  DDRB=0xFF;
  PORTB=0x00;
}

void PWM_INIT(void)  
{
  PWME=0x00;             // Disable  PWM                  禁止              
  PWMPRCLK=0x11;         // 0001 0001 A=16M,B=16M        时钟预分频寄存器设置
  PWMSCLA=2;             // SA=A/2/2=4M                   时钟设置
  PWMSCLB=2;             // SB=B/2/2=4M                   时钟设置                     
  PWMCTL_CON01=1;        // 0、1通道 concatenation        控制寄存器设置
  PWMCTL_CON23=1;        // 2、3通道 concatenation        控制寄存器设置
  PWMCTL_CON45=1;        // 4、5通道 concatenation        控制寄存器设置
  PWMCTL_CON67=1;        // 6、7通道 concatenation        控制寄存器设置
  PWMCLK_PCLK1=0;        // PWM01-----A                   时钟源的选择
  PWMPOL_PPOL1=1;        // Duty=High Time                极性设置
  PWMCLK_PCLK3=0;        // PWM23-----B                   时钟源的选择
  PWMPOL_PPOL3=1;        // Duty=High Time                极性设置  
  PWMCLK_PCLK5=0;        // PWM45-----A                   时钟源的选择  
  PWMPOL_PPOL5=1;        // Duty=High Time                极性设置
  PWMCLK_PCLK7=0;        // PWM67-----B                   时钟源的选择  
  PWMPOL_PPOL7=1;        // Duty=High Time                极性设置
  PWMCAE_CAE1=0;         // Left-aligned                  对齐方式设置
  PWMCAE_CAE3=0;         // Left-aligned                  对齐方式设置  
  PWMCAE_CAE5=0;         // Left-aligned                  对齐方式设置
  PWMCAE_CAE7=0;         // Left-aligned                  对齐方式设置  
  PWMPER01=320;          // Frequency=A/320=50k           周期寄存器设置
  PWMDTY01=128;          // Duty cycle = 40%              占空比寄存器设置
  PWMPER23=320;          // Frequency=B/320=50k           周期寄存器设置
  PWMDTY23=128;          // Duty cycle = 40%              占空比寄存器设置
  PWMPER45=320;          // Frequency=A/320=50k           周期寄存器设置
  PWMDTY45=128;          // Duty cycle = 40%              占空比寄存器设置
  PWMPER67=320;          // Frequency=A/320=50k           周期寄存器设置
  PWMDTY67=128;          // Duty cycle = 40%              占空比寄存器设置
  //PWME_PWME1=1;            // Enable  PWM                 使能
  //PWME_PWME3=1;            // Enable  PWM                 使能
  //PWME_PWME5=1;            // Enable  PWM                 使能
  //PWME_PWME7=1;            // Enable  PWM                 使能
}

void MSCAN_Init(void) {                                            //MSCAN initialization
  MODRR_MODRR3=1;
  MODRR_MODRR2=0;                         //CAN4-Port M6-7
        CAN4CTL0_INITRQ=1;                                              //in MSCAN initialization mode (INITRQ=1)
        while(CAN4CTL1_INITAK!=1);                          //Wait for MSCAN initialization (INITAK=1)                                     
        CAN4CTL1=0x81;                                                        //MSCAN enabled
        CAN4BTR0=0b11000001;                                            //SJW=4, BPR=2
        CAN4BTR1=0b00111010;                                            //TSEG2=4, TSEG1=11
                                                                                                //fCAN=fOSC/BPR/(1+TSEG1+TSEG2)=16MHz/2/(1+11+4)=500Kbps
        CAN4IDAC=0x00;                                                        //filter mode setup
        CAN4IDAR0=0xFF;CAN4IDMR0=0xFF;
        CAN4IDAR1=0xFF;CAN4IDMR1=0xFF;
        CAN4IDAR2=0xFF;CAN4IDMR2=0xFF;
        CAN4IDAR3=0xFF;CAN4IDMR3=0xFF;
        CAN4IDAR4=0xFF;CAN4IDMR4=0xFF;
        CAN4IDAR5=0xFF;CAN4IDMR5=0xFF;
        CAN4IDAR6=0xFF;CAN4IDMR6=0xFF;
        CAN4IDAR7=0xFF;CAN4IDMR7=0xFF;                 //filter setup (disabled)
       
        CAN4CTL0_INITRQ=0;                                              //exit initialization mode
        while(CAN4CTL1_INITAK==1);                          //Wait for normal mode
        CAN4CTL0=0b00001000;                                            //MSCAN internal counter enabled
        while(!(CAN4CTL0&0x10));                                  //Wait for  Bus synchronization
        CAN4RIER_RXFIE=1;                                               //receiver interrupt enabled
        CAN4TIER=0x00;                                                  //transmit interrupt disabled
}

void PIT_INIT(void)       //定时中断初始化函数,10us定时中断设置
{
  PITMUX&=0xFE;           //16位Timer 0 对应 8 位MICRO Timer0寄存器
  PITCFLMT|=0x83;         //0x83=1(PITE)000 0011(PFLMT[1:0])ITE:使能 PITPFLMT强制加载8 位计数器值  
  PITMTLD0=3;             //设定 8-bit MICRO Timer0 寄存器,它每次从 3 降到 0,花费时间为 4*0.03125us=0.125us
  PITLD0=79;             //设定16位Timer 0,定时周期=(79+1)*0.125us=10us
  PITINTE|= 0x01;         //使能定时器 0 的time-out 中断
  PITFLT |= 0x01;         //强制加载Timer0   

  PWME_PWME3=1;           // Enable  PWM                 使能
  //for(i=1;i<1300;i++);
  PWME_PWME5=1;
  PITCE  |= 0x01;         //使能定时器 0,开始定时
}

//////////////////////////////////////
SCI程序
////////////////////////
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#include "includes.h"
#include <mc9s12xdt256.h>



void SCI0_SendChar(unsigned char c) {    //SCI0_SendChar('A'),SCI0_SendChar(0x0D) 发送字符
while(!(SCI0SR1&0x80));
SCI0DRL = c;

}


void SCI0_SendString(unsigned char *pt)            //SCI0_SendString("OK") 发送字符串
{     
while((*pt)!=0)                                    //判断字符串是否发送完毕
{
  SCI0_SendChar(*pt);
  pt++;
}
}


unsigned char SCI0_GetChar(void )
{                                                  //读字符
while(SCI0SR1_RDRF==0)
return SCI0DRL;


}

unsigned char dtoa(unsigned char num) {    //
   if(num>=10)
   num = 'A'+(num-10);
   else
   num = '0'+num;
   return num    ;
}

void SCI0_SendHex(unsigned char num){       //发送16进制数字
unsigned char nTmp;
nTmp = dtoa((num&0xF0)>>4);
SCI0_SendChar(nTmp);
nTmp =dtoa ((num&0x0F)) ;
SCI0_SendChar(nTmp);
}

void SCI0_SendPar(unsigned int number) {     //SCI0_SendPar(65424)或者用参数代替 发送数据
unsigned char a[7],j=0,time=0;
    a[6]=number%10;
    a[5]=number%100/10;  
    a[4]=number%1000/100;  
    a[3]=number%10000/1000;
    a[2]=number%100000/10000;
    a[1]=number%1000000/100000;
    a[0]=number/1000000;   
    if(number<10)
       time=1;  
      else if(number<100&&number>=10)  
       time=2;   
      else if(number>=100&&number<999)  
       time=3;
      else if (number>=1000&&number<9999)
       time=4;
      else if (number>=10000&&number<99999)
       time=5;
      else if (number>=100000&&number<999999)
       time=6;
      else
       time=7;

    for(j=0;j<time;j++)  
     {SCI0_SendChar(a[7-time+j]);}       //
}


void delay(word  xms) {
   word i,j;
   for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
}



可以发送数据,但是接收不到!!!!求大神指点


我知道答案 目前已有0人回答
回复

使用道具 举报

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

本版积分规则

关闭

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

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-22 10:50 , Processed in 0.083286 second(s), 21 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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