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

📄 comm_i2cs.c

📁 PIC Kit serial source code.
💻 C
📖 第 1 页 / 共 2 页
字号:
      }
      
      //----------------------
      //--- MODE: 1
      //----------------------
      else if(COMM_CB_I2CS_MODE_REG == 1)
      {
         if(cbuf3.used)
         {
            COMM_I2CS_DATA = cbuf3_get();
            comm_i2cs_data_send();
         }
         else
         {
            COMM_I2CS_READ_DATA_RQ_FLAG = 1;
            if(COMM_CB_I2CS_EVENTEN_DATA_RQ_FLAG)
               comm_post_event(COMM_TAG_I2CS_EVENT_DATA_RQ);
         }
      }
      
      //----------------------
      //--- MODE: 2
      //----------------------
      else
      {
         COMM_I2CS_TEMP_FLAG = 0;
         if(COMM_I2CS_PRO_REG_OK_FLAG)
         {
            if(COMM_I2CS_PRO_REG_RDDIS_FLAG == 0)
            {
               if(COMM_I2CS_PRO_REG_BC)
               {
                  COMM_I2CS_DATA = cbuf3_data[COMM_I2CS_PRO_REG_INDEX];
                  comm_i2cs_data_send();
                  COMM_I2CS_PRO_REG_INDEX++;
                  COMM_I2CS_PRO_REG_BC--;
                  COMM_I2CS_TEMP_FLAG = 1;
               }
            }
            if(COMM_I2CS_PRO_REG_SEQ_FLAG)
               cbuf3_data[COMM_I2CS_PRO_SLAVE_REG_INDEX]++;
         }
         if(COMM_I2CS_TEMP_FLAG == 0)
         {
            COMM_I2CS_DATA = COMM_I2CS_DATA_READ_DEFAULT;
            comm_i2cs_data_send();
         }
      }

      //--- RST '1ST BYTE' FLAG ...
      COMM_I2CS_ADDR_FLAG = 0;
   }
}

//==========================================================
//--- SEND/RETURN DATA TO MASTER
//==========================================================
void comm_i2cs_data_send(void)
{
   SSPBUF = COMM_I2CS_DATA;
   SSPCON1bits.CKP = 1;
   if(COMM_CB_I2CS_EVENTEN_DATA_TX_FLAG)
      comm_post_event_1b(COMM_TAG_I2CS_EVENT_DATA_TX, COMM_I2CS_DATA);
}

//==========================================================
//--- comm_i2cs_postproc()
//
//    post-processing
//    set status error flag
//    set composite error flag
//==========================================================
void comm_i2cs_postproc(void)
{
   
   //---------------------------------------------
   //--- CHECK FOR 'STOP' EVENT
   //---------------------------------------------
   if(COMM_I2CS_XSTARTED_FLAG)
   {
      //--- disable interrupts
      do
      {
         INTCONbits.GIEL = 0; 
      } while(INTCONbits.GIEL);

      //--- STOP bit encountered
      if(SSPSTATbits.P == 1)
      {
         if(COMM_CB_I2CS_EVENTEN_STOP_FLAG)
            comm_post_event(COMM_TAG_I2CS_STOP);
         COMM_I2CS_XSTARTED_FLAG = 0;
      }
   }
   INTCONbits.GIEL = 1;
   
   //---------------------------------------------
   //--- CHECK COMM I/O PINS/STATE
   //---------------------------------------------
   if(COMM_IO_4B_PIN)
      COMM_SB_I2CS_SDA_STATE_FLAG = 1;
   else
      COMM_SB_I2CS_SDA_STATE_FLAG = 0;

   if(COMM_IO_5B_PIN)
      COMM_SB_I2CS_SCK_STATE_FLAG = 1;
   else
      COMM_SB_I2CS_SCK_STATE_FLAG = 0;
   
   /*
   if(SSPCON1bits.CKP)
      COMM_SB_I2CS_SCK_HELD_FLAG = 0;
   else
      COMM_SB_I2CS_SCK_HELD_FLAG = 1;
   */
      
   //---------------------------------------------
   //--- IF READING & DATA AVAIL ... SEED OUTPUT
   //---------------------------------------------
   
   if(COMM_CB_I2CS_MODE_REG == 1)
   {
      if(COMM_I2CS_READ_DATA_RQ_FLAG)
      {
         if(cbuf3.used)
         {
            COMM_I2CS_READ_DATA_RQ_FLAG = 0;
            COMM_I2CS_DATA = cbuf3_get();
            comm_i2cs_data_send();
         }
      }
   }      
   

   //-----------------------------------
   //--- transaction error
   //-----------------------------------
   COMM_4_FLAG = 0;
   if(SSPCON1bits.WCOL)
   {
      COMM_4_FLAG = 1;
      SSPCON1bits.WCOL = 0;
      COMM_SB_I2CS_WCOL_FLAG = 1;
   }
   if(SSPCON1bits.SSPOV)
   {
      COMM_4_FLAG = 1;
      SSPCON1bits.SSPOV = 0;
      COMM_SB_I2CS_SSPOV_FLAG = 1;
   }
/*
   if(COMM_4_FLAG)
   {
      if(COMM_CB_I2CS_EVENT_XACT_ERR_FLAG)
      {
         comm_post_event_1b(COMM_TAG_I2CS_XACT_ERR, COMM_SB_I2CS_ERR_REG);
      }
   }
*/
   
   //-----------------------------------
   //--- composite error
   //-----------------------------------
   if(COMM_SB_I2CS_ERR_REG & COMM_SB_I2CS_ERR_REG_MASK)
   {
      COMM_SB_GEN_ERR_FLAG = 1;
      COMM_SB_I2CS_ERR_FLAG = 1;
   }

   //-----------------------------------
   //--- change in error status
   //-----------------------------------
   if(COMM_CB_I2CS_EVENTEN_STATUSERR_FLAG)
   {
      if(COMM_SB_I2CS_ERR_REG != exec_status_save_3)
      {
         exec_status_save_3 = COMM_SB_I2CS_ERR_REG;
         comm_post_event_1b(COMM_TAG_I2CS_EVENT_STATUS_ERR, COMM_SB_I2CS_ERR_REG);
      }
   }
}


//==========================================================
//--- comm_i2cs_svc()
//==========================================================
void comm_i2cs_svc(void)
{

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

      //====================================================
      case COMM_TAG_I2CS_INIT:
         comm_i2cs_reset();
         comm_state = COMM_STATE_GEN_NEXT;
         break;
         
      //====================================================
      case COMM_TAG_I2CS_SEND_BYTES:
         
         //--- GET BYTE COUNT
         if(not COMM_1_FLAG)
         {
            if(comm_data_get())
            {
               comm_cmnd_count_1 = comm_data;
               COMM_1_FLAG = 1;
               cbuf3_init();
            }
         }
         
         //--- PULL 'READ' DATA
         else
         {
            while(comm_cmnd_count_1)
            {
               if(comm_data_get())
               {
                  cbuf3_put(comm_data);
                  comm_cmnd_count_1--;
               }
               else
               {
                  break;
               }
            }
            if(comm_cmnd_count_1 == 0)
            {
               COMM_I2CS_READ_DATA_RDY_FLAG = 1;
               comm_state = COMM_STATE_GEN_NEXT;
            }
         }
         break;
         
      //====================================================
      case COMM_TAG_I2CS_REGDATA_LOAD:
         
         //-----------------------------
         //--- IF TAG DATA AVAIL., 
         //    DISABLE INTERRUPTS
         //-----------------------------
         if(not COMM_1_FLAG)
         {
            if(cbuf1.used >= 3)
            {
               comm_i2cs_dint();
               if(COMM_1_FLAG)
                  COMM_PROC_LOOP_FLAG = 1;
            }
         }

         //-----------------------------
         //--- FETCH 1st 3 BYTES OF 'TAG DATA'
         //-----------------------------
         else if(not COMM_2_FLAG)
         {
            comm_data_get();
            COMM_I2CS_ADDR = comm_data;         // SLAVE ADDR
            comm_data_get();
            COMM_I2CS_CMND = comm_data;         // REG ID
            comm_data_get();
            COMM_I2CS_TAGDATA_1 = comm_data;    // BYTE COUNT

            //--------------------------
            //--- SEARCH PROFILE FOR SLAVE/REG
            //--------------------------
            COMM_I2CS_TEMP_2_FLAG = 0;
            comm_i2cs_pro_get_slave();
            if(COMM_I2CS_PRO_SLAVE_OK_FLAG)
            {
               comm_i2cs_pro_get_regdef();
               if(COMM_I2CS_PRO_REG_OK_FLAG)
                  COMM_I2CS_TEMP_2_FLAG = 1;
            }
            COMM_2_FLAG = 1;
            COMM_PROC_LOOP_FLAG = 1;
         }

         //-----------------------------
         //--- PROCESS TAG DATA
         //-----------------------------
         else
         {
            //--- FOR ALL 'TAG DATA'
            while(COMM_I2CS_TAGDATA_1)
            {
               if(comm_data_get())
               {
                  //--- IF SLAVE AND REG FOUND
                  if(COMM_I2CS_TEMP_2_FLAG)
                  {
                     //--- IF REG BYTE COUNT != 0
                     if(COMM_I2CS_PRO_REG_BC)
                        cbuf3_data[COMM_I2CS_PRO_REG_INDEX] = comm_data;
                  }
                  COMM_I2CS_PRO_REG_INDEX++;
                  COMM_I2CS_TAGDATA_1--;
                  COMM_I2CS_PRO_REG_BC--;
               }
               else
               {
                  break;
               }
            }

            INTCONbits.GIEL = 1;
            comm_state = COMM_STATE_GEN_NEXT;
         }            
         break;

      //====================================================
      case COMM_TAG_I2CS_REGDATA_RETURN:
         
         //-----------------------------
         //--- IF TAG DATA AVAIL., 
         //    DISABLE INTERRUPTS
         //-----------------------------
         if(not COMM_1_FLAG)
         {
            if(cbuf1.used >= 2)
            {
               comm_i2cs_dint();
               if(COMM_1_FLAG)
                  COMM_PROC_LOOP_FLAG = 1;
            }
         }

         //-----------------------------
         //--- FETCH 'TAG DATA' (2 bytes)
         //-----------------------------
         else if(not COMM_2_FLAG && (cbuf2.unused>=4))
         {
            comm_data_get();
            COMM_I2CS_ADDR = comm_data;         // SLAVE ADDR
            comm_data_get();
            COMM_I2CS_CMND = comm_data;         // REG ID

            //--------------------------
            //--- SEARCH PROFILE FOR SLAVE/REG
            //--------------------------
            COMM_I2CS_TEMP_2_FLAG = 0;
            comm_i2cs_pro_get_slave();
            if(COMM_I2CS_PRO_SLAVE_OK_FLAG)
            {
               comm_i2cs_pro_get_regdef();
               if(COMM_I2CS_PRO_REG_OK_FLAG)
               {
                  COMM_I2CS_TEMP_2_FLAG = 1;
                  cbuf2_put(COMM_TAG_I2CS_REGDATA);
                  cbuf2_put(COMM_I2CS_ADDR);
                  cbuf2_put(COMM_I2CS_CMND);
                  cbuf2_put(COMM_I2CS_PRO_REG_BC);
               }
            }
            COMM_2_FLAG = 1;
            COMM_PROC_LOOP_FLAG = 1;
         }

         //-----------------------------
         //--- RETURN REG DATA
         //-----------------------------
         else
         {
            //--- IF SLAVE/REG FOUND
            if(COMM_I2CS_TEMP_2_FLAG)
            {

               //--- FOR ALL REG DATA
               while(COMM_I2CS_PRO_REG_BC)
               {
                  if(cbuf2.unused)
                  {
                     comm_data = cbuf3_data[COMM_I2CS_PRO_REG_INDEX];
                     cbuf2_put(comm_data);
                     COMM_I2CS_PRO_REG_INDEX++;
                     COMM_I2CS_PRO_REG_BC--;
                  }
                  else
                     break;
               }
            }

            INTCONbits.GIEL = 1;
            comm_state = COMM_STATE_GEN_NEXT;
         }            
         break;
                  
      //====================================================
      default:
         COMM_SB_BAD_CMND_FLAG = 1;
         break;

   } // end SWITCH
   
}

//==========================================================
//--- comm_i2cs_dint()
//
//    disable interrupts if between I2C transactions
//    COMM_1_FLAG == 1  interrupts successfully disabled
//    COMM_1_FLAG == 0  action failed, 
//                      I2C transaction active, ints enabled
//==========================================================
void comm_i2cs_dint(void)
{
   if((SSPSTATbits.P) | ((!SSPSTATbits.P) && (!SSPSTATbits.S)))
   {
      while(INTCONbits.GIEL)
          INTCONbits.GIEL = 0;
      if((SSPSTATbits.P) | ((!SSPSTATbits.P) && (!SSPSTATbits.S)))        
         COMM_1_FLAG = 1;
      else
         INTCONbits.GIEL = 1;
   }
}

⌨️ 快捷键说明

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