1
1
use crate :: error:: Error ;
2
2
use crate :: error:: ErrorKind :: I2cNoAck ;
3
3
use crate :: { FtInner , PinUse } ;
4
- use eh1:: i2c:: { Operation , SevenBitAddress } ;
4
+ use eh1:: i2c:: { NoAcknowledgeSource , Operation , SevenBitAddress } ;
5
5
use ftdi_mpsse:: { ClockBitsIn , ClockBitsOut , MpsseCmdBuilder , MpsseCmdExecutor } ;
6
6
use std:: sync:: { Arc , Mutex } ;
7
7
@@ -97,14 +97,22 @@ where
97
97
98
98
/// Enable faster I2C transactions by sending commands in a single write.
99
99
///
100
- /// This is disabled by default.
100
+ /// This is disabled by default, and currently has no effect when using
101
+ /// version 1 of the `embedded-hal` traits.
101
102
///
102
103
/// Normally the I2C methods will send commands with a delay after each
103
104
/// slave ACK to read from the USB device.
104
105
/// Enabling this will send I2C commands without a delay, but slave ACKs
105
106
/// will only be checked at the end of each call to `read`, `write`, or
106
107
/// `write_read`.
107
108
///
109
+ /// Additionally this changes the type of errors that can occur:
110
+ ///
111
+ /// * enabled: NAK errors will be reported as
112
+ /// `NoAcknowledgeSource::Unknown`.
113
+ /// * disabled: NAK errors will be reported as
114
+ /// `NoAcknowledgeSource::Address` or `NoAcknowledgeSource::Data`.
115
+ ///
108
116
/// # Example
109
117
///
110
118
/// ```no_run
@@ -188,7 +196,7 @@ where
188
196
lock. ft . recv ( buffer) ?;
189
197
190
198
if ( ack_buf[ 0 ] & 0b1 ) != 0x00 {
191
- return Err ( Error :: Hal ( I2cNoAck ) ) ;
199
+ return Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Unknown ) ) ) ;
192
200
}
193
201
194
202
Ok ( ( ) )
@@ -221,7 +229,7 @@ where
221
229
let mut ack_buf: [ u8 ; 1 ] = [ 0 ; 1 ] ;
222
230
lock. ft . recv ( & mut ack_buf) ?;
223
231
if ( ack_buf[ 0 ] & 0b1 ) != 0x00 {
224
- return Err ( Error :: Hal ( I2cNoAck ) ) ;
232
+ return Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Address ) ) ) ;
225
233
}
226
234
227
235
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder :: new ( ) ;
@@ -318,7 +326,7 @@ where
318
326
let mut ack_buf: Vec < u8 > = vec ! [ 0 ; 1 + bytes. len( ) ] ;
319
327
lock. ft . recv ( ack_buf. as_mut_slice ( ) ) ?;
320
328
if ack_buf. iter ( ) . any ( |& ack| ( ack & 0b1 ) != 0x00 ) {
321
- Err ( Error :: Hal ( I2cNoAck ) )
329
+ Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Unknown ) ) )
322
330
} else {
323
331
Ok ( ( ) )
324
332
}
@@ -351,7 +359,7 @@ where
351
359
let mut ack_buf: [ u8 ; 1 ] = [ 0 ; 1 ] ;
352
360
lock. ft . recv ( & mut ack_buf) ?;
353
361
if ( ack_buf[ 0 ] & 0b1 ) != 0x00 {
354
- return Err ( Error :: Hal ( I2cNoAck ) ) ;
362
+ return Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Address ) ) ) ;
355
363
}
356
364
357
365
for ( idx, byte) in bytes. iter ( ) . enumerate ( ) {
@@ -388,7 +396,7 @@ where
388
396
let mut ack_buf: [ u8 ; 1 ] = [ 0 ; 1 ] ;
389
397
lock. ft . recv ( & mut ack_buf) ?;
390
398
if ( ack_buf[ 0 ] & 0b1 ) != 0x00 {
391
- return Err ( Error :: Hal ( I2cNoAck ) ) ;
399
+ return Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Data ) ) ) ;
392
400
}
393
401
}
394
402
@@ -493,7 +501,7 @@ where
493
501
lock. ft . recv ( buffer) ?;
494
502
495
503
if ack_buf. iter ( ) . any ( |& ack| ( ack & 0b1 ) != 0x00 ) {
496
- Err ( Error :: Hal ( I2cNoAck ) )
504
+ Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Unknown ) ) )
497
505
} else {
498
506
Ok ( ( ) )
499
507
}
@@ -534,7 +542,7 @@ where
534
542
let mut ack_buf: [ u8 ; 1 ] = [ 0 ; 1 ] ;
535
543
lock. ft . recv ( & mut ack_buf) ?;
536
544
if ( ack_buf[ 0 ] & 0b1 ) != 0x00 {
537
- return Err ( Error :: Hal ( I2cNoAck ) ) ;
545
+ return Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Address ) ) ) ;
538
546
}
539
547
540
548
for byte in bytes {
@@ -551,7 +559,7 @@ where
551
559
let mut ack_buf: [ u8 ; 1 ] = [ 0 ; 1 ] ;
552
560
lock. ft . recv ( & mut ack_buf) ?;
553
561
if ( ack_buf[ 0 ] & 0b1 ) != 0x00 {
554
- return Err ( Error :: Hal ( I2cNoAck ) ) ;
562
+ return Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Data ) ) ) ;
555
563
}
556
564
}
557
565
@@ -579,7 +587,7 @@ where
579
587
let mut ack_buf: [ u8 ; 1 ] = [ 0 ; 1 ] ;
580
588
lock. ft . recv ( & mut ack_buf) ?;
581
589
if ( ack_buf[ 0 ] & 0b1 ) != 0x00 {
582
- return Err ( Error :: Hal ( I2cNoAck ) ) ;
590
+ return Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Data ) ) ) ;
583
591
}
584
592
585
593
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder :: new ( ) ;
@@ -622,7 +630,7 @@ where
622
630
Ok ( ( ) )
623
631
}
624
632
625
- fn transaction_slow (
633
+ fn transaction (
626
634
& mut self ,
627
635
address : u8 ,
628
636
operations : & mut [ Operation < ' _ > ] ,
@@ -641,13 +649,13 @@ where
641
649
}
642
650
lock. ft . send ( mpsse_cmd. as_slice ( ) ) ?;
643
651
644
- let mut last_op_was_a_read = false ;
652
+ let mut prev_op_was_a_read : bool = false ;
645
653
for ( idx, operation) in operations. iter_mut ( ) . enumerate ( ) {
646
654
match operation {
647
655
Operation :: Read ( buffer) => {
648
656
assert ! ( !buffer. is_empty( ) , "buffer must be a non-empty slice" ) ;
649
657
650
- if idx == 0 || !last_op_was_a_read {
658
+ if idx == 0 || !prev_op_was_a_read {
651
659
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder :: new ( ) ;
652
660
if idx != 0 {
653
661
// SR
@@ -680,7 +688,7 @@ where
680
688
let mut ack_buf: [ u8 ; 1 ] = [ 0 ; 1 ] ;
681
689
lock. ft . recv ( & mut ack_buf) ?;
682
690
if ( ack_buf[ 0 ] & 0b1 ) != 0x00 {
683
- return Err ( Error :: Hal ( I2cNoAck ) ) ;
691
+ return Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Address ) ) ) ;
684
692
}
685
693
}
686
694
@@ -704,12 +712,12 @@ where
704
712
lock. ft . send ( mpsse_cmd. as_slice ( ) ) ?;
705
713
lock. ft . recv ( buffer) ?;
706
714
707
- last_op_was_a_read = true ;
715
+ prev_op_was_a_read = true ;
708
716
}
709
717
Operation :: Write ( bytes) => {
710
718
assert ! ( !bytes. is_empty( ) , "bytes must be a non-empty slice" ) ;
711
719
712
- if idx == 0 || last_op_was_a_read {
720
+ if idx == 0 || prev_op_was_a_read {
713
721
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder :: new ( ) ;
714
722
if idx != 0 {
715
723
// SR
@@ -742,7 +750,7 @@ where
742
750
let mut ack_buf: [ u8 ; 1 ] = [ 0 ; 1 ] ;
743
751
lock. ft . recv ( & mut ack_buf) ?;
744
752
if ( ack_buf[ 0 ] & 0b1 ) != 0x00 {
745
- return Err ( Error :: Hal ( I2cNoAck ) ) ;
753
+ return Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Address ) ) ) ;
746
754
}
747
755
}
748
756
@@ -761,11 +769,11 @@ where
761
769
let mut ack_buf: [ u8 ; 1 ] = [ 0 ; 1 ] ;
762
770
lock. ft . recv ( & mut ack_buf) ?;
763
771
if ( ack_buf[ 0 ] & 0b1 ) != 0x00 {
764
- return Err ( Error :: Hal ( I2cNoAck ) ) ;
772
+ return Err ( Error :: Hal ( I2cNoAck ( NoAcknowledgeSource :: Data ) ) ) ;
765
773
}
766
774
}
767
775
768
- last_op_was_a_read = false ;
776
+ prev_op_was_a_read = false ;
769
777
}
770
778
}
771
779
}
@@ -790,14 +798,6 @@ where
790
798
791
799
Ok ( ( ) )
792
800
}
793
-
794
- fn transaction_fast (
795
- & mut self ,
796
- _address : u8 ,
797
- _operations : & mut [ Operation < ' _ > ] ,
798
- ) -> Result < ( ) , Error < E > > {
799
- unimplemented ! ( )
800
- }
801
801
}
802
802
803
803
impl < Device , E > eh0:: blocking:: i2c:: Read for I2c < Device >
@@ -871,10 +871,6 @@ where
871
871
address : SevenBitAddress ,
872
872
operations : & mut [ Operation < ' _ > ] ,
873
873
) -> Result < ( ) , Self :: Error > {
874
- if self . fast {
875
- self . transaction_fast ( address, operations)
876
- } else {
877
- self . transaction_slow ( address, operations)
878
- }
874
+ self . transaction ( address, operations)
879
875
}
880
876
}
0 commit comments