MC9S12XDP512串口使用笔记(中断方式)

1.      相关寄存器:

1.      SCIBDH,SCIBDL:波特率寄存器(SCIBDH只有低5位有效)

波特率 = 总线频率 / (16 * SBR[12:0])

2.      SCICR2: SCI控制寄存器2

位数

7

6

5

4

3

2

1

0

含义

TIE

TCIE

RIE

ILIE

TE

RE

RWU

SBK

复位值

0

0

0

0

0

0

0

0

 

TIE: 发送中断使能位。使能发送数据寄存器空标志(TDRE)来产生中断申请

              TCIE: 发送完成中断使能位。使能发送完成标志(TC)来产生中断申请

              RIE: 接收器满中断使能位

              TE: 发送器使能位

              RE: 接收器使能位

3.      SCISR1: SCI状态寄存器1

位数

7

6

5

4

3

2

1

0

含义

TDRE

TC

RDRF

IDLE

OR

NF

FE

PF

复位值

1

1

0

0

0

0

0

0

      

       TDRE: 发送数据寄存器空标志

       TC: 发送完成标志

       RDRF: 接收数据寄存器满标志

4.      SCIDRL,(SCIDRH): SCI数据寄存器

2.寄存器使用注意事项:

1.  TDRE(TC)复位值为1,因此将SCICR2的TIE(TCIE)置为1即可产生中断

2.  TDRE,TC的清除方法:读SCISR1,然后写SCIDRL,注意,发送完最后一个字节之后,会产生中断,但因为这是最后一个字节,故不会写SCIDRL,中断标志仍然存在

3.    RDRF的清除方法:读SCISR1,然后读SCIDRL。

3.示例函数;

   说明:

1. 发送和接收都采用中断方式,以帧为基本处理单元,当接收到一帧完整数据时,置位接收标志,主程序不断查询接收标志,若接收标志置位,则调用接收处理函数解析接收到的帧。

2. 通信协议基本形式:帧头(1字节) +通信头(1字节) +通信数据长度(1字节) +通信数据+校验字(1字节)

通信头: 表示通信的内容

通信数据长度 = 通信数据长度 + 校验字长度

[c-sharp]  view plain copy
  1. // ============================================================================  
  2. // SCI初始化程序  
  3. // 注:总线时钟为40MHZ  
  4. // baudrate = 153600,即9600bytes/s 使能接收中断(实际:156250bps)  
  5. // ============================================================================  
  6. void SCI_Init(void)  
  7. {    
  8.   // SCI1  
  9.   SCI1BDH = 0X00;       // baud rate = bus clock / (16*SBR[12:0])  波特率153600,SBR[12:0]= 16 = 0X0F;  
  10.   SCI1BDL = 0X0F;  
  11.  SCI1CR2 = 0x2C;        // 接收使能,接收器满中断使能,发送使能  
  12. }  
  13. // ============================================================================  
  14. // 发送数据请求函数  
  15. // 如果没有数据正在发送,则立即发送,如果有数据正在发送,则置位发送请求标志位  
  16. // 主流程不断查询发送请求标志位,若有该标志位,且没有数据正在发送则发送  
  17. // ============================================================================  
  18. void Send(byte commd)  
  19. {  
  20.   SCI_Commd=commd;  
  21.   if(Status.Bits.Uart_R_Over==0)    // 发送完成  
  22.   {  
  23.     Send_1();  
  24.   }  
  25.   else   
  26.   {  
  27.     Status.Bits.Uart_T_Commd=1;   // 置位发送请求标志  
  28.   }  
  29. }  
  30. // ============================================================================  
  31. // 发送函数  
  32. // Pre_Send():发送预处理函数,根据通信头(commd)内容处理发送缓冲区  
  33. // ============================================================================void Send_1(void)  
  34. {  
  35.   Pre_Send();  
  36.   Status.Bits.Uart_R_Over = 1;    // 置位正在发送标志  
  37.   SCI1CR2 |= 0x40;                // 使能中断  
  38. }// ============================================================================  
  39. // 串口中断程序  
  40. // 中断接收和中断发送  
  41. // ============================================================================  
  42. interrupt void SCI1_INT(void)  
  43. {  
  44.   static byte R_num = 0, R_curr = 0;  // 接收数据总数和当前指针  
  45.   static byte T_num = 0, T_curr = 0;  // 发送数据总数和当前指针  
  46.     
  47.      
  48.   if(SCI1SR1_RDRF == 1)    // 接收中断   
  49.   {    
  50.     Uart_R_Str[R_curr] = SCI1DRL;  
  51.     R_curr++;  
  52.     // 判断是否为帧头  
  53.     if(R_curr == 1)  
  54.     {  
  55.       // 若不为帧头,复位指针  
  56.       if(Uart_R_Str[0] != Frame_Header)    
  57.       {  
  58.         R_curr = 0;  
  59.         R_num = 0;  
  60.       }  
  61.     }  
  62.     if(R_curr == 3)             // 第二字节,通信帧长度  
  63.       R_num = Uart_R_Str[2]+1;  // Uart_R_Str[1] 为通信帧长度  
  64.     
  65.     // 每接收一个数据,num减1,当num为0时,一帧数据接收完毕  
  66.     if(R_num != 0)  
  67.     {   
  68.       R_num--;  
  69.      
  70.       if(R_num == 0)  
  71.       {  
  72.         R_curr = 0;                   // 当前存储位置指向Uart_R_Str[0]      
  73.         Status.Bits.Uart_Status = 1;  // 置Uart接收完一帧数据标志位  
  74.       }  
  75.     }  
  76.   }  
  77.    
  78.  // 发送中断  
  79.  else if(SCI1SR1_TC == 1)  // 发送完成标志  
  80.  {  
  81.     // 最后一个字节发送完成  
  82.     if(T_curr == Uart_T_Str[2]+3)   
  83.     {  
  84.       //SCI1CR2 &= 0XF7;    // 关闭发送功能  
  85.       SCI1CR2 &= 0xBF;  
  86.       T_curr = 0;                     // 复位数据指针  
  87.       Status.Bits.Uart_R_Over = 0;    // 发送完成   
  88.     }  
  89.     else  
  90.       SCI1DRL = Uart_T_Str[T_curr++];   
  91.  }   
  92. }  
  93. // ============================================================================  
  94. // 主程序  
  95. // ============================================================================  
  96. /******************************全局变量**************************/  
  97. volatile byte Uart_R_Str[Uart_R_Length];    // 串口接收数据缓冲区  
  98. volatile byte Uart_T_Str[Uart_T_Length];    // 串口发送数据缓冲区  
  99. /****************************************************************/  
  100.   
  101. void main(void)  
  102. {  
  103.   // 初始化代码  
  104.   ...  
  105.     
  106.   for(;;)  
  107.   {  
  108.     if(Status.Bits.Uart_Status)  
  109.     {  
  110.         Uart_Deal();         // 接收帧处理函数,功能:校验,解析帧。  
  111.     }  
  112.     if(Status.Bits.Uart_T_Commd && (!Status.Bits.Uart_R_Over))  
  113.     {  
  114.        Status.Bits.Uart_T_Commd = 0;    // 清除发送请求命令位  
  115.            Send_1();                // 发送   
  116.     }  
  117.     // 其余代码  
  118.     ...  
  119.  }    
  120. }  
  121.  //源地址链接:http://blog.csdn.net/finewind/article/details/5539541
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值