@@ -2,9 +2,10 @@ use super::pac;
2
2
use super :: pac:: can:: TX ;
3
3
use crate :: gpio:: gpiob:: { PB8 , PB9 } ;
4
4
use crate :: gpio:: { Alternate , AF4 } ;
5
+ use crate :: rcc:: Rcc ;
5
6
6
7
pub struct CANBus {
7
- can : stm32 :: CAN ,
8
+ can : pac :: CAN ,
8
9
_rx : PB8 < Alternate < AF4 > > ,
9
10
_tx : PB9 < Alternate < AF4 > > ,
10
11
}
@@ -15,17 +16,20 @@ pub enum Event {
15
16
16
17
impl CANBus {
17
18
// TODO add setting of pins the same way as done in other peripherals
18
- pub fn new ( can : pac:: CAN , rx : PB8 < Alternate < AF4 > > , tx : PB9 < Alternate < AF4 > > ) -> Self {
19
- unsafe {
20
- let rcc = & ( * stm32:: RCC :: ptr ( ) ) ;
21
- rcc. apb1enr . modify ( |_, w| w. canen ( ) . enabled ( ) ) ;
22
- rcc. apb1rstr . modify ( |_, w| w. canrst ( ) . reset ( ) ) ;
23
- rcc. apb1rstr . modify ( |_, w| w. canrst ( ) . clear_bit ( ) ) ;
24
- }
19
+ pub fn new (
20
+ can : pac:: CAN ,
21
+ rx : PB8 < Alternate < AF4 > > ,
22
+ tx : PB9 < Alternate < AF4 > > ,
23
+ rcc : & mut Rcc ,
24
+ ) -> Self {
25
+ rcc. regs . apb1enr . modify ( |_, w| w. canen ( ) . enabled ( ) ) ;
26
+ rcc. regs . apb1rstr . modify ( |_, w| w. canrst ( ) . reset ( ) ) ;
27
+ rcc. regs . apb1rstr . modify ( |_, w| w. canrst ( ) . clear_bit ( ) ) ;
25
28
26
29
can. mcr . write ( |w| w. sleep ( ) . clear_bit ( ) ) ;
27
30
can. mcr . modify ( |_, w| w. inrq ( ) . set_bit ( ) ) ;
28
31
while !can. msr . read ( ) . inak ( ) . bit ( ) { }
32
+
29
33
can. mcr . modify ( |_, w| {
30
34
w. ttcm ( )
31
35
. clear_bit ( ) // no time triggered communication
@@ -141,8 +145,7 @@ impl CANBus {
141
145
pub fn read ( & self ) -> nb:: Result < CANFrame , CANError > {
142
146
for ( i, rfr) in self . can . rfr . iter ( ) . enumerate ( ) {
143
147
let pending = rfr. read ( ) . fmp ( ) . bits ( ) ;
144
-
145
- for _ in 0 ..pending {
148
+ if pending > 0 {
146
149
let rx = & self . can . rx [ i] ;
147
150
let id = rx. rir . read ( ) . stid ( ) . bits ( ) ;
148
151
let rtr = rx. rir . read ( ) . rtr ( ) . bit_is_set ( ) ;
0 commit comments