在线时间1 小时
UID3115181
注册时间2015-4-9
NXP金币0
该用户从未签到
新手上路

- 积分
- 13
- 最后登录
- 2015-4-19
|
无论是使用查询式接收还是中断接收,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--);
}
可以发送数据,但是接收不到!!!!求大神指点
|
|