lin.h File Reference


Detailed Description

LIN service for AVR32 UC3.

This file contains basic functions for the AVR32 USART, with support for all modes, settings and clock speeds.

Author:
Atmel Corporation: http://www.atmel.com
Support and FAQ: http://support.atmel.no/

Definition in file lin.h.

#include <avr32/io.h>
#include "compiler.h"
#include "usart.h"
#include "conf_lin.h"

Go to the source code of this file.

Data Structures

struct  st_lin_message
 This structure allows to handle a LIN message and, at the end of the received/transmitted message, allows to call a function associated to this message, the update or the capture of "signals". More...

Defines

#define LIN_LAST_ERR_LENGHT   0x04
 Default lenght of the 'lin_last_error[]' array.
#define LIN_OVERLOAD_INT   ((U16)0x00FF)
 Error report definitions.
#define NUMBER_OF_LIN_FRAMES_NODE0   8
LIN Versions
#define LIN_1x   1
 Lin 1.x Version.
#define LIN_2x   0
 Lin 2.x Version.

Enumerations

enum  enum_lin_cmd { PUBLISH, SUBSCRIBE, IGNORE }
 This enumeration is used to select an action for a specific message declared in st_lin_message structure. Note: XXX_STAND_BY keeps the direction (PUBLISH or SUBSCRIBE) for a message that will be IGNORE. When the 'stand_by' will be finished, PUBLISH_STAND_BY would become PUBLISH and SUBSCRIBE_STAND_BY would become SUBSCRIBE. An IGNORE message could become either PUBLISH or SUBSCRIBE. More...

Functions

U8 lin_init (Bool master, U8 l_node, U16 b_rate, long pba_hz)
 This function initializes the LIN controller and, if needed, the LIN interrupts.
U8 lin_send_cmd (U8 l_node, U8 l_id, U8 l_len)
 This function commands the sending of the LIN header, MASTER task of MASTER node.

Variables

volatile st_lin_message lin_descript_list_node0 [NUMBER_OF_LIN_FRAMES_NODE0]
 Array of structure of type:'st_lin_message'. Default: 8 elements.
volatile U16 lin_error_number_node0
 Counter of LIN error. If an error clearly linked to a message (i.e. time-out) the status of this message is written with the error (LINERR).
volatile U8 lin_handle_node0
 Index in lin_descript_list[], 'lin_handle' is set after processing IDOK and verified once RXOK or TXOK rises.
volatile U16 lin_last_errors_node0 []
 Last error FIFO: lin_handle | status. Default: 4 elements.


Define Documentation

#define LIN_1x   1

Lin 1.x Version.

Definition at line 65 of file lin.h.

#define LIN_2x   0

Lin 2.x Version.

Definition at line 64 of file lin.h.

#define LIN_LAST_ERR_LENGHT   0x04

Default lenght of the 'lin_last_error[]' array.

Definition at line 127 of file lin.h.

Referenced by lin_int_handler_node0().

#define LIN_OVERLOAD_INT   ((U16)0x00FF)

Error report definitions.

More than ONE interrupt in the same time !

Definition at line 125 of file lin.h.

#define NUMBER_OF_LIN_FRAMES_NODE0   8


Enumeration Type Documentation

This enumeration is used to select an action for a specific message declared in st_lin_message structure. Note: XXX_STAND_BY keeps the direction (PUBLISH or SUBSCRIBE) for a message that will be IGNORE. When the 'stand_by' will be finished, PUBLISH_STAND_BY would become PUBLISH and SUBSCRIBE_STAND_BY would become SUBSCRIBE. An IGNORE message could become either PUBLISH or SUBSCRIBE.

Enumerator:
PUBLISH  The node sends the response.
SUBSCRIBE  The node receives the response.
IGNORE  The node is not concerned by the response, it doesn't send or receive.

Definition at line 86 of file lin.h.

00086              {
00087   PUBLISH,            
00088   SUBSCRIBE,          
00089   IGNORE              
00090 } enum_lin_cmd;


Function Documentation

U8 lin_init ( Bool  master,
U8  l_node,
U16  b_rate,
long  pba_hz 
)

This function initializes the LIN controller and, if needed, the LIN interrupts.

Parameters:
master TRUE for master, FALSE for slave
b_rate Baudrate Value
l_node Node Value
pba_hz PBA Value
Returns:
Status PASS / FAIL
Parameters:
master TRUE for master, FALSE for slave
l_node Node Value
b_rate Baudrate Value
pba_hz PBA Value
Returns:
Status PASS / FAIL

Enable Interrupt for Error flags and end ID Reception

Register Interrupt for LIN

Register Interrupt for PDCA Transfert TX

Register Interrupt for PDCA Transfert RX

Definition at line 470 of file lin.c.

References lin_int_handler_node0(), lin_pdca_int_rx_handler_node0(), lin_pdca_int_tx_handler_node0(), usart_lin_node0, USART_LIN_NODE0_GPIO_MAP, USART_LIN_NODE0_PDCA_RX_IRQ, USART_LIN_NODE0_PDCA_RX_IRQ_LEVEL, USART_LIN_NODE0_PDCA_TX_IRQ, USART_LIN_NODE0_PDCA_TX_IRQ_LEVEL, USART_LIN_NODE0_RX_PIN, USART_LIN_NODE0_USART_IRQ, USART_LIN_NODE0_USART_IRQ_LEVEL, USART_LIN_NODE1_PDCA_RX_IRQ, USART_LIN_NODE1_PDCA_RX_IRQ_LEVEL, USART_LIN_NODE1_PDCA_TX_IRQ, USART_LIN_NODE1_PDCA_TX_IRQ_LEVEL, USART_LIN_NODE1_RX_PIN, USART_LIN_NODE1_USART_IRQ, and USART_LIN_NODE1_USART_IRQ_LEVEL.

Referenced by main().

00473                           {
00474 if (l_node == 0)
00475 {
00476     // Enable GPIO Alternate Functions
00477     gpio_enable_module(USART_LIN_NODE0_GPIO_MAP,
00478                      sizeof(USART_LIN_NODE0_GPIO_MAP) / sizeof(USART_LIN_NODE0_GPIO_MAP[0]));
00479 
00480     gpio_enable_pin_pull_up(USART_LIN_NODE0_RX_PIN);
00481 
00482     // USART options.
00483     if (master)
00484       usart_init_lin_master(usart_lin_node0,b_rate,pba_hz);
00485     else
00486       usart_init_lin_slave(usart_lin_node0,b_rate,pba_hz);
00487 
00488     Disable_global_interrupt();
00489 
00490     if (master==FALSE)
00491     {
00493             #ifdef AVR32_USART_420_H_INCLUDED
00494                 usart_lin_node0->ier = AVR32_USART_IER_LINIR_MASK  |
00495                              AVR32_USART_IER_LINBE_MASK  |
00496                              AVR32_USART_IER_LINISFE_MASK |
00497                              AVR32_USART_IER_LINIPE_MASK |
00498                              AVR32_USART_IER_LINCE_MASK  |
00499                              AVR32_USART_IER_LINSNRE_MASK;
00501                 INTC_register_interrupt(&lin_int_handler_node0,
00502                                         USART_LIN_NODE0_USART_IRQ,
00503                                         USART_LIN_NODE0_USART_IRQ_LEVEL);
00504             #else
00505 
00506                 usart_lin_node0->ier = AVR32_USART_IER_LINID_MASK  |
00507                              AVR32_USART_IER_LINBE_MASK  |
00508                              AVR32_USART_IER_LINISFE_MASK |
00509                              AVR32_USART_IER_LINIPE_MASK |
00510                              AVR32_USART_IER_LINCE_MASK  |
00511                              AVR32_USART_IER_LINSNRE_MASK;
00513                 INTC_register_interrupt(&lin_int_handler_node0,
00514                                         USART_LIN_NODE0_USART_IRQ,
00515                                         USART_LIN_NODE0_USART_IRQ_LEVEL);
00516             #endif
00517     }
00518 
00520     INTC_register_interrupt(&lin_pdca_int_tx_handler_node0,
00521                             USART_LIN_NODE0_PDCA_TX_IRQ,
00522                             USART_LIN_NODE0_PDCA_TX_IRQ_LEVEL);
00523 
00525     INTC_register_interrupt(&lin_pdca_int_rx_handler_node0,
00526                             USART_LIN_NODE0_PDCA_RX_IRQ,
00527                             USART_LIN_NODE0_PDCA_RX_IRQ_LEVEL);
00528 
00529 }
00530 #ifdef USART_LIN_NODE1_INSTANCE
00531 else
00532 {
00533     // Enable GPIO Alternate Functions
00534     gpio_enable_module(USART_LIN_NODE1_GPIO_MAP,
00535                      sizeof(USART_LIN_NODE1_GPIO_MAP) / sizeof(USART_LIN_NODE1_GPIO_MAP[0]));
00536 
00537 
00538     gpio_enable_pin_pull_up(USART_LIN_NODE1_RX_PIN);
00539 
00540     // USART options.
00541     if (master)
00542       usart_init_lin_master(usart_lin_node1,b_rate,pba_hz);
00543     else
00544       usart_init_lin_slave(usart_lin_node1,b_rate,pba_hz);
00545 
00546     Disable_global_interrupt();
00547 
00548     if (master==FALSE)
00549     {
00551             #ifdef AVR32_USART_420_H_INCLUDED
00552                 usart_lin_node1->ier = AVR32_USART_IER_LINIR_MASK  |
00553                              AVR32_USART_IER_LINBE_MASK  |
00554                              AVR32_USART_IER_LINISFE_MASK |
00555                              AVR32_USART_IER_LINIPE_MASK |
00556                              AVR32_USART_IER_LINCE_MASK  |
00557                              AVR32_USART_IER_LINSNRE_MASK;
00559                 INTC_register_interrupt(&lin_int_handler_node1,
00560                                         USART_LIN_NODE1_USART_IRQ,
00561                                         USART_LIN_NODE1_USART_IRQ_LEVEL);
00562             #else
00563                 usart_lin_node1->ier = AVR32_USART_IER_LINID_MASK  |
00564                              AVR32_USART_IER_LINBE_MASK  |
00565                              AVR32_USART_IER_LINISFE_MASK |
00566                              AVR32_USART_IER_LINIPE_MASK |
00567                              AVR32_USART_IER_LINCE_MASK  |
00568                              AVR32_USART_IER_LINSNRE_MASK;
00570                 INTC_register_interrupt(&lin_int_handler_node1,
00571                                         USART_LIN_NODE1_USART_IRQ,
00572                                         USART_LIN_NODE1_USART_IRQ_LEVEL);
00573             #endif
00574     }
00575 
00577     INTC_register_interrupt(&lin_pdca_int_tx_handler_node1,
00578                             USART_LIN_NODE1_PDCA_TX_IRQ,
00579                             USART_LIN_NODE1_PDCA_TX_IRQ_LEVEL);
00580 
00582     INTC_register_interrupt(&lin_pdca_int_rx_handler_node1,
00583                             USART_LIN_NODE1_PDCA_RX_IRQ,
00584                             USART_LIN_NODE1_PDCA_RX_IRQ_LEVEL);
00585 }
00586 #endif
00587     return PASS;
00588 }

U8 lin_send_cmd ( U8  l_node,
U8  l_id,
U8  l_len 
)

This function commands the sending of the LIN header, MASTER task of MASTER node.

Parameters:
l_id LIN identifier value. In case of ‘LIN_1X’, the coded length is transported into the LIN identifier.
l_len True length (not coded), number of data bytes transported in the response. This information is not used in ‘LIN_1X’ because it is coded in ‘l_id’.
l_node Node Value
Returns:
Status PASS / FAIL
Parameters:
l_node Node Value
l_id LIN identifier value. In case of ‘LIN_1X’, the coded length is transported into the LIN identifier.
l_len True length (not coded), number of data bytes transported in the response. This information is not used in ‘LIN_1X’ because it is coded in ‘l_id’.
Returns:
Status PASS / FAIL

Definition at line 600 of file lin.c.

References lin_rx_response(), lin_tx_header_and_response(), NUMBER_OF_LIN_FRAMES_NODE0, PUBLISH, SUBSCRIBE, usart_lin_node0, and usart_reset_status().

Referenced by lin_master_task_ID12(), and lin_master_task_ID15().

00603                        {
00604       U8 index = 0;
00605       U8 l_handle = 0;
00606 if (l_node == 0)
00607 {
00608     // Clear error in case of previous communication
00609     usart_reset_status(usart_lin_node0);
00610 
00611     for(index = 0; index < NUMBER_OF_LIN_FRAMES_NODE0; index ++) 
00612     {
00613         if(lin_descript_list_node0[index].l_id == l_id) 
00614         {
00615             l_handle = index;
00616               break;
00617         }
00618     }
00619 
00620     if(l_handle != 0xFF) 
00621     {
00622         usart_lin_set_node_action(usart_lin_node0,lin_descript_list_node0[l_handle].l_cmd);
00623 #if USART_LIN_VERSION == LIN_2x
00624         // Configure Parity
00625         usart_lin_enable_parity(usart_lin_node0,TRUE);
00626         // Configure Checksum
00627         usart_lin_enable_checksum(usart_lin_node0,TRUE);
00628         // Configure Checksum Type
00629         usart_lin_set_checksum(usart_lin_node0,USART_LIN_ENHANCED_CHECKSUM);
00630         // Configure Frameslot
00631         usart_lin_enable_frameslot(usart_lin_node0,FALSE);
00632         // Configure Frame Length
00633         usart_lin_set_data_length_lin2x(usart_lin_node0,l_len);
00634 #elif USART_LIN_VERSION == LIN_1x
00635         // Configure Parity
00636         usart_lin_enable_parity(usart_lin_node0,TRUE);
00637         // Configure Checksum
00638         usart_lin_enable_checksum(usart_lin_node0,TRUE);
00639         // Configure Checksum Type
00640         usart_lin_set_checksum(usart_lin_node0,USART_LIN_CLASSIC_CHECKSUM);
00641         // Configure Frameslot
00642         usart_lin_enable_frameslot(usart_lin_node0,FALSE);
00643         // Configure Frame Length
00644         usart_lin_set_data_length_lin1x(usart_lin_node0);
00645 #endif
00646         // Switch to Classic Checksum if diagnostic ID request
00647         if (lin_descript_list_node0[l_handle].l_id>=60)
00648         {
00649                 usart_lin_set_checksum(usart_lin_node0,USART_LIN_CLASSIC_CHECKSUM);
00650                 // Configure Frame Length
00651                 usart_lin_set_data_length_lin1x(usart_lin_node0);
00652         }
00653 
00654         switch (lin_descript_list_node0[l_handle].l_cmd)
00655         {
00656             // In Publish, the USART Send the Header and the response
00657             case PUBLISH:
00658                   lin_tx_header_and_response(0,l_handle,l_len);
00659               break;
00660             // In Subscribe, the USART Receive the response
00661             case SUBSCRIBE:
00662                   usart_lin_set_id_char(usart_lin_node0,l_id);
00663                   lin_rx_response(0,l_handle,l_len);
00664               break;
00665             default:
00666               break;
00667         }
00668         return PASS;
00669     }
00670     else
00671     {
00672         return FAIL;
00673     }
00674 }
00675 #ifdef USART_LIN_NODE1_INSTANCE
00676 else
00677 {
00678     // Clear error in case of previous communication
00679     usart_reset_status(usart_lin_node1);
00680 
00681     for(index = 0; index < NUMBER_OF_LIN_FRAMES_NODE1; index ++) {
00682         if(lin_descript_list_node1[index].l_id == l_id) {
00683             l_handle = index;
00684               break;
00685         }
00686     }
00687 
00688     if(l_handle != 0xFF) {
00689 
00690         usart_lin_set_node_action(usart_lin_node1,lin_descript_list_node1[l_handle].l_cmd);
00691 
00692 #if USART_LIN_VERSION == LIN_2x
00693         // Configure Parity
00694         usart_lin_enable_parity(usart_lin_node1,TRUE);
00695         // Configure Checksum
00696         usart_lin_enable_checksum(usart_lin_node1,TRUE);
00697         // Configure Checksum Type
00698         usart_lin_set_checksum(usart_lin_node1,USART_LIN_ENHANCED_CHECKSUM);
00699         // Configure Frameslot
00700         usart_lin_enable_frameslot(usart_lin_node1,FALSE);
00701         // Configure Frame Length
00702         usart_lin_set_data_length_lin2x(usart_lin_node1,l_len);
00703 #elif USART_LIN_VERSION == LIN_1x
00704         // Configure Parity
00705         usart_lin_enable_parity(usart_lin_node1,TRUE);
00706         // Configure Checksum
00707         usart_lin_enable_checksum(usart_lin_node1,TRUE);
00708         // Configure Checksum Type
00709         usart_lin_set_checksum(usart_lin_node1,USART_LIN_CLASSIC_CHECKSUM);
00710         // Configure Frameslot
00711         usart_lin_enable_frameslot(usart_lin_node1,FALSE);
00712         // Configure Frame Length
00713         usart_lin_set_data_length_lin1x(usart_lin_node1);
00714 #endif
00715         // Switch to Classic Checksum if diagnostic ID request
00716         if (lin_descript_list_node1[l_handle].l_id>=60)
00717         {
00718                 usart_lin_set_checksum(usart_lin_node1,USART_LIN_CLASSIC_CHECKSUM);
00719                 // Configure Frame Length
00720                 usart_lin_set_data_length_lin1x(usart_lin_node1);
00721         }
00722 
00723         switch (lin_descript_list_node0[l_handle].l_cmd)
00724         {
00725             // In Publish, the USART Send the Header and the response
00726             case PUBLISH:
00727                   lin_tx_header_and_response(1,l_handle,l_len);
00728               break;
00729             // In Subscribe, the USART Receive the response
00730             case SUBSCRIBE:
00731                   usart_lin_set_id_char(usart_lin_node1,l_id);
00732                   lin_rx_response(1,l_handle,l_len);
00733               break;
00734             default:
00735               break;
00736         }
00737         return PASS;
00738     }
00739     else
00740     {
00741         return FAIL;
00742     }
00743 }
00744 #endif
00745 }


Variable Documentation

volatile st_lin_message lin_descript_list_node0[NUMBER_OF_LIN_FRAMES_NODE0]

Array of structure of type:'st_lin_message'. Default: 8 elements.

Definition at line 59 of file lin.c.

Referenced by lin_master_task_ID12(), lin_master_task_ID15(), and main().

volatile U16 lin_error_number_node0

Counter of LIN error. If an error clearly linked to a message (i.e. time-out) the status of this message is written with the error (LINERR).

Definition at line 71 of file lin.c.

Referenced by lin_int_handler_node0().

volatile U8 lin_handle_node0

Index in lin_descript_list[], 'lin_handle' is set after processing IDOK and verified once RXOK or TXOK rises.

Definition at line 65 of file lin.c.

Referenced by lin_int_handler_node0(), lin_pdca_int_rx_handler_node0(), and lin_pdca_int_tx_handler_node0().

volatile U16 lin_last_errors_node0[]

Last error FIFO: lin_handle | status. Default: 4 elements.

Definition at line 77 of file lin.c.

Referenced by lin_int_handler_node0().


Generated on Thu Dec 17 20:02:03 2009 for AVR32 - Service for LIN Management - Example by  doxygen 1.5.5