📄 comm_gen.c
字号:
//====================================================================
//--- 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_gen.c
// Microcontroller: PIC18F2550
// Compiled using: C18 V3.00
//
// Author: Mark Enochson
// Company: Microchip Technology Inc.
//
//====================================================================
//--- DESCRIPTION
//====================================================================
//
//--- COMM_GEN
//
// "general" communication facilities
// refers to commnication "mode" to call appropriate
// initialization/processing/post-processing functions
// otherwise
// processes script commands common to all "modes"
//==========================================================
//--- FUNCTIONS
//
//--- comm_init()
// general initialization - default to "idle"
//
//--- comm_init_mode()
// calls mode-dependant initialization
//
//--- comm_reset()
// perform general "reset" - clear flags & registers
//
//--- comm_svc()
// comm controller service: call mode-dependent function
//
//--- comm_gen()
// process "general" comm controller commands
//
//=== UTILITIES
//
//--- comm_post_event()
// post "EVENT" marker (and TIME if enabled)
//
//--- comm_post_event_1b()
// post "EVENT" marker w/ 1 "event-dependant" data byte
//
//--- comm_post_event_2b()
// post "EVENT" marker w/ 2 "event-dependant" data bytes
//
//--- comm_post_event_time()
// post event: "TIME"
//
//--- comm_post_data()
// post event: "DATA"
//
//--- comm_post_event_time_get()
// fetch time stamp, post TIMER_OVF event if necessary
//
//--- comm_data_get()
// fetch byte from script
//
//--- comm_post_cbuf2()
// post data byte to CBUF2
//
//--- comm_post_cbuf3()
// post data byte to CBUF3
//
//--- comm_led_busy_data()
// indicate data transaction using LED
//
//====================================================================
//--- HISTORY
//====================================================================
//
// 0003 - 03-01-08
// -- added 'break;' to case statement for COMM_TAG_GEN_MARKER_HOST
// was allowing case to fall thru and reset time stamp
// -- added function comm_clear()
// -- eliminated comm_sb_clear
// -- re-organized init function into reset/config/clear
//
// 12-05-07 - ME
// -- disable vsrc_init() in function comm_init()
// -- disabled CCP1CON=0 in comm_reset()
// -- added cbuf1_init(),cbuf2_init(),cbuf3_init() to comm_init()
//
// 0002 - 03-07-07 - ME
// -- added 'post' functions for cbuf3
//
// 0001 - 08-01-06 - ME
// - initial release
//
//====================================================================
//==========================================================
//--- INCLUDES
//==========================================================
#include "project.h"
#include "cbuf.h"
#include "led2.h"
#include "comm_gen.h"
#include "comm_i2cm.h"
#include "comm_spi.h"
#include "comm_usart.h"
#include "comm_i2cs.h"
#include "comm_lin.h"
#include "timer0.h"
#include "vsrc.h"
#include "exec.h"
//==========================================================
//--- DEFINITIONS / DECLARATIONS
//==========================================================
TD_BYTE comm_state;
TD_BYTE comm_data;
TD_BYTE comm_data_2;
TD_BYTE comm_data_3;
TD_BYTE comm_cmnd_count_1;
TD_BYTE comm_cmnd_count_2;
TD_BYTE comm_cmnd_macro_count_1;
TD_BYTE comm_cmnd_macro_count_2;
TD_WORD_W comm_macro_count_1_W;
TD_WORD_W comm_macro_count_2_W;
TD_BYTE_B comm_flags1_B;
TD_BYTE_B comm_flags2_B;
TD_BYTE_B comm_varbs_B[16];
//debug
TD_BYTE comm_temp;
//==========================================================
//--- comm_init()
// general initialization - default to "idle"
//==========================================================
void comm_init(void)
{
comm_gen_reset();
comm_gen_config();
comm_init_mode(COMM_MODE_IDLE);
comm_clear();
}
//==========================================================
//--- comm_reset()
// perform general "reset" - clear flags & registers
//==========================================================
void comm_gen_reset(void)
{
//-----------------------------------
//--- CLEAR MODE_DEPENDENT H/W
//-----------------------------------
comm_lin_reset();
//--- (CHANGE TO comm_i2c_reset() WHEN POSSIBLE)
SSPCON1 = 0; // SSP module
PIE1bits.SSPIE = 0;
//CCP1CON = 0; // CCP control
//-----------------------------------
//--- I/O PINS
//-----------------------------------
//--- (CHANGE TO AUX MODULE WHEN POSSIBLE)
COMM_IO_1A_DIR = 1; // set all I/O pins to INPUT
COMM_IO_4A_DIR = 1;
COMM_IO_5A_DIR = 1;
COMM_IO_6A_DIR = 1;
COMM_IO_1B_DIR = 1;
COMM_IO_4B_DIR = 1;
COMM_IO_5B_DIR = 1;
COMM_IO_6B_DIR = 1;
}
//==========================================================
//--- comm_gen_config()
//==========================================================
void comm_gen_config(void)
{
//-----------------------------------
//--- PULLUPS
//-----------------------------------
COMM_PULLUP_PIN = 1;
COMM_PULLUP_TRIS = 0;
ADCON1 = 0x0F;
}
//==========================================================
//--- comm_gen_clear()
// calls mode-dependant 'clear' function
//
// the 'mode' is determined from the STATUS_BLOCK; therfore,
// this function assumes/requires prior 'initialization'
//==========================================================
void comm_clear(void)
{
//-----------------------------------
//--- CIRCULAR BUFFERS
//-----------------------------------
cbuf1_init(); // clear buffer
cbuf2_init(); // clear buffer
//cbuf3_init(); // clear buffer (allow protocol-dependant clear)
//-----------------------------------
//--- OPERATIONAL VARBS
//-----------------------------------
comm_flags1_B._byte = 0; // clear flags
comm_flags2_B._byte = 0;
comm_state = COMM_STATE_GEN_RESET; // init controller
exec_status_save_1 = 0;
exec_status_save_2 = 0;
exec_status_save_3 = 0;
//-----------------------------------
//--- clear comm timer(s)
//-----------------------------------
timer0_reg_clear();
//-----------------------------------
//--- LEDs
//-----------------------------------
led_1_config(COMM_LED_CONFIG_OFF);
led_2_config(COMM_LED_CONFIG_OFF);
//-----------------------------------
//--- VSRC
//-----------------------------------
COMM_VSRC_TIMER = COMM_VSRC_MEAS_INTV_TA;
//-----------------------------------
//--- PULLUPS
//-----------------------------------
COMM_PULLUP_PIN = 1;
COMM_PULLUP_TRIS = 0;
//-----------------------------------
//--- STATUS BLOCK
//-----------------------------------
exec_status_B[4]._byte = 0;
exec_status_B[5]._byte = 0;
//exec_status_B[6]._byte = 0; // SAVE MODE
exec_status_B[7]._byte = 0;
exec_status_B[8]._byte = 0;
exec_status_B[9]._byte = 0;
exec_status_B[10]._byte = 0;
exec_status_B[11]._byte = 0;
exec_status_B[12]._byte = 0;
exec_status_B[13]._byte = 0;
exec_status_B[14]._byte = 0;
exec_status_B[15]._byte = 0;
exec_status_B[16]._byte = 0;
exec_status_B[17]._byte = 0;
exec_status_B[18]._byte = 0;
exec_status_B[19]._byte = 0;
//-----------------------------------
//--- clear active dev comm controller
//-----------------------------------
switch(COMM_SB_MODE_REG)
{
//--------------------------------
case COMM_MODE_LIN:
comm_lin_clear();
break;
//--------------------------------
//--------------------------------
case COMM_MODE_IDLE:
case COMM_MODE_I2CM:
case COMM_MODE_SPI_M:
case COMM_MODE_SPI_S:
case COMM_MODE_MWIRE_M:
case COMM_MODE_USART_A:
case COMM_MODE_USART_SM:
case COMM_MODE_USART_SS:
case COMM_MODE_I2CS:
default:
cbuf3_init(); // clear buffer
break;
}
}
//==========================================================
//--- comm_varbs_clear()
//==========================================================
void comm_varbs_clear(void)
{
comm_varbs_B[0]._b = 0;
comm_varbs_B[1]._b = 0;
comm_varbs_B[2]._b = 0;
comm_varbs_B[3]._b = 0;
comm_varbs_B[4]._b = 0;
comm_varbs_B[5]._b = 0;
comm_varbs_B[6]._b = 0;
comm_varbs_B[7]._b = 0;
comm_varbs_B[8]._b = 0;
comm_varbs_B[9]._b = 0;
comm_varbs_B[10]._b = 0;
comm_varbs_B[11]._b = 0;
comm_varbs_B[12]._b = 0;
comm_varbs_B[13]._b = 0;
comm_varbs_B[14]._b = 0;
comm_varbs_B[15]._b = 0;
}
//==========================================================
//==========================================================
//--- comm_init_mode()
// calls mode-dependant initialization
//
// if initialization successful
// set "mode" in STATUS_BLOCK
//==========================================================
//==========================================================
void comm_init_mode(TD_BYTE mode)
{
//-----------------------------------
//--- init active dev comm controller
//-----------------------------------
switch(mode)
{
COMM_SB_INIT_ERR_FLAG = 0;
//--------------------------------
case COMM_MODE_IDLE:
break;
//--------------------------------
case COMM_MODE_I2CM:
if(comm_i2cm_init())
COMM_SB_INIT_ERR_FLAG = 1;
break;
//--------------------------------
case COMM_MODE_SPI_M:
case COMM_MODE_SPI_S:
case COMM_MODE_MWIRE_M:
Nop();
if(comm_spi_init())
COMM_SB_INIT_ERR_FLAG = 1;
break;
//--------------------------------
case COMM_MODE_USART_A:
case COMM_MODE_USART_SM:
case COMM_MODE_USART_SS:
if(comm_usart_init())
COMM_SB_INIT_ERR_FLAG = 1;
break;
//--------------------------------
case COMM_MODE_I2CS:
if(comm_i2cs_init())
COMM_SB_INIT_ERR_FLAG = 1;
break;
//--------------------------------
case COMM_MODE_LIN:
if(comm_lin_init())
COMM_SB_INIT_ERR_FLAG = 1;
break;
//--------------------------------
default:
COMM_SB_INIT_ERR_FLAG = 1;
break;
}
if(COMM_SB_INIT_ERR_FLAG == 0)
COMM_SB_MODE_REG = mode;
}
//==========================================================
//==========================================================
//--- comm_svc()
// comm controller service: call mode-dependent function
//==========================================================
//==========================================================
void comm_svc(void)
{
//---------------------------------------------
//--- VSRC svc
//---------------------------------------------
//-----------------------------------
//--- if new CONTROL_BLOCK ...
//-----------------------------------
if(EXEC_CB_NEW_FLAG)
{
//----------------------
//--- SET VSRC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -