@@ -646,6 +646,8 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
646
646
#include <string.h>
647
647
#include <inttypes.h>
648
648
649
+ #define DEFAULT_RXFIFO 0 // default rx fifo for can by hardware is FIFO0
650
+
649
651
static uint32_t can_irq_ids [CAN_NUM ] = {0 };
650
652
static can_irq_handler irq_handler ;
651
653
@@ -956,8 +958,10 @@ int can_write(can_t *obj, CAN_Message msg, int cc)
956
958
957
959
int can_read (can_t * obj , CAN_Message * msg , int handle )
958
960
{
961
+
959
962
//handle is the FIFO number
960
963
964
+ int rxfifo_default = DEFAULT_RXFIFO ; //FIFO selection cannot be controlled by software for STM32, default FIFO is 0
961
965
CAN_TypeDef * can = obj -> CanHandle .Instance ;
962
966
963
967
// check FPM0 which holds the pending message count in FIFO 0
@@ -967,36 +971,30 @@ int can_read(can_t *obj, CAN_Message *msg, int handle)
967
971
}
968
972
969
973
/* Get the Id */
970
- msg -> format = (CANFormat )(((uint8_t )0x04 & can -> sFIFOMailBox [handle ].RIR ) >> 2 );
974
+ msg -> format = (CANFormat )(((uint8_t )0x04 & can -> sFIFOMailBox [rxfifo_default ].RIR ) >> 2 );
971
975
if (!msg -> format ) {
972
- msg -> id = (uint32_t )0x000007FF & (can -> sFIFOMailBox [handle ].RIR >> 21 );
976
+ msg -> id = (uint32_t )0x000007FF & (can -> sFIFOMailBox [rxfifo_default ].RIR >> 21 );
973
977
} else {
974
- msg -> id = (uint32_t )0x1FFFFFFF & (can -> sFIFOMailBox [handle ].RIR >> 3 );
978
+ msg -> id = (uint32_t )0x1FFFFFFF & (can -> sFIFOMailBox [rxfifo_default ].RIR >> 3 );
975
979
}
976
980
977
- msg -> type = (CANType )(((uint8_t )0x02 & can -> sFIFOMailBox [handle ].RIR ) >> 1 );
981
+ msg -> type = (CANType )(((uint8_t )0x02 & can -> sFIFOMailBox [rxfifo_default ].RIR ) >> 1 );
978
982
/* Get the DLC */
979
- msg -> len = (uint8_t )0x0F & can -> sFIFOMailBox [handle ].RDTR ;
983
+ msg -> len = (uint8_t )0x0F & can -> sFIFOMailBox [rxfifo_default ].RDTR ;
980
984
/* Get the FMI */
981
- // msg->FMI = (uint8_t)0xFF & (can->sFIFOMailBox[handle ].RDTR >> 8);
985
+ // msg->FMI = (uint8_t)0xFF & (can->sFIFOMailBox[rxfifo_default ].RDTR >> 8);
982
986
/* Get the data field */
983
- msg -> data [0 ] = (uint8_t )0xFF & can -> sFIFOMailBox [handle ].RDLR ;
984
- msg -> data [1 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [handle ].RDLR >> 8 );
985
- msg -> data [2 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [handle ].RDLR >> 16 );
986
- msg -> data [3 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [handle ].RDLR >> 24 );
987
- msg -> data [4 ] = (uint8_t )0xFF & can -> sFIFOMailBox [handle ].RDHR ;
988
- msg -> data [5 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [handle ].RDHR >> 8 );
989
- msg -> data [6 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [handle ].RDHR >> 16 );
990
- msg -> data [7 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [handle ].RDHR >> 24 );
987
+ msg -> data [0 ] = (uint8_t )0xFF & can -> sFIFOMailBox [rxfifo_default ].RDLR ;
988
+ msg -> data [1 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [rxfifo_default ].RDLR >> 8 );
989
+ msg -> data [2 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [rxfifo_default ].RDLR >> 16 );
990
+ msg -> data [3 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [rxfifo_default ].RDLR >> 24 );
991
+ msg -> data [4 ] = (uint8_t )0xFF & can -> sFIFOMailBox [rxfifo_default ].RDHR ;
992
+ msg -> data [5 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [rxfifo_default ].RDHR >> 8 );
993
+ msg -> data [6 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [rxfifo_default ].RDHR >> 16 );
994
+ msg -> data [7 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [rxfifo_default ].RDHR >> 24 );
991
995
992
996
/* Release the FIFO */
993
- if (handle == CAN_FIFO0 ) {
994
- /* Release FIFO0 */
995
- can -> RF0R |= CAN_RF0R_RFOM0 ;
996
- } else { /* FIFONumber == CAN_FIFO1 */
997
- /* Release FIFO1 */
998
- can -> RF1R |= CAN_RF1R_RFOM1 ;
999
- }
997
+ can -> RF0R |= CAN_RF0R_RFOM0 ;
1000
998
1001
999
return 1 ;
1002
1000
}
0 commit comments