В Remote Frame вообще нет поля данных, после DLC сразу CRC идет.
Цитата
There is no DATA FIELD, independent of the values of the DATA LENGTH CODE which may be signed any value within the admissible range 0...8.
The value is the DATA LENGTH CODE of the corresponding DATA FRAME.
(Это из бошевской спецификации CAN, версия Sep. 1991; Part A - page 15, 3.1.2; Part B - page 49, 3.2.2)
Так что если есть хоть один байт данных - то имеется явно Data Frame.
Если RTRMSK обнулить - то фильтр не будет различать Data Frame и Remote Frame с одинаковым ID, примет и то и другое.
Если выставить в 1 - будет приниматься то, что задаёт RTRTAG.
Про IDEMSK я сам плохо понимаю. По идее, его обнуление приведет к приему сообщений как стандартного так и расширенного формата. А вот если 1 - я не нашёл где задаётся, какой формат принимать (бит IDE в CANCDMOB -
"IDE bit of the remote or data frame to send").
В атмеловском CAN Tutorial написано:
Для CAN2.0A:
IDEMSK : Identifier extension mask value : 0 comparison true forced 1 comparison enable (detect CAN2.0b reception while CAN2.0a expected) Для CAN2.0B:
IDEMSK : Identifier extension mask value : 0 comparison true forced 1 comparison enable (detect CAN2.0A reception while CAN2.0B expected)RB0TAG служит для задания значения резервного бита R0, который следует за битом IDE (в стандартном формате CAN2.0B с 11-битным ID) или за R1 (в расширенном формате CAN2.0B с 29-битным ID и в CAN2.0A).
Этот бит
"reserved for future expansion", то есть в нынешних протоколах можно на него забить, и писать 0.
Что интересно, он входит в Control Field, а не в Arbitration Field, и в фильтрации не должен учитываться, по идее. Но в даташите в разделе Acceptance Filter указывается критерий фильтрации: ID + RTR + RBn + IDE
Все-таки попробуйте CANSTMOB=0 прописать сразу после задания CANPAGE, и только потом CANCDMOB=0 .
А еще на всякий случай при настройке принимающего моба в DLC задать 1.