This file contains basic functions for the AVR32 USART, with support for all modes, settings and clock speeds.
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 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) |
#define NUMBER_OF_LIN_FRAMES_NODE0 8 |
Definition at line 69 of file lin.h.
Referenced by lin_int_handler_node0(), lin_pdca_int_rx_handler_node0(), lin_pdca_int_tx_handler_node0(), and lin_send_cmd().
enum enum_lin_cmd |
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.
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;
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.
master | TRUE for master, FALSE for slave | |
b_rate | Baudrate Value | |
l_node | Node Value | |
pba_hz | PBA Value |
master | TRUE for master, FALSE for slave | |
l_node | Node Value | |
b_rate | Baudrate Value | |
pba_hz | PBA Value |
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.
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 |
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’. |
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 }
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().