352
7647H–AVR–03/12
Atmel ATmega16/32/64/M1/C1
30.1.4 Errata Description
1. Inopportune reset of the CANIDM registers
After the reception of a CAN frame in a MOb, the ID mask registers are reset.
Problem fix / workaround
Before enabling a MOb in reception, re-initialize the ID mask registers - CANIDM[4..1].
2. The AMPCMPx bits return 0
When they are read the AMPCMPx bits in AMPxCSR registers return 0.
Problem fix / workaround
If the reading of the AMPCMPx bits is required, store the AMPCMPx value in a variable
in memory before writing in the AMPxCSR register and read the variable when
necessary.
3. No comparison when amplifier is used as comparator input and ADC input
When it is selected as ADC input, an amplifier receives no clock signal when the ADC is
stopped. In that case, if the amplifier is also used as comparator input, no analog signal
is propagated and no comparison is done.
Problem fix / workaround
Select another ADC channel rather than the working amplified channel.
4. CRC calculation of diagnostic frames in LIN 2.x.
Diagnostic frames of LIN 2.x use “classic checksum” calculation. Unfortunately, the set-
ting of the checksum model is enabled when the HEADER is transmitted/received.
Usually, in LIN 2.x the LIN/UART controller is initialized to process “enhanced check-
sums” and a slave task does not know what kind of frame it will work on before
checking the ID.
Problem fix / workaround
This workaround is to be implemented only in case of transmission/reception of diag-
nostics frames.
a. Slave task of master node:
Before enabling the HEADER, the master must set the appropriate LIN13 bitvalue
in LINCR register.
b. For slaves nodes, the workaround is in 2 parts:
– Before enabling the RESPONSE, use the following function:
void lin_wa_head(void) {
unsigned char temp;
temp = LINBTR;
LINCR = 0x00; // It is not a RESET !
LINBTR = (1<<LDISR)|temp;
LINCR = (1<<LIN13)|(1<<LENA)|(0<<LCMD2)|(0<<LCMD1)|(0<<LCMD0);
LINDLR = 0x88; // If it isn't already done
}
– Once the RESPONSE is received or sent (having RxOK or TxOK as well as
LERR), use the following function:
void lin_wa_tail(void) {
LINCR = 0x00; // It is not a RESET !
LINBTR = 0x00;
LINCR = (0<<LIN13)|(1<<LENA)|(0<<LCMD2)|(0<<LCMD1)|(0<<LCMD0);
}
The time-out counter is disabled during the RESPONSE when the workaround is set.