@@ -100,6 +100,28 @@ const struct zcan_frame test_ext_frame_2 = {
100
100
.data = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 }
101
101
};
102
102
103
+ /**
104
+ * @brief Standard (11-bit) CAN ID RTR frame 1.
105
+ */
106
+ const struct zcan_frame test_std_rtr_frame_1 = {
107
+ .id_type = CAN_STANDARD_IDENTIFIER ,
108
+ .rtr = CAN_REMOTEREQUEST ,
109
+ .id = TEST_CAN_STD_ID_1 ,
110
+ .dlc = 0 ,
111
+ .data = {0 }
112
+ };
113
+
114
+ /**
115
+ * @brief Extended (29-bit) CAN ID RTR frame 1.
116
+ */
117
+ const struct zcan_frame test_ext_rtr_frame_1 = {
118
+ .id_type = CAN_EXTENDED_IDENTIFIER ,
119
+ .rtr = CAN_REMOTEREQUEST ,
120
+ .id = TEST_CAN_EXT_ID_1 ,
121
+ .dlc = 0 ,
122
+ .data = {0 }
123
+ };
124
+
103
125
/**
104
126
* @brief Standard (11-bit) CAN ID filter 1. This filter matches
105
127
* ``test_std_frame_1``.
@@ -196,6 +218,30 @@ const struct zcan_filter test_ext_masked_filter_2 = {
196
218
.id_mask = TEST_CAN_EXT_MASK
197
219
};
198
220
221
+ /**
222
+ * @brief Standard (11-bit) CAN ID RTR filter 1. This filter matches
223
+ * ``test_std_rtr_frame_1``.
224
+ */
225
+ const struct zcan_filter test_std_rtr_filter_1 = {
226
+ .id_type = CAN_STANDARD_IDENTIFIER ,
227
+ .rtr = CAN_REMOTEREQUEST ,
228
+ .id = TEST_CAN_STD_ID_1 ,
229
+ .rtr_mask = 1 ,
230
+ .id_mask = CAN_STD_ID_MASK
231
+ };
232
+
233
+ /**
234
+ * @brief Extended (29-bit) CAN ID RTR filter 1. This filter matches
235
+ * ``test_ext_rtr_frame_1``.
236
+ */
237
+ const struct zcan_filter test_ext_rtr_filter_1 = {
238
+ .id_type = CAN_EXTENDED_IDENTIFIER ,
239
+ .rtr = CAN_REMOTEREQUEST ,
240
+ .id = TEST_CAN_EXT_ID_1 ,
241
+ .rtr_mask = 1 ,
242
+ .id_mask = CAN_EXT_ID_MASK
243
+ };
244
+
199
245
/**
200
246
* @brief Standard (11-bit) CAN ID filter. This filter matches
201
247
* ``TEST_CAN_SOME_STD_ID``.
@@ -585,6 +631,55 @@ static void send_receive(const struct zcan_filter *filter1,
585
631
can_remove_rx_filter (can_dev , filter_id_2 );
586
632
}
587
633
634
+ /**
635
+ * @brief Perform a send/receive test with a set of CAN ID filters and CAN frames, RTR and data
636
+ * frames.
637
+ *
638
+ * @param data_filter CAN data filter
639
+ * @param rtr_filter CAN RTR filter
640
+ * @param data_frame CAN data frame
641
+ * @param rtr_frame CAN RTR frame
642
+ */
643
+ void send_receive_rtr (const struct zcan_filter * data_filter ,
644
+ const struct zcan_filter * rtr_filter ,
645
+ const struct zcan_frame * data_frame ,
646
+ const struct zcan_frame * rtr_frame )
647
+ {
648
+ struct zcan_frame frame ;
649
+ int filter_id ;
650
+ int err ;
651
+
652
+ filter_id = add_rx_msgq (can_dev , rtr_filter );
653
+
654
+ /* Verify that RTR filter does not match data frame */
655
+ send_test_frame (can_dev , data_frame );
656
+ err = k_msgq_get (& can_msgq , & frame , TEST_RECEIVE_TIMEOUT );
657
+ zassert_equal (err , - EAGAIN , "Data frame passed RTR filter" );
658
+
659
+ /* Verify that RTR filter matches RTR frame */
660
+ send_test_frame (can_dev , rtr_frame );
661
+ err = k_msgq_get (& can_msgq , & frame , TEST_RECEIVE_TIMEOUT );
662
+ zassert_equal (err , 0 , "receive timeout" );
663
+ assert_frame_equal (& frame , rtr_frame , 0 );
664
+
665
+ can_remove_rx_filter (can_dev , filter_id );
666
+
667
+ filter_id = add_rx_msgq (can_dev , data_filter );
668
+
669
+ /* Verify that data filter does not match RTR frame */
670
+ send_test_frame (can_dev , rtr_frame );
671
+ err = k_msgq_get (& can_msgq , & frame , TEST_RECEIVE_TIMEOUT );
672
+ zassert_equal (err , - EAGAIN , "RTR frame passed data filter" );
673
+
674
+ /* Verify that data filter matches data frame */
675
+ send_test_frame (can_dev , data_frame );
676
+ err = k_msgq_get (& can_msgq , & frame , TEST_RECEIVE_TIMEOUT );
677
+ zassert_equal (err , 0 , "receive timeout" );
678
+ assert_frame_equal (& frame , data_frame , 0 );
679
+
680
+ can_remove_rx_filter (can_dev , filter_id );
681
+ }
682
+
588
683
/**
589
684
* @brief Test getting the CAN core clock rate.
590
685
*/
@@ -888,6 +983,24 @@ void test_send_receive_msgq(void)
888
983
can_remove_rx_filter (can_dev , filter_id );
889
984
}
890
985
986
+ /**
987
+ * @brief Test send/receive with standard (11-bit) CAN IDs and remote transmission request (RTR).
988
+ */
989
+ void test_send_receive_std_id_rtr (void )
990
+ {
991
+ send_receive_rtr (& test_std_filter_1 , & test_std_rtr_filter_1 ,
992
+ & test_std_frame_1 , & test_std_rtr_frame_1 );
993
+ }
994
+
995
+ /**
996
+ * @brief Test send/receive with extended (29-bit) CAN IDs and remote transmission request (RTR).
997
+ */
998
+ void test_send_receive_ext_id_rtr (void )
999
+ {
1000
+ send_receive_rtr (& test_ext_filter_1 , & test_ext_rtr_filter_1 ,
1001
+ & test_ext_frame_1 , & test_ext_rtr_frame_1 );
1002
+ }
1003
+
891
1004
/**
892
1005
* @brief Test that non-matching CAN frames do not pass a filter.
893
1006
*/
@@ -1038,6 +1151,8 @@ void test_main(void)
1038
1151
ztest_unit_test (test_send_receive_std_id_masked ),
1039
1152
ztest_unit_test (test_send_receive_ext_id_masked ),
1040
1153
ztest_user_unit_test (test_send_receive_msgq ),
1154
+ ztest_user_unit_test (test_send_receive_std_id_rtr ),
1155
+ ztest_user_unit_test (test_send_receive_ext_id_rtr ),
1041
1156
ztest_user_unit_test (test_send_invalid_dlc ),
1042
1157
ztest_unit_test (test_send_receive_wrong_id ),
1043
1158
ztest_user_unit_test (test_recover ),
0 commit comments