Download presentation
Presentation is loading. Please wait.
1
Controller Area Network bus
2/23/2016 Richard Kuo Assistant Professor
2
Outline 12.NuMicro_CAN.ppt CAN bus introduction
Exercises: CAN Bus Transmission Lab. smpl_CAN_BasicMode_Tx & Rx Lab. smpl_CAN_NormalMode_Tx & Rx Lab. Smpl_CAN_BasicMode_Keypad Project : Elevator Control OBD-II Introduction ISO15765 SAE J1979
3
CAN Network Structure CAN Transceiver MCU CAN2.0 controller CAN- CAN+
4
CAN transceiver & waveform
5
CAN Bus Access & Arbitration
CSMA/CD and AMP Carrier Sense Multiple Access/Collision Detection and Arbitration by Message Priority
6
CAN Bit Coding & Bit Stuffing
Bit Coding : NRZ (Non-Return-To-Zero code) does not ensure enough edges for synchronization Stuff Bits are inserted after 5 consecutive bits of the same level Stuff Bits have the inverse level of the previous bit No deterministic encoding, frame length depends on transmitted data Number of consecutive bits with same polarity
7
CAN basic specification
Prioritization of messages Guarantee of latency times Configuration flexibility Multicast reception with time synchronization System wide data consistency Multimaster Error detection and signaling Automatic retransmission of corrupted messages as soon as the bus is idle again Distinction between temporary errors and permanent failures of nodes and autonomous switching off of defect nodes Reference : Bosch CAN 2.0 specification
8
Layered Structure of CAN node
Application Layer Cortex-M0 MCU Object Layer Message Filtering Message and Status Handling Transfer Layer Fault Confinement Error Detection and Signaling Message Validation Acknowledgement Arbitration Message Framing Transfer rate and Timing CAN2.0b Controller CAN Transceiver Physical Layer Signal Level and Bit Representation Transmission Medium CAN Bus Line Reference : Bosch CAN 2.0 specification
9
ISO standard CAN protocol
ISO11898 is a standard for high-speed CAN communication. Formerly, both the data link and the physical layers were stipulated in ISO It was then separated into ISO , the standard for only the data link layer and ISO , the standard for only the physical layer. On that occasion, several specifications were added to ISO ISO11519 is a standard for low-speed CAN communication for communication speeds up to 125 kbps.
10
Difference between ISO11898 and ISO11519-2
11
OSI Layer
12
CAN layers mapping to OSI reference layers
Reference : ISO :2003 spec
13
CAN properties Transfer rate: 1 Mbps max. Max. message length: 8 bytes
Carrier Sense Multiple Access/Bitwise Arbitration (CSMA/BA) Fault tolerance: 15 bits CRC + ACK Media: twisted pair
14
Data Rate vs. Bus Length Data Rate Length 1 Mbit/s 40 m 500 kbit/s
1 km 10 kbit/s 6 km
15
Frame format
16
NuMicro built-in Bosch CAN2.0b controller
Support CAN protocol version 2.0 part A and B Bit rate up to 1M bit/s 32 Message Objects Each Message Object has its own identifier mask Programmable FIFO mode (concatenation of Message object) Maskable interrupt Disable Automatic Re-transmission mode for Time Triggered CAN application Programmable loop-back mode for self-test operation 16-bit module interface to AMBA APB bus Support wake-up function
17
CAN controller block diagram
CAN Core Message RAM Registers Module Interface Message Handler CAN_WAKEUP 16-bit APB CAN Interrupt CAN_TX CAN_RX
18
Nu-LB-NUC140 connector for CAN
CAN2.0b pin6 CAN+, pin8 CAN-
19
CAN transceiver circuit on Nu-LB-NUC140
20
LIN circuit on Nu-LB-NUC140
21
MCU_Init.h //Define Clock source #define MCU_CLOCK_SOURCE #define MCU_CLOCK_SOURCE_HXT // HXT, LXT, HIRC, LIRC #define MCU_CLOCK_SOURCE_LXT #define MCU_CLOCK_FREQUENCY //Hz //Define MCU Interfaces #define MCU_INTERFACE_CAN #define PIN_CAN0_RX_PD6 #define PIN_CAN0_TX_PD7 #define MCU_INTERFACE_SPI3 #define SPI3_CLOCK_SOURCE_HCLK // HCLK, PLL #define PIN_SPI3_SS0_PD8 #define PIN_SPI3_SCLK_PD9 #define PIN_SPI3_MISO0_PD10 #define PIN_SPI3_MOSI0_PD11
22
CAN_BasicMode Both boards running the same program with CAN connected
RX received and display message (an incrementing number) TX keep sending standard ID 0x701 and data =“CAN nnnn” n is incrementing from 0 to 9999
23
CAN_BasicMode TX Type = Standard ID Id = 0x701
// // smpl_CAN_BasicMode_Rx (without Message RAM) // EVB : Nu-LB-NUC140 // MCU : NUC140VE3CN #include <stdio.h> #include "NUC100Series.h" #include "MCU_init.h" #include "SYS_init.h" #include "can.h" #include “LCD.h" #define CAN_SPEED // 500Kbps #define CAN_MODE CAN_BASIC_MODE // BASIC, NORMAL #define CAN_MSG_NO 0 // 0~31 void CAN_ShowMsg(STR_CANMSG_T* Msg); STR_CANMSG_T rMsg; //Declare a CAN message structure char Text[16]; volatile uint16_t count =0; TX Type = Standard ID Id = 0x701 DLC = 8 (message byte count) DATA=“NUC 0000” RX ShowMessage display Id & Data
24
CAN_MsgInterrupt // ISR to handle CAN interrupt event
void CAN_MsgInterrupt(CAN_T *tCAN, uint32_t u32IIDR) { if(u32IIDR == 1) { sprintf(Text,"Msg-0 INT "); print_Line(3,Text); CAN_Receive(tCAN, 0, &rMsg); CAN_ShowMsg(&rMsg); } if(u32IIDR == 5 + 1) { sprintf(Text,"Msg-5 INT "); CAN_Receive(tCAN, 5, &rMsg); if(u32IIDR == ) { sprintf(Text,"Msg-31 INT "); CAN_Receive(tCAN, 31, &rMsg);
25
CAN0_IRQHandler // CAN0 interrupt handler void CAN0_IRQHandler(void) {
uint32_t u8IIDRstatus; u8IIDRstatus = CAN0->IIDR; if(u8IIDRstatus == 0x ) { // Check Status Interrupt Flag (Error status Int and Status change Int) */ if(CAN0->STATUS & CAN_STATUS_RXOK_Msk) { // check CAN RX status CAN0->STATUS &= ~CAN_STATUS_RXOK_Msk; // clear RxOK status sprintf(Text,"RxOK INT "); print_Line(3, Text); } if(CAN0->STATUS & CAN_STATUS_TXOK_Msk) { // check CAN TX status CAN0->STATUS &= ~CAN_STATUS_TXOK_Msk; // clear TxOK status sprintf(Text,"TxOK INT "); if(CAN0->STATUS & CAN_STATUS_EWARN_Msk) { // check CAN Error status sprintf(Text,"EWARN INT "); print_Line(3, Text); } if(CAN0->STATUS & CAN_STATUS_BOFF_Msk) { // check CAN Bus Off sprintf(Text,"BOFF INT "); } else if(u8IIDRstatus != 0) { sprintf(Text,"Int Ptr=%d", CAN0->IIDR - 1); CAN_MsgInterrupt(CAN0, u8IIDRstatus); CAN_CLR_INT_PENDING_BIT(CAN0, ((CAN0->IIDR) - 1)); // Clear Interrupt Pending } else if(CAN0->WU_STATUS == 1) { sprintf(Text,"Wake up!!! "); CAN0->WU_STATUS = 0; // Write '0' to clear
26
CAN_ShowMsg // Show Message Function
void CAN_ShowMsg(STR_CANMSG_T* Msg) { uint8_t i; sprintf(Text,"ID =0x%X", Msg->Id); print_Line(0, Text); sprintf(Text,"Type=%s",Msg->IdType ? "EXT" : "STD"); print_Line(1, Text); for(i = 0; i < Msg->DLC; i++) sprintf(Text+i,"%c", Msg->Data[i]); print_Line(2, Text); } // Reset message interface parameters void CAN_ResetIF(CAN_T *tCAN, uint8_t u8IF_Num) { if(u8IF_Num > 1) return; tCAN->IF[u8IF_Num].CREQ = 0x0; // set bit15 for sending tCAN->IF[u8IF_Num].CMASK = 0x0; tCAN->IF[u8IF_Num].MASK1 = 0x0; // useless in basic mode tCAN->IF[u8IF_Num].MASK2 = 0x0; // useless in basic mode tCAN->IF[u8IF_Num].ARB1 = 0x0; // ID15~0 tCAN->IF[u8IF_Num].ARB2 = 0x0; // MsgVal, eXt, xmt, ID28~16 tCAN->IF[u8IF_Num].MCON = 0x0; // DLC tCAN->IF[u8IF_Num].DAT_A1 = 0x0; // data0,1 tCAN->IF[u8IF_Num].DAT_A2 = 0x0; // data2,3 tCAN->IF[u8IF_Num].DAT_B1 = 0x0; // data4,5 tCAN->IF[u8IF_Num].DAT_B2 = 0x0; // data6,7 }
27
Init_CAN void Init_CAN(void) { int32_t i32Err = 0;
GPIO_SetMode(PB,12,GPIO_MODE_OUTPUT); // CAN Transceiver setting PB12=0; CAN_Open(CAN0, CAN_SPEED, CAN_MODE); // CAN Frequency = 500KHz if(i32Err < 0) sprintf(Text,"CAN FAIL TO SET"); else sprintf(Text,"CAN=%7d bps",CAN_SPEED); print_Line(0,Text); // Enable CAN interrupt CAN_EnableInt(CAN0, CAN_CON_IE_Msk | CAN_CON_SIE_Msk); // Set Interrupt Priority NVIC_SetPriority(CAN0_IRQn, (1 << __NVIC_PRIO_BITS) - 2); // Enable External Interrupt NVIC_EnableIRQ(CAN0_IRQn); }
28
CAN_Tx() & CAN_Rx() void CAN_Tx(void) {
STR_CANMSG_T msg1; // declare a CAN message structure msg1.FrameType = CAN_DATA_FRAME; msg1.IdType = CAN_STD_ID; // CAN_EXT_ID msg1.Id = 0x701; // 0x7755 msg1.DLC = 8; // Data Length Count = 8 bytes msg1.Data[0] = 'C'; msg1.Data[1] = 'A'; msg1.Data[2] = 'N'; msg1.Data[3] = ' '; msg1.Data[4] = 0x30+count/1000; msg1.Data[5] = 0x30+count%1000/100; msg1.Data[6] = 0x30+count%1000%100/10; msg1.Data[7] = 0x30+count%1000%100%10; count++; if (count>9999) count=0; CAN_Transmit(CAN0, CAN_MSG_NO, &msg1);//Send CAN message CLK_SysTickDelay(100000); } void CAN_Rx(void) { while(CAN_Receive(CAN0, CAN_MSG_NO, &rMsg)== FALSE); CAN_ShowMsg(&rMsg); }
29
main() of TX/RX int main(void) { SYS_Init(); init_LCD(); clear_LCD();
Init_CAN(); while(1) { CAN_Tx(); } CAN_Close(CAN0); // Disable CAN CAN_Stop(); // Disable CAN Clock and Reset it int main(void) { SYS_Init(); init_LCD(); clear_LCD(); Init_CAN(); while(1) { CAN_Rx(); } CAN_Close(CAN0); // Disable CAN CAN_Stop(); // Disable CAN Clock and Reset it
30
CAN_NormalMode Both boards running the same program with CAN connected
RX received and display message (an incrementing number) TX keep sending standard ID 0x701 and data =“CAN nnnn” n is incrementing from 0 to 9999
31
CAN_NormalMode TX Type = Standard ID Id = 0x701
// // smpl_CAN_BasicMode_Rx (with Message RAM) // EVB : Nu-LB-NUC140 // MCU : NUC140VE3CN #include <stdio.h> #include "NUC100Series.h" #include "MCU_init.h" #include "SYS_init.h" #include "can.h" #include “LCD.h" #define CAN_SPEED // 500Kbps #define CAN_MODE CAN_NORMAL_MODE // BASIC, NORMAL #define CAN_MSG_NO 0 // 0~31 void CAN_ShowMsg(STR_CANMSG_T* Msg); STR_CANMSG_T rMsg; //Declare a CAN message structure char Text[16]; volatile uint16_t count =0; TX Type = Standard ID Id = 0x701 DLC = 8 (message byte count) DATA=“NUC 0000” RX ShowMessage display Id & Data
32
Same function calls as BasicMode
CAN_MsgInterrupt CAN0_IRQHandler CAN_ShowMsg CAN_Tx CAN_Rx
33
Init_CAN void Init_CAN(void) { int32_t i32Err = 0;
GPIO_SetMode(PB,12,GPIO_MODE_OUTPUT); // CAN Transceiver setting PB12=0; CAN_Open(CAN0, CAN_SPEED, CAN_MODE); // CAN Frequency = 500KHz if(i32Err < 0) sprintf(Text,"CAN FAIL TO SET"); else sprintf(Text,"CAN=%7d bps",CAN_SPEED); print_Line(0,Text); // Enable CAN interrupt // CAN_EnableInt(CAN0, CAN_CON_IE_Msk | CAN_CON_SIE_Msk); // Set Interrupt Priority // NVIC_SetPriority(CAN0_IRQn, (1 << __NVIC_PRIO_BITS) - 2); // Enable External Interrupt // NVIC_EnableIRQ(CAN0_IRQn); } Interrupt is disable, because Tx will cause message interrupt to itself
34
Elevator System Diagram
35
Emulated Elevator System
CAN bus Elevator Floor Elevator Control Printer Scanner (emulate Elevator) Elevator Cabinet Using NUC140 CAN bus to communicate between floors!
36
Emulated Elevator System
CAN2.0 bus CAN2.0 bus CAN2.0 bus
37
Elevator Control Functions
Elevator Cabinet CAN_TX : Id = 0x700, Data[0] = requested floor_no CAN_RX : display floor_no sent by ID=0x777 Elevator Floor CAN_TX : Id = 0x700+floor_no, Data[0] = ‘U’ or ‘D’ or ‘-’ Elevator Control CAN_TX : Id = 0x777 CAN_RX : see flow chart Timer0_IRQHandler : determine floor_no & direction every second and drive the motor Note: 3 sample codes modified from Smpl_CAN_Keypad
38
Elevator_Cabinet flowchart
CAN_RX print floor_movement on LCD return print floor_no on LCD CAN_Id==0x777 CAN_TX return CAN_Data[0] = requested floor_no CAN_Id = 0x700
39
Elevator_Floor flowchart
CAN_TX return CAN_Data[0] = ‘U’ for Up ‘D’ for Down ‘-’ for No Move CAN_Id = 0x700 + floor_no CAN_RX print floor_movement on LCD return print floor_no on LCD CAN_Id==0x777
40
Elevator_Control CAN_RX flowchart
If (floor_no<f) direction[f] = 1 else if (floor_no>f) direction[f] = -1 else direction[f] = 0 return f = CAN_Data[0] - 0x30 Request[f]++ CAN_Id==0x700 f = CAN_Id - 0x700 Request[f]+=10 Y N If (CAN_Data[0]==‘U’) direction[f]=1 else if (CAM_Data[0]==‘D’) direction[f]=-1 else direction[f] = 0 Elevator panel CAN_Id = 0x700 CAN_Data[0] = floor_no request Floor panel CAN_Id = 0x700 + floor_no CAN_Data[0] = Up/Down request
41
Elevator_Control CAN_RX
void CAN_ShowMsg(STR_CANMSG_T* Msg) { int8_t i,f; sprintf(TEXT1+6,"%x", Msg->Id); print_Line(1,TEXT1); for(i=0;i<Msg->DLC;i++) sprintf(TEXT2+6+i,"%c", Msg->Data[i]); print_Line(2,TEXT2); if (Msg->Id==0x700) { f = Msg->Data[0] - 0x30; request[f]+=10; if (floor_no<f) direction[f]=1; else if (floor_no>f) direction[f]=-1; else direction[f]=0; } else { f = Msg->Id - 0x700; request[f]++; if (Msg->Data[0]=='U') direction[f]=1; else if (Msg->Data[0]=='D') direction[f]=-1; else direction[f]=0; }
42
Elevator_Control Timer0 IRQ Handler
For (i=1;i<floor_no;i++) down_weigth += request[i]; For (i=floor_no+1;i<MAX_FLOOR+1;i++) up_weight += request[i] floor_dir No_move Up Down If (down_wt >up_wt) floor_dir = Down Else if (up_wt<down_wt) floor_dir = Up Else if (up_wt==down_wt && up_wt<>0) floor_dir = no_move Else floor_dir = No_move If (up_wt <>0) floor_dir = Up Else if (down_wt<>0) floor_dir = Down Else floor_dir = No_move If (down_wt <>0) floor_dir = Down Else if (up_wt<>0) floor_dir = Up Else floor_dir = No_move floor_no = floor_no + floor_dir Elevator_move(floor_dir) Y request[floor_no<>0 && floor_dir Elevator_open() N CAN_TX() return
43
Elevator_Control IRQHandler
void TMR0_IRQHandler(void) // Timer0 interrupt subroutine { int8_t i; int16_t up_wt, down_wt; up_wt = 0; down_wt = 0; for (i=1;i<floor_no;i++) down_wt = down_wt + request[i]; for (i=floor_no+1; i<(MAX_FLOOR+1); i++) up_wt = up_wt + request[i]; // To decicde motor moving direction if (floor_dir==1) { if (up_wt !=0) floor_dir=1; else if (down_wt!=0) floor_dir=-1; else floor_dir=0; } else if (floor_dir==-1) { if (down_wt!=0) floor_dir=-1; else if (up_wt !=0) floor_dir=1; else { floor_no = floor_no + floor_dir; Elevator_move(floor_dir); if (request[floor_no]!=0 && floor_dir==0) Elevator_open(); CAN_TX(); // send counter value to CAN bus TIMER0->TISR.TIF = 1; //Write 1 to clear for safty }
44
J1939 Overview J1939 is based on CAN2.0B
Just as CAN is centered around the ID, J1939 is centered around PGN. PGN is defined by the CAN ID. PGN: Parameter Group Number For example, PGN is “Wheel Speed Information”. Data comes in data field. Most PGNs are 8 bytes long. Multibyte variables are sent least significant byte first. Typically 0xFF means “data isn‟t available”, 0xFE means “error”. Valid range is Check MSB for multibyte variables.
45
CAN ID Mapping P: Message priority. Must come first.
EDP: Extended data page. J1939 devices must set to 0. DP: Data page. Used to create a second page of PGNs. PF: PDU format: < 240, PS is destination address. (PDU1 format) >= 240, PS is group extension. (PDU2 format) PS: PDU specific. Either destination address or group extension. SA: Source address of controller application (CA).
46
J1939 PGN Mapping If PF < 240, then PGN = (DP << 9)+(PF<<8), else PGN = (DP << 9)+(PF<<8)+PS Max number of PGNs: (240 + (16 x 256)) x 2) = 8,672
47
J1939 Wheel Speed Information
Example J1939 PGN J1939 Wheel Speed Information PGN: (0xFEBF) Priority: 6 (default) Length: 8 TX Rate: 100 ms SPN Bytes 1-2: Front axle speed Byte 3: Relative, front axle #1, left 905 Byte 4: Relative, front axle #1, right 906 Byte 5: Relative, rear axle #1, left Byte 6: Relative, rear axle #1, right 908 Byte 7: Relative, rear axle #2, left Byte 8: Relative, rear axle #2, right 910
48
J1939 Request PGN PGN: 59904 (0xEA00) Priority: 6 (default) Length: 3
Destination: Global or specific Bytes 1-3: PGN which is being requested
49
J1939 Proprietary A PGN PGN: 61184(0xFEBF) Priority: 6 (default)
Length: 0 to 1785 Destination: Specific Bytes : Manufacture specific Usage should not exceed 2% of network utilization
50
J1939 Proprietary B PGN PGN: 65280 to 65535 (0xFF00 to 0xFFFF))
Priority: 6 (default) Length: 0 to 1785 Destination: Global Bytes : Manufacture specific Usage should not exceed 2% of network utilization
51
OBD-II connector in Vehicle
52
OBD-II (On-Board Diagnosis)
53
OBD-II protocols ISO15765-4 (CAN bus) ISO14230-4 (KWP2000)
Most modern protocol, mandatory for all vehicles sold in US, use pin 6 & 14 ISO CAN (11 bit ID, 500Kbaud) ISO CAN (29 bit ID, 500Kbaud) ISO CAN (11 bit ID, 250Kbaud) ISO CAN (29 bit ID, 250Kbaud) ISO (KWP2000) Common protocol for vehicles using IOS9141 K-Line (pin 7) SAE J1850 VPW Diagnostic bus used mostly on GM vehicles, use pin1 comm speed 10.4kB/sec SAE J1850 PWM Diagnostic bus used mostly on Ford vehicles, use pin1 & 2,comm speed 41.6kB/sec
54
OBD2 to DB9
55
車輛診斷系統 (OBD-II) Digimoto www.digimoto.com EasyOBDII www.easyobdii.com
PCMSCAN ProScan ScanMaster-ELM ScanTool.net
56
OBD-II Simulator 支援 ISO 15765-4 (CAN250/500kbps, 11/29 bit) OBD-II 協定
具備符合 SAE J1962 標準的 OBD-II 母頭 可模擬車輛引擎 ECU,產生符合 SAE J1979 規範之 OBD-II 診斷資料數據,涵蓋車速、引擎轉速、冷卻水水溫、含氧感知器電壓、節氣門位置...等, 總數超過50種以上之 Live Data , Data 數值可由使用者自行設定 可模擬車輛引擎 ECU,產生符合 SAE J2012 規範之 OBD-II 故障碼 (DTC) 資料數據,涵蓋B類(車身)、C類(底盤)、P類(動力傳輸)、U類(車身網路)等OBD-II標準故障碼(DTC)共5000組以上,可模擬超過5000種的 DTC,包含 Stored DTC 與 Pending DTC 等 可模擬車輛ECU,執行SAE J1979規範的Mode 01~Mode 04操作: Mode 01: 目前OBD-II Live Data讀取 Mode 02: 凍結OBD-II Data讀取 (每組DTC會產生一組凍結OBD-II Data,至少包含冷卻水溫度、進氣溫度、進氣壓力、點火正時提前、燃油控制狀態、節氣閥角度、引擎計算負載值、引擎轉速、車速、A/F修正補償量等) Mode 03: 讀取Stored或是Pending DTC Mode 04: 清除DTC OBD Live Data 及 DTC 之 PID 與定義內容可由軟體設定擴充
57
ISO15765 ISO15765-2 CAN Message Format ISO15765-3 UDS on CAN
58
CAN Message Frame Format
59
Protocol Control Information (PCI)
60
Protocol Control Information Types
61
Single Frame
62
First Frame
63
Consecutive Frame
64
Protocol Control Information – Flow Control
65
Protocol Control Information – Flow Control
66
CAN Message Frame Timing
67
CAN Message Frame Timing Parameters
68
Flow Control Requirement
69
Timeout Error Handling
70
Unified Diagnostic Services
UDS (Unified Diagnostic Service) is based on the standards KWP2000 for K-Line and CAN
71
OSI protocols of the wireless diagnostic system
72
ISO14229 – Diagnostic Service List
ISO14299 is a set of standards specifying the implementation of UDS
73
Screenshot of the HMI on the diagnostic tester
74
Software Architecture
Software architecture of the diagnostic tester Software architecture of the on-vehicle ECU
75
The network architecture of self build electric vehicle
76
SAE J1979 define 10 modes 0x01. Show current data
0x02. Show freeze frame data 0x03. Show stored Diagnostic Trouble Codes 0x04. Clear Diagnostic Trouble Codes and stored values 0x05. Test results, oxygen sensor monitoring (non CAN only) 0x06. Test results, other component/system monitoring (Test results, oxygen sensor monitoring for CAN only) 0x07. Show pending Diagnostic Trouble Codes (detected during current or last driving cycle) 0x08. Control operation of on-board component/system 0x09. Request vehicle information 0x0A. Permanent DTC's (Cleared DTC's) Vehicle manufactures are not required to support
77
SAE J1979 standard PIDs
78
SAE J2012 SAE J2012 offer Diagnostic Trouble Code (DTC) and Failure Type Byte (FTB) SAE J2012 was originally developed to meet U.S. OBD requirements for 1996 and later model year vehicles. ISO was based on SAE J1962 and was intended to meet European OBD requirements for 2000 and later model year vehicles. This document is technically equivalent to ISO , with new and revised fault codes included.
79
SAE J1939 map to CAN frame PGN
80
Important Notice ! This educational material are neither intended nor warranted for usage in systems or equipment, any malfunction or failure of which may cause loss of human life, bodily injury or severe property damage. Such applications are deemed, “Insecure Usage”. Insecure usage includes, but is not limited to: equipment for surgical implementation, atomic energy control instruments, airplane or spaceship instruments, the control or operation of dynamic, brake or safety systems designed for vehicular use, traffic signal instruments, all types of safety devices, and other applications intended to support or sustain life. All Insecure Usage shall be made at user’s own risk, and in the event that third parties lay claims to the author as a result of customer’s Insecure Usage, the user shall indemnify the damages and liabilities thus incurred by using this material. Please note that all lecture and sample codes are subject to change without notice. All the trademarks of products and companies mentioned in this material belong to their respective owners.
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.