99 panic:: PanicInfo ,
1010 sync:: atomic:: { compiler_fence, Ordering } ,
1111 } ,
12- hal:: { gpio:: p0:: Parts , pac:: TWIS0 , twis:: * } ,
12+ hal:: { gpio:: p0:: Parts , gpiote :: Gpiote , pac:: TWIS0 , twis:: * } ,
1313 nrf52840_hal as hal,
1414 rtt_target:: { rprintln, rtt_init_print} ,
1515} ;
1616
17+ type DmaBuffer = & ' static mut [ u8 ; 8 ] ;
18+
1719pub enum TwisTransfer {
18- Running ( Transfer < TWIS0 , & ' static mut [ u8 ; 8 ] > ) ,
19- Idle ( ( & ' static mut [ u8 ; 8 ] , Twis < TWIS0 > ) ) ,
20+ Running ( Transfer < TWIS0 , DmaBuffer > ) ,
21+ Idle ( ( DmaBuffer , Twis < TWIS0 > ) ) ,
2022}
2123
2224#[ rtic:: app( device = crate :: hal:: pac, peripherals = true ) ]
2325const APP : ( ) = {
2426 struct Resources {
27+ gpiote : Gpiote ,
2528 transfer : Option < TwisTransfer > ,
2629 }
2730
@@ -42,29 +45,52 @@ const APP: () = {
4245 . enable_interrupt ( TwiEvent :: Stopped )
4346 . enable ( ) ;
4447
48+ let btn = p0. p0_29 . into_pullup_input ( ) . degrade ( ) ;
49+ let gpiote = Gpiote :: new ( ctx. device . GPIOTE ) ;
50+ gpiote. port ( ) . input_pin ( & btn) . low ( ) ;
51+ gpiote. port ( ) . enable_interrupt ( ) ;
52+
4553 init:: LateResources {
54+ gpiote,
4655 transfer : Some ( TwisTransfer :: Idle ( ( BUF , twis) ) ) ,
4756 }
4857 }
4958
59+ #[ task( binds = GPIOTE , resources = [ gpiote, transfer] ) ]
60+ fn on_gpiote ( ctx : on_gpiote:: Context ) {
61+ ctx. resources . gpiote . reset_events ( ) ;
62+ rprintln ! ( "Reset buffer" ) ;
63+ let transfer = ctx. resources . transfer ;
64+ let ( buf, twis) = match transfer. take ( ) . unwrap ( ) {
65+ TwisTransfer :: Running ( t) => t. wait ( ) ,
66+ TwisTransfer :: Idle ( t) => t,
67+ } ;
68+ buf. copy_from_slice ( & [ 0 ; 8 ] [ ..] ) ;
69+ rprintln ! ( "{:?}" , buf) ;
70+ transfer. replace ( TwisTransfer :: Idle ( ( buf, twis) ) ) ;
71+ }
72+
5073 #[ task( binds = SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0 , resources = [ transfer] ) ]
5174 fn on_twis ( ctx : on_twis:: Context ) {
52- let ( buf, twis) = match ctx. resources . transfer . take ( ) . unwrap ( ) {
75+ let transfer = ctx. resources . transfer ;
76+ let ( buf, twis) = match transfer. take ( ) . unwrap ( ) {
5377 TwisTransfer :: Running ( t) => t. wait ( ) ,
5478 TwisTransfer :: Idle ( t) => t,
5579 } ;
5680 if twis. is_event_triggered ( TwiEvent :: Read ) {
5781 twis. reset_event ( TwiEvent :: Read ) ;
5882 rprintln ! ( "READ command received" ) ;
59- * ctx. resources . transfer = Some ( TwisTransfer :: Running ( twis. tx ( buf) . unwrap ( ) ) ) ;
83+ let tx = twis. tx ( buf) . unwrap ( ) ;
84+ transfer. replace ( TwisTransfer :: Running ( tx) ) ;
6085 } else if twis. is_event_triggered ( TwiEvent :: Write ) {
6186 twis. reset_event ( TwiEvent :: Write ) ;
6287 rprintln ! ( "WRITE command received" ) ;
63- * ctx. resources . transfer = Some ( TwisTransfer :: Running ( twis. rx ( buf) . unwrap ( ) ) ) ;
88+ let rx = twis. rx ( buf) . unwrap ( ) ;
89+ transfer. replace ( TwisTransfer :: Running ( rx) ) ;
6490 } else {
6591 twis. reset_event ( TwiEvent :: Stopped ) ;
6692 rprintln ! ( "{:?}" , buf) ;
67- * ctx . resources . transfer = Some ( TwisTransfer :: Idle ( ( buf, twis) ) ) ;
93+ transfer. replace ( TwisTransfer :: Idle ( ( buf, twis) ) ) ;
6894 }
6995 }
7096} ;
0 commit comments