@@ -81,9 +81,10 @@ static void i2c_enable_vector_interrupt(i2c_t *obj, uint32_t handler, int enable
81
81
static void i2c_rollback_vector_interrupt (i2c_t * obj );
82
82
#endif
83
83
84
- #define TRANCTRL_STARTED (1)
85
- #define TRANCTRL_NAKLASTDATA (1 << 1)
86
- #define TRANCTRL_LASTDATANAKED (1 << 2)
84
+ #define TRANCTRL_STARTED (1) // Guard I2C ISR from data transfer prematurely
85
+ #define TRANCTRL_NAKLASTDATA (1 << 1) // Request NACK on last data
86
+ #define TRANCTRL_LASTDATANAKED (1 << 2) // Last data NACKed
87
+ #define TRANCTRL_RECVDATA (1 << 3) // Receive data available
87
88
88
89
uint32_t us_ticker_read (void );
89
90
@@ -583,11 +584,17 @@ static void i2c_irq(i2c_t *obj)
583
584
if ((obj -> i2c .tran_ctrl & TRANCTRL_STARTED ) && obj -> i2c .tran_pos ) {
584
585
if (obj -> i2c .tran_pos < obj -> i2c .tran_end ) {
585
586
if (status == 0x50 || status == 0x58 ) {
586
- * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
587
+ if (obj -> i2c .tran_ctrl & TRANCTRL_RECVDATA ) {
588
+ * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
589
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_RECVDATA ;
590
+ }
587
591
}
588
592
589
593
if (status == 0x58 ) {
590
594
i2c_fsm_tranfini (obj , 1 );
595
+ } else if (obj -> i2c .tran_pos == obj -> i2c .tran_end ) {
596
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
597
+ i2c_disable_int (obj );
591
598
} else {
592
599
uint32_t i2c_ctl = I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk ;
593
600
if ((obj -> i2c .tran_end - obj -> i2c .tran_pos ) == 1 &&
@@ -596,6 +603,7 @@ static void i2c_irq(i2c_t *obj)
596
603
i2c_ctl &= ~I2C_CTL0_AA_Msk ;
597
604
}
598
605
I2C_SET_CONTROL_REG (i2c_base , i2c_ctl );
606
+ obj -> i2c .tran_ctrl |= TRANCTRL_RECVDATA ;
599
607
}
600
608
} else {
601
609
obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
@@ -650,12 +658,18 @@ static void i2c_irq(i2c_t *obj)
650
658
if ((obj -> i2c .tran_ctrl & TRANCTRL_STARTED ) && obj -> i2c .tran_pos ) {
651
659
if (obj -> i2c .tran_pos < obj -> i2c .tran_end ) {
652
660
if (status == 0x80 || status == 0x88 ) {
653
- * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
661
+ if (obj -> i2c .tran_ctrl & TRANCTRL_RECVDATA ) {
662
+ * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
663
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_RECVDATA ;
664
+ }
654
665
}
655
666
656
667
if (status == 0x88 ) {
657
668
obj -> i2c .slaveaddr_state = NoData ;
658
669
i2c_fsm_reset (obj , I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk );
670
+ } else if (obj -> i2c .tran_pos == obj -> i2c .tran_end ) {
671
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
672
+ i2c_disable_int (obj );
659
673
} else {
660
674
uint32_t i2c_ctl = I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk ;
661
675
if ((obj -> i2c .tran_end - obj -> i2c .tran_pos ) == 1 &&
@@ -664,6 +678,7 @@ static void i2c_irq(i2c_t *obj)
664
678
i2c_ctl &= ~I2C_CTL0_AA_Msk ;
665
679
}
666
680
I2C_SET_CONTROL_REG (i2c_base , i2c_ctl );
681
+ obj -> i2c .tran_ctrl |= TRANCTRL_RECVDATA ;
667
682
}
668
683
} else {
669
684
obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
@@ -686,12 +701,18 @@ static void i2c_irq(i2c_t *obj)
686
701
if ((obj -> i2c .tran_ctrl & TRANCTRL_STARTED ) && obj -> i2c .tran_pos ) {
687
702
if (obj -> i2c .tran_pos < obj -> i2c .tran_end ) {
688
703
if (status == 0x90 || status == 0x98 ) {
689
- * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
704
+ if (obj -> i2c .tran_ctrl & TRANCTRL_RECVDATA ) {
705
+ * obj -> i2c .tran_pos ++ = I2C_GET_DATA (i2c_base );
706
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_RECVDATA ;
707
+ }
690
708
}
691
709
692
710
if (status == 0x98 ) {
693
711
obj -> i2c .slaveaddr_state = NoData ;
694
712
i2c_fsm_reset (obj , I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk );
713
+ } else if (obj -> i2c .tran_pos == obj -> i2c .tran_end ) {
714
+ obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
715
+ i2c_disable_int (obj );
695
716
} else {
696
717
uint32_t i2c_ctl = I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk ;
697
718
if ((obj -> i2c .tran_end - obj -> i2c .tran_pos ) == 1 &&
@@ -700,6 +721,7 @@ static void i2c_irq(i2c_t *obj)
700
721
i2c_ctl &= ~I2C_CTL0_AA_Msk ;
701
722
}
702
723
I2C_SET_CONTROL_REG (i2c_base , i2c_ctl );
724
+ obj -> i2c .tran_ctrl |= TRANCTRL_RECVDATA ;
703
725
}
704
726
} else {
705
727
obj -> i2c .tran_ctrl &= ~TRANCTRL_STARTED ;
0 commit comments