Столкнулся в Keil c такой фишкой: для лакальных и глобальных переменных типа int разная последовательность записи данных.
ex:
sfr16 CAN0DAT= 0xD8;;
int a
void aaa(void)
{ int b;
CAN0DAT = a; // сперва пишет старшую часть слова, затем младшую
...
CAN0DAT = b; // сперва пишет младшую часть слова, затем старшую
}
все бы ничего, и жить можно, но в C8051F04X при записи чтении младшей части слова в CAN происходит автоигкремент адреса, в результате данные попадают не по адресу.
Мелочь а противно, каждый раз по байтам писать.