⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm_usart.c

📁 PIC Kit serial source code.
💻 C
📖 第 1 页 / 共 2 页
字号:
//==================================================================== 
//--- COPYRIGHT
//==================================================================== 
// Copyright 2006 Microchip Technology Inc.
// 
// Microchip Technology Inc. ("Microchip") licenses this software to
// you solely for use with Microchip products. The software is owned
// by Microchip and is protected under applicable copyright laws. All
// rights reserved.
// 
// SOFTWARE IS PROVIDED IN AN "AS IS." MICROCHIP EXPRESSLY DISCLAIMS ANY
// WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL MICROCHIP
// BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
// DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF
// PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
// BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
// ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
// 
//==================================================================== 
//--- TITLE
//==================================================================== 
//    Filename:            comm_usart.c
//    Microcontroller:     PIC18F2550
//    Compiled using:      C18 V3.00
//
//    Author:              Mark Enochson
//    Company:             Microchip Technology Inc.
//
//==================================================================== 
//--- DESCRIPTION
//==================================================================== 
//
//--- COMM_USART
//
//    communications controller: USART
//
//--- comm_usart_init()
//    initialize usart per CONTROL_BLOCK
//
//--- comm_usart_reset()
//    reset COMM_USART controller to IDLE
//
//--- comm_usart_svc()
//    usart service
//
//--- comm_usart_postproc()
//    post processing
//
//--- comm_usart_rcv()
//    receive USART data
//
//==================================================================== 
//--- HISTORY
//==================================================================== 
//
//    0001 - 08-01-06 - ME
//    - initial release
//
//==================================================================== 

//==========================================================
//--- INCLUDES
//==========================================================
#include "project.h"
#include "comm_gen.h"
#include "comm_usart.h"
#include "cbuf.h"


//==========================================================
//--- DEFINITIONS / DECLARATIONS
//==========================================================
// none


//==========================================================
//--- comm_usart_init()
//    initialize usart per CONTROL_BLOCK
//==========================================================
TD_BYTE comm_usart_init(void)
{

   //--- SET IDLE
   comm_usart_reset();                 // set IDLE
   
   //--- INIT PER MODE
   switch(COMM_CB_MODE_REG)
   {
      case COMM_MODE_USART_A:
         if(not COMM_CB_USART_CONFIG_RCV_DIS_FLAG)
            RCSTAbits.CREN = 1;
         RCSTAbits.SPEN = 1;
         USART_TX_TRIS = 0;
         USART_RX_TRIS = 1;
         TXSTAbits.TXEN = 1;
         IPR1bits.RCIP = 0;
         PIE1bits.RCIE = 1;
         
         break;
      case COMM_MODE_USART_SM:
         if(COMM_CB_USART_CONFIG_CKP_FLAG)
            BAUDCONbits.SCKP = 1;
         TXSTAbits.CSRC = 1;
         TXSTAbits.SYNC = 1;
         RCSTAbits.SPEN = 1;
         USART_TX_TRIS = 0;
         USART_RX_TRIS = 1;
         break;
      case COMM_MODE_USART_SS:
         TXSTAbits.SYNC = 1;
         RCSTAbits.SPEN = 1;
         USART_TX_TRIS = 1;
         USART_RX_TRIS = 1;
         break;
      default:
         COMM_SB_USART_INIT_ERR_FLAG = 1;
         break;
   }

   //--- IF NO ERROR, FINISH INIT ...
   if(not COMM_SB_USART_INIT_ERR_FLAG)
   {
      SPBRG = COMM_CB_USART_BRG_LO_REG;
      COMM_SB_USART_BRG_LO_REG = SPBRG;
      SPBRGH = COMM_CB_USART_BRG_HI_REG;
      COMM_SB_USART_BRG_HI_REG = SPBRGH;
      BAUDCONbits.BRG16 = 1;
      TXSTAbits.BRGH = 1;
      TXSTAbits.TXEN = 1;

      //--- CONFIGURATION
      COMM_SB_USART_CONFIG_REG = COMM_CB_USART_CONFIG_REG;

      //--------------------------------
      //--- AUX PINS
      //--------------------------------

      //--- AUX1 TRIS/DIR
      if(COMM_CB_USART_AUX1_TRIS_FLAG)
         USART_AUX1_TRIS = 1;
      else
         USART_AUX1_TRIS = 0;

      //--- AUX1 PORT/STATE
      if(COMM_CB_USART_AUX1_PORT_FLAG)
         USART_AUX1_PORT = 1;
      else
         USART_AUX1_PORT = 0;

      //--- AUX2 TRIS/DIR
      if(COMM_CB_USART_AUX2_TRIS_FLAG)
         USART_AUX2_TRIS = 1;
      else
         USART_AUX2_TRIS = 0;

      //--- AUX2 PORT/STATE
      if(COMM_CB_USART_AUX2_PORT_FLAG)
         USART_AUX2_PORT = 1;
      else
         USART_AUX2_PORT = 0;


      return(0);
   }
   
   //--- IF ERROR, RESET & EXIT ...
   else
   {
      comm_usart_reset();
      return(1);
   }
   
}


//==========================================================
//--- comm_usart_reset()
//    reset COMM_USART controller to IDLE
//==========================================================
void comm_usart_reset(void)
{
   //--- clear regs
   TXSTA = 0;
   RCSTA = 0;
   BAUDCON = 0;
   USART_TX_TRIS = 1;
   USART_RX_TRIS = 1;
   USART_AUX1_TRIS = 1;
   USART_AUX2_TRIS = 1;
   
   COMM_SB_USART_REG12 = 0;
   COMM_SB_USART_REG13 = 0;
   COMM_SB_USART_REG14 = 0;
   COMM_SB_USART_REG15 = 0;
   COMM_SB_USART_REG16 = 0;
   COMM_SB_USART_REG17 = 0;
   COMM_SB_USART_REG18 = 0;
   COMM_SB_USART_REG19 = 0;
   
   COMM_USART_FLAGS = 0;
}


//==========================================================
//--- comm_usart_svc()
//    usart service
//==========================================================
void comm_usart_svc(void)
{

   //---------------------------------------------
   //--- SWITCH CONTROLLER STATE
   //---------------------------------------------
   switch(comm_state)
   {

      //====================================================
      case COMM_TAG_USART_INIT:
            comm_usart_init();
            break;

      //====================================================
      case COMM_TAG_USART_DATA_XMT:
      
         //-----------------------------
         //--- GET BYTE COUNT
         //-----------------------------
         if(not COMM_0_FLAG)
         {
            if(comm_data_get())
            {
               COMM_0_FLAG = 1;
               comm_cmnd_count_2 = comm_data;   // load byte count
               COMM_PROC_LOOP_FLAG = 1;
            }
         }

         //-----------------------------
         //--- CHECK BYTE COUNT
         //-----------------------------
         else if(not COMM_1_FLAG)
         {
            if(comm_cmnd_count_2 == 0)
            {
               if(TXSTAbits.TRMT)
               {
                  comm_state = COMM_STATE_GEN_NEXT;
               }
               break;
            }
            else
            {
               if(PIR1bits.TXIF)
                  COMM_1_FLAG = 1;
            }
            COMM_PROC_LOOP_FLAG = 1;
         }
         
         //-----------------------------
         //--- DATA I/O
         //-----------------------------
         else
         {
            if(not comm_data_get())
              break;

            TXREG = comm_data;
            if(COMM_CB_USART_EVENT_BYTE_TX_FLAG)
               comm_post_event_1b(COMM_TAG_USART_EVENT_BYTE_TX, comm_data);
            COMM_1_FLAG = 0;
            comm_cmnd_count_2--;
            comm_led_busy_data();            
         }
         break;
         
      //====================================================
      case COMM_TAG_USART_DATA_SRCV:
      
         //-----------------------------
         //--- CHECK MODE
         //-----------------------------
         if(not COMM_MODE_USART_SM)
         {
            COMM_SB_BAD_CMND_FLAG = 1;
            break;
         }
         
         //-----------------------------
         //--- GET BYTE COUNT
         //-----------------------------
         if(not COMM_0_FLAG)
         {
            if(comm_data_get())
            {
               COMM_0_FLAG = 1;
               comm_cmnd_count_2 = comm_data;
               RCSTAbits.CREN = 0;
               RCSTAbits.SREN = 0;
               //USART_RX_TRIS = 1;
            }
         }

         //-----------------------------
         //--- CHECK BYTE COUNT
         //-----------------------------
         else if(not COMM_1_FLAG)
         {
            if(comm_cmnd_count_2 == 0)
            {
               RCSTAbits.SREN = 0;
               //USART_RX_TRIS = 0;
               comm_state = COMM_STATE_GEN_NEXT;
               break;
            }
            else
            {
               COMM_1_FLAG = 1;
               RCSTAbits.SREN = 1;
            }
         }
         
         //-----------------------------
         //--- DATA I/O
         //-----------------------------
         else
         {
            if(RCSTAbits.SREN == 0)
            {
               comm_data = RCREG;
               if(COMM_CB_USART_EVENT_BYTE_RX_FLAG)
                  comm_post_event_1b(COMM_TAG_USART_EVENT_BYTE_RX, comm_data);
               comm_post_data();
               COMM_1_FLAG = 0;
               comm_cmnd_count_2--;
               comm_led_busy_data();
            }
         }
         break;
         

      //====================================================
      case COMM_TAG_USART_DATA_ARCV_ENABLE:
      
         //-----------------------------
         //--- CHECK MODE
         //-----------------------------
         if(not COMM_MODE_USART_A)
         {
            COMM_SB_BAD_CMND_FLAG = 1;
            break;
         }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -