📄 lin_dev.c
字号:
{(unsigned char)LIN_SIG_NODE_A_COUNTER, 8}
};
const FRAME_SIGNAL_TBL LIN_F3_Sigtable_Cmd_Switch[1] = {
{(unsigned char)LIN_SIG_CMD_SWITCH, 0}
};
/* The "LIN_signal_table" is a structure that declares the elements associated
* with each signal used by the LIN system.
*
typedef struct {
unsigned char signal_byte; Signal data size in bytes.
unsigned char signal_bit; Signal data size in bits.
unsigned char *signal_address; Address of the signal data [byte 0 is status byte].
} SIGNAL_TBL;
*
* */
const SIGNAL_TBL LIN_signal_table[4] = {
{2, 16, &LIN_SIG_Node_A_AD_data[0]},
{1, 8, &LIN_SIG_Node_A_Switch_data[0]},
{1, 8, &LIN_SIG_Node_A_Counter_data[0]},
{1, 8, &LIN_SIG_Cmd_Switch_data[0]}
};
/* The "LIN_id_table[]" for a Master node defines all of the frames that are used within the
* LIN cluster. "LIN_id_table[]" for a Slave node defines only those frames that the Slave
* node will receive or transmit. The frames are listed in "LIN_id_table[]" in the order in
* which they are enumerated in "lin_dev.h". This enumeration is node dependent. The
* same frame most likely will have a different number ("LIN_frame_name") on each node where
* it is processed.
*
* frame_id - This field holds the 6-bit LIN Frame ID assigned to the frame. The 8-bit LIN
* Protected ID is this same ID with the 2 parity bits added as the MSBits. The
* frame ID's may be assigned freely (within the ranges allowed by the LIN
* specification) according to the requirements of the LIN cluster.
* Slave node special - if the frame ID's will be configurable, "LIN_id_table[]"
* can be located in RAM and the frame ID's can be initialized to 0xFF. However,
* even in this case, the frame ID's for Diagnostic frames (0x3C, 0x3D and 0x3E)
* must be initialized to their standard values.
*
* node_name - This is the name of the LIN node that will "publish" the data for the frame.
* Master node special for Event Triggered or Diagnostic Response frames - "node_name"
* should be set to LIN_ANY_SLV, since no one Slave node will publish the data.
* Slave nodes special for Event Triggered frames - if a Slave node is configured
* to publish data for an Event Triggered frame, "node_name" must be set to the name
* of the Slave node.
*
* message_id - This ID identifies each type of message used in the LIN cluster and allows the
* Slave nodes to be configured dynamically to associate each message type with the
* frame ID used for that message type in a particular LIN cluster configuration.
* The Message ID is broken into 2 bytes. The LSByte holds the Message ID known to
* the Slave node. Each type of message used in the LIN cluster (Temp transducer
* request, encoder status request, temp display command, Event Triggered request for
* Temp transducer, etc) must be assigned an 8-bit Message ID. This Message ID will
* be used as the LSByte of the Message ID for all frames (for both Master and Slave
* nodes) that transport this type of message. For Slave nodes, the MSByte is always
* set to 0x00. For Master nodes, the MSByte holds the NAD of the Slave node that
* will transmit or receive the frame, except for Event Triggered frames. The MSByte
* of the Message ID for Event Triggered frames is left at 0x00, since these frames
* are not associated with any particular Slave node (NAD). For both Master and Slave
* nodes, the Message ID of Diagnostic frames is left set to 0x0000, since the Message
* ID of these frames is never used (the frame ID's of Diagnostic frames are never
* changed).
*
* frame_type - The only frame types allowed to be used in "LIN_id_table[]" are UNCONDITION_FRAME
* and EVENT_TRIG_FRAME. Even if a frame is sent in a Sporadic slot, the type of the
* frame itself is UNCONDITION_FRAME.
*
* data_length - The length of the frame data field in bytes. The number of bytes for the data
* field of an Event Triggered frame is always one byte longer than the data field of
* the associated Unconditional frame, since the first byte in the data field of an
* Event Triggered frame is always the PID of the Unconditional frame for which the
* response is made. The length of the data field must be the same for all Slave
* nodes that may publish data for an Event Triggered frame.
*
* check_sum_type - The type of checksum used for LIN 2.0 compliant Slave nodes must be set to
* "LIN_ENHANCED". If LIN 1.3 compliant Slave nodes are included in the LIN cluster,
* the checksum type must be set to "LIN_CLASSIC" for all frames associated with
* these nodes. It is not allowed to mix LIN 1.3 compliant Slave nodes with LIN 2.0
* compliant Slave nodes in an Event Triggered frame. The checksum type for all
* Diagnostic frames must be set to "LIN_CLASSIC".
*
* num_sigs - It is possible to pack several signals into one frame. The number of signals carried
* in a frame is given in the "num_sigs" field, except for Event Triggered frames.
* Master node special for Event Triggered frames - the "num_sigs" field is always set to 0.
* Slave nodes special for Event Triggered frames - the "num_sigs" field is set to the
* "frame_name" (index number "enumerated" in "lin_dev.h") of the Unconditional frame
* associated with the Event Triggered frame.
*
* data_address - This field holds a pointer to the signal table that defines all of the signals
* carried in the frame. This field is never used for Event Triggered frames (neither
* by Master nodes nor by Slave nodes) and may be set to 0x0000.
*
typedef struct {
unsigned char frame_id; LIN message frame ID (without parity bits) for this frame.
unsigned char node_name; Name of the node that publishes the data.
unsigned int message_id; Message ID for node configuration.
unsigned char frame_type; Type of LIN message frame.
unsigned char data_length; Number of bytes in the data field.
unsigned char check_sum_type; Type of checksum to be used (enhanced or classic).
unsigned char num_sigs; Number of signals associated with this frame.
unsigned char *data_address; Address of the structure that lists the signals.
} FRAME_ID_TBL;
*
* */
const FRAME_ID_TBL LIN_id_table[3 + 1] = {
{0x01, LIN_SLV_A, 0x0001, UNCONDITION_FRAME, 2, LIN_ENHANCED, 1, (unsigned char*)LIN_F1_Sigtable_Req_Node_A_AD},
{0x02, LIN_SLV_A, 0x0002, UNCONDITION_FRAME, 2, LIN_ENHANCED, 2, (unsigned char*)LIN_F2_Sigtable_Req_Node_A_Switch_and_Counter},
{0x03, LIN_MST, 0x0003, UNCONDITION_FRAME, 1, LIN_ENHANCED, 1, (unsigned char*)LIN_F3_Sigtable_Cmd_Switch}, /*
{0x04, LIN_SLV_B, 0x0004, UNCONDITION_FRAME, 2, LIN_CLASSIC, 1, (unsigned char*)LIN_F4_Sigtable_Req_Node_B_AD},
{0x05, LIN_SLV_B, 0x0005, UNCONDITION_FRAME, 2, LIN_CLASSIC, 2, (unsigned char*)LIN_F5_Sigtable_Req_Node_B_Switch_and_Counter}, */
{0xFE, 0, 0, 0, 0, 0, 0, 0} /* Required "empty" entry as a table delimiter. */
};
/**********************************************************************
* Function Definitions
*********************************************************************/
/* The following functions are used by Slave nodes to allow processing of
* "user defined" options to Diagnostic requests sent by the Master node.
* These functions are never called by Master nodes. */
#if (LIN_MASTER_NODE != LIN_MY_NODE_NAME)
#endif /* Not Master Node. */
/**********************************************************************
*
* Modification Record
*
**********************************************************************
*
Version 1.1 16 Mar 2006 Bob Chamberlain
Version 1.2 14 Sep 2006 Demo for AE, Carl Stenquist
*
*********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -