@@ -86,9 +86,10 @@ static void i2c_enable_vector_interrupt(i2c_t *obj, uint32_t handler, int enable
86
86
static void i2c_rollback_vector_interrupt (i2c_t * obj );
87
87
#endif
88
88
89
- #define TRANCTRL_STARTED (1)
90
- #define TRANCTRL_NAKLASTDATA (1 << 1)
91
- #define TRANCTRL_LASTDATANAKED (1 << 2)
89
+ #define TRANCTRL_STARTED (1) // Guard I2C ISR from data transfer prematurely
90
+ #define TRANCTRL_NAKLASTDATA (1 << 1) // Request NACK on last data
91
+ #define TRANCTRL_LASTDATANAKED (1 << 2) // Last data NACKed
92
+ #define TRANCTRL_RECVDATA (1 << 3) // Receive data available
92
93
93
94
uint32_t us_ticker_read (void );
94
95
@@ -592,11 +593,17 @@ static void i2c_irq(i2c_t *obj)
592
593
if ((obj -> i2c .tran_ctrl & TRANCTRL_STARTED ) && obj -> i2c .tran_pos ) {
593
594
if (obj -> i2c .tran_pos < obj -> i2c .tran_end ) {
594
595
if (status == 0x50 || status == 0x58 ) {
595
- * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
596
+ if (obj -> i2c .tran_ctrl & TRANCTRL_RECVDATA ) {
597
+ * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
598
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_RECVDATA ;
599
+ }
596
600
}
597
601
598
602
if (status == 0x58 ) {
599
603
i2c_fsm_tranfini (obj , 1 );
604
+ } else if (obj -> i2c .tran_pos == obj -> i2c .tran_end ) {
605
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
606
+ i2c_disable_int (obj );
600
607
} else {
601
608
uint32_t i2c_ctl = I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk ;
602
609
if ((obj -> i2c .tran_end - obj -> i2c .tran_pos ) == 1 &&
@@ -605,6 +612,7 @@ static void i2c_irq(i2c_t *obj)
605
612
i2c_ctl &= ~I2C_CTL0_AA_Msk ;
606
613
}
607
614
I2C_SET_CONTROL_REG (i2c_base , i2c_ctl );
615
+ obj -> i2c .tran_ctrl |= TRANCTRL_RECVDATA ;
608
616
}
609
617
} else {
610
618
obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
@@ -659,12 +667,18 @@ static void i2c_irq(i2c_t *obj)
659
667
if ((obj -> i2c .tran_ctrl & TRANCTRL_STARTED ) && obj -> i2c .tran_pos ) {
660
668
if (obj -> i2c .tran_pos < obj -> i2c .tran_end ) {
661
669
if (status == 0x80 || status == 0x88 ) {
662
- * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
670
+ if (obj -> i2c .tran_ctrl & TRANCTRL_RECVDATA ) {
671
+ * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
672
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_RECVDATA ;
673
+ }
663
674
}
664
675
665
676
if (status == 0x88 ) {
666
677
obj -> i2c .slaveaddr_state = NoData ;
667
678
i2c_fsm_reset (obj , I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk );
679
+ } else if (obj -> i2c .tran_pos == obj -> i2c .tran_end ) {
680
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
681
+ i2c_disable_int (obj );
668
682
} else {
669
683
uint32_t i2c_ctl = I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk ;
670
684
if ((obj -> i2c .tran_end - obj -> i2c .tran_pos ) == 1 &&
@@ -673,6 +687,7 @@ static void i2c_irq(i2c_t *obj)
673
687
i2c_ctl &= ~I2C_CTL0_AA_Msk ;
674
688
}
675
689
I2C_SET_CONTROL_REG (i2c_base , i2c_ctl );
690
+ obj -> i2c .tran_ctrl |= TRANCTRL_RECVDATA ;
676
691
}
677
692
} else {
678
693
obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
@@ -695,12 +710,18 @@ static void i2c_irq(i2c_t *obj)
695
710
if ((obj -> i2c .tran_ctrl & TRANCTRL_STARTED ) && obj -> i2c .tran_pos ) {
696
711
if (obj -> i2c .tran_pos < obj -> i2c .tran_end ) {
697
712
if (status == 0x90 || status == 0x98 ) {
698
- * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
713
+ if (obj -> i2c .tran_ctrl & TRANCTRL_RECVDATA ) {
714
+ * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
715
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_RECVDATA ;
716
+ }
699
717
}
700
718
701
719
if (status == 0x98 ) {
702
720
obj -> i2c .slaveaddr_state = NoData ;
703
721
i2c_fsm_reset (obj , I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk );
722
+ } else if (obj -> i2c .tran_pos == obj -> i2c .tran_end ) {
723
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
724
+ i2c_disable_int (obj );
704
725
} else {
705
726
uint32_t i2c_ctl = I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk ;
706
727
if ((obj -> i2c .tran_end - obj -> i2c .tran_pos ) == 1 &&
@@ -709,6 +730,7 @@ static void i2c_irq(i2c_t *obj)
709
730
i2c_ctl &= ~I2C_CTL0_AA_Msk ;
710
731
}
711
732
I2C_SET_CONTROL_REG (i2c_base , i2c_ctl );
733
+ obj -> i2c .tran_ctrl |= TRANCTRL_RECVDATA ;
712
734
}
713
735
} else {
714
736
obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
0 commit comments