打印

关于串口的问题

[复制链接]
1739|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
王培1|  楼主 | 2007-12-10 21:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小生最近做个东东,用到FSL的串口,可怎么也发送不正确,可否看看,提个醒
1:串口初始化
void init_SCI(void) {
/* ### Init_SCI init code */
//Baud rate = BUSCLK / (16 x SBR12:SBR0)
  /* SCIBD: SBR12=0,SBR11=0,SBR10=0,SBR9=0,SBR8=0,SBR7=0,SBR6=0,SBR5=0,SBR4=1,SBR3=1,SBR2=0,SBR1=1,SBR0=0 */
  SCIBD = BUSCLK/16/SciBandRate; //设置波特率                                      
  /* SCIC1: LOOPS=0,SCISWAI=0,RSRC=0,M=0,WAKE=0,ILT=0,PE=0,PT=0 */
  SCIC1 = 0x00;                                      
  /* SCIC2: TIE=1,TCIE=0,RIE=1,ILIE=0,TE=0,RE=1,RWU=0,SBK=0 */
  SCIC2 = 0xa4;                                      
  /* SCIC3: R8=0,T8=0,TXDIR=1,TXINV=0,ORIE=0,NEIE=0,FEIE=0,PEIE=0 */
  //SCIC3 = 0x20;                                      
  /* SCIS2: BRK13=0,RAF=0 */
  //SCIS2 = 0x00;
}
2:接收的数据整理
void UartCheckData(void) {
unsigned char i;
if( !SystemFlag.Bits.Transmitting) {
  

if( SystemFlag.Bits.ReceiveOK == 1) {
  

for( i=0; i<8; i++) {
txBuff = rxBuff;
}

 //SCIC2_TIE = 1;
 SCIC2_TE = 1;
 SystemFlag.Bits.ReceiveOK=0;
 SystemFlag.Bits.Transmitting = 1;
}
}
}
3,发送中断
__interrupt 16 void SCITx_isr(void)
 {
     unsigned char temp;
     
     
    if( txPtr == putPtr) {
        SCIC2_TE = 0;
                SCIC2_RE = 1;
                txPtr = 0;
                putPtr = 0;
                SystemFlag.Bits.Transmitting = 0;
    } else{
     if( SCIC2_TIE ) {
     while(SCIS1_TDRE ==0) ;      /*等待发送缓冲区空 */
     temp = SCIS1;
      SCID = 0x55 ;//SCID = txBuff[txPtr++] ;
      ++txPtr;
        
     }
    }
 }
小生刚学FSL,多指教,谢谢

相关帖子

沙发
张明峰| | 2007-12-10 21:33 | 只看该作者

注意SCIC2_TIE

1)SCIC2_TIE 在初始化时必须设为0,不然会立即进入中断。当你把发送数据准备好后再SCIC2_TIE=1;
2)不要去搞SCIC2_TE,初始化设为1就行了;
3)没见你在操作putPtr

使用特权

评论回复
板凳
王培1|  楼主 | 2007-12-11 09:15 | 只看该作者

回教主,我改进了还是不行,

1:串口初始化
void init_SCI(void) {
/* ### Init_SCI init code */
//Baud rate = BUSCLK / (16 x SBR12:SBR0)
  /* SCIBD: SBR12=0,SBR11=0,SBR10=0,SBR9=0,SBR8=0,SBR7=0,SBR6=0,SBR5=0,SBR4=1,SBR3=1,SBR2=0,SBR1=1,SBR0=0 */
  SCIBD = BUSCLK/16/SciBandRate; //设置波特率                                      
  /* SCIC1: LOOPS=0,SCISWAI=0,RSRC=0,M=0,WAKE=0,ILT=0,PE=0,PT=0 */
  SCIC1 = 0x00;                                      
  /* SCIC2: TIE=0,TCIE=0,RIE=1,ILIE=0,TE=1,RE=1,RWU=0,SBK=0 */
  SCIC2 = 0x2c;                                      
  /* SCIC3: R8=0,T8=0,TXDIR=1,TXINV=0,ORIE=0,NEIE=0,FEIE=0,PEIE=0 */
  //SCIC3 = 0x20;                                      
  /* SCIS2: BRK13=0,RAF=0 */
  //SCIS2 = 0x00;
}
2:接收的数据整理
void UartCheckData(void) {
unsigned char i;
if( !SystemFlag.Bits.Transmitting) {
  

if( SystemFlag.Bits.ReceiveOK == 1) {
  

for( i=0; i<8; i++) {
txBuff = rxBuff;
}

 //
 SystemFlag.Bits.ReceiveOK=0;
 SystemFlag.Bits.Transmitting = 1;
 SCIC2_TIE = 1;

}
}
}
3:接收中断(之前没有写出来,怕太多,烦)
__interrupt 15 void SCIRx_isr(void)
{
  
        unsigned char temp;
        if( SCIS1_RDRF & SCIC2_RIE) {
        
    //消除帧错误标志    
        if( SCIS1_FE ){
         temp =SCIS1; 
         temp =SCID;
                      } 
                      
   while( SCIS1_RDRF ) {
    
      //
      temp = SCIS1;   //清除接收标志
      temp = SCID;
      
      
      if( !SystemFlag.Bits.Receiving ) {

          if( temp == 0x02 )
            {
                SystemFlag.Bits.Receiving = 1;
            

                putPtr = 0;
                rxBuff[putPtr++] = SCID;
            }
      
      } else {
      rxBuff[putPtr++] = SCID;
            
            if(putPtr>10)
                SystemFlag.Bits.Receiving = 0;
            
            else if( putPtr == rxBuff[1])
            {
                SystemFlag.Bits.Receiving = 0;
                SCIC2_RE = 0;
                SystemFlag.Bits.ReceiveOK=1;
            }
      
      
      }
      
      if( SCIS1_OR ) {
         temp =SCIS1; //消除溢出错误
         temp =SCID;
       }
        
        }
        }
 }
4:发送中断
__interrupt 16 void SCITx_isr(void)
 {
     unsigned char temp;
     
     
    if( txPtr == putPtr) {
        SCIC2_TIE = 0;
                SCIC2_RE = 1;
                txPtr = 0;
                putPtr = 0;
                SystemFlag.Bits.Transmitting = 0;
    } else{
     if( SCIC2_TIE ) {
     while(SCIS1_TDRE == 0) ;      /*等待发送缓冲区空 */
     temp = SCIS1;
      SCID = txBuff[txPtr++] ;
        
     }
    }
 }
5:我看手册中,下面几个标志不是太明白什么意思
1)NF躁声标志
2)RAF接收器激活标志
3)__interrupt 14 void SCIError_isr(void)
 {
     //PTD_PTD5=1;
 }
这个中断矢量做什么用的?

使用特权

评论回复
地板
张明峰| | 2007-12-11 14:37 | 只看该作者

改一下

2:接收的数据整理
void UartCheckData(void) {
unsigned char i;
if( !SystemFlag.Bits.Transmitting) {
  

if( SystemFlag.Bits.ReceiveOK == 1) {
  

for( i=0; i<8; i++) {
txBuff = rxBuff;
}

txPtr  = 0;
putPtr = 8;
//看你填入了8个字节

//
SystemFlag.Bits.ReceiveOK=0;
SystemFlag.Bits.Transmitting = 1;
SCIC2_TIE = 1;

}
}
}


4:发送中断
__interrupt 16 void SCITx_isr(void)
{
    unsigned char temp;
     
    temp = SCIS1;
    SCID = txBuff[txPtr++] ;
     
    if( txPtr == putPtr) {
        SCIC2_TIE = 0;
        SystemFlag.Bits.Transmitting = 0;
    }
}

interrupt 14为通讯错误响应中断

使用特权

评论回复
5
王培1|  楼主 | 2007-12-11 15:55 | 只看该作者

张教主厉害,小生实在佩服

程序好了,就是上面的问题.
1:上面的串口是用QG8做的,
2:发送02 08 xx xx xx xx xx xx (02协议头,08是帧长度),3:就返回你发的这串数据,当然这只是做应用的开始,可以根据你自己需要更改.
(有兴趣的朋友可以实验一下.9600,MCU 4M-->Fbus2M
)
3:对1)NF躁声标志
    2)RAF接收器激活标志,有什么用还不清楚
4:在定时器/脉宽调制器一章中,中心排列PWM模式和边沿排列PWM模式在应用上有什么不同吗,从手册看中心排列PWM模式的躁声小

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

142

帖子

0

粉丝