void i2c1_isr(void) { //WARNING: prints in here are a bad idea static int i=0; uint32_t isr = I2C_ISR(I2C_BUS); if (isr & I2C_ISR_RXNE) { //do this first so we don't lose a char if other events are happening volatile uint8_t byte = I2C_RXDR(I2C_BUS); i2c_rx_buf[i2c_rx_bytes++] = byte; // printf("rx 0x%02x\n", byte); } if (isr & I2C_ISR_ADDR) { // printf("\n"); // printf("\naddress match 0x%04lx dir%d\n", I2C_ISR_ADDCODE_VALG(isr), !!(isr & I2C_ISR_DIR)); I2C_ICR(I2C_BUS) = I2C_ICR_ADDRCF; i2c_rx_bytes = 0; i2c_tx_bytes = 0; if (isr & I2C_ISR_DIR) { I2C_ISR(I2C_BUS) |= I2C_ISR_TXE; } } if ((isr & (I2C_ISR_TXIS | I2C_ISR_DIR)) == (I2C_ISR_TXIS | I2C_ISR_DIR)) { if(!(isr & I2C_ISR_STOPF)) { volatile uint8_t byte = i2c_tx_buf[i2c_tx_bytes++]; I2C_TXDR(I2C_BUS) = byte; // printf("t"); } // printf("i0x%08lx\n", isr); } if (isr & I2C_ISR_STOPF) { // printf("stop dir%d\n", !!(isr & I2C_ISR_DIR)); if(!(isr & I2C_ISR_DIR)) { handle_i2c_bufs(); } I2C_ICR(I2C_BUS) = I2C_ICR_STOPCF; I2C_TXDR(I2C_BUS) = 0; //hack to avoid another txis interrupt at the end } if (isr & I2C_ISR_NACKF) { // printf("nack\n"); I2C_ICR(I2C_BUS) = I2C_ICR_NACKCF; } if (isr & 0x3f00) { i++; if(i>10) { while(1) { // printf("i2c error 0x%08lx\n", isr); } } } }
void interrupt INTERRUPT_InterruptManager (void) { // interrupt handler if(INTCONbits.PEIE == 1 && PIE1bits.SSP1IE == 1 && PIR1bits.SSP1IF == 1) { I2C_ISR(); } else if(INTCONbits.PEIE == 1 && PIE2bits.BCL1IE == 1 && PIR2bits.BCL1IF == 1) { I2C_BusCollisionISR(); } else if(INTCONbits.PEIE == 1 && PIE1bits.TXIE == 1 && PIR1bits.TXIF == 1) { EUSART_Transmit_ISR(); } else if(INTCONbits.PEIE == 1 && PIE1bits.RCIE == 1 && PIR1bits.RCIF == 1) { EUSART_Receive_ISR(); } else if(INTCONbits.PEIE == 1 && PIE1bits.TMR2IE == 1 && PIR1bits.TMR2IF == 1) { TMR2_ISR(); } else { //Unhandled Interrupt } }
uint8_t i2c_received_data(uint32_t i2c) { if ((I2C_ISR(i2c) & I2C_ISR_RXNE) != 0) { return 1; } return 0; }
uint8_t i2c_transfer_complete(uint32_t i2c) { if ((I2C_ISR(i2c) & I2C_ISR_TC) != 0) { return 1; } return 0; }
uint8_t i2c_transmit_int_status(uint32_t i2c) { if ((I2C_ISR(i2c) & I2C_ISR_TXIS) != 0) { return 1; } return 0; }
uint8_t i2c_busy(uint32_t i2c) { if ((I2C_ISR(i2c) & I2C_ISR_BUSY) != 0) { return 1; } return 0; }
uint8_t i2c_nack(uint32_t i2c) { if ((I2C_ISR(i2c) & I2C_ISR_NACKF) != 0) { return 1; } return 0; }
void interrupt INTERRUPT_InterruptManager(void) { // interrupt handler if (PIE1bits.TMR2IE == 1 && PIR1bits.TMR2IF == 1) { TMR2_ISR(); } else if (PIE1bits.SSPIE == 1 && PIR1bits.SSPIF == 1) { I2C_ISR(); } else if (INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1) { TMR0_ISR(); } else { //Unhandled Interrupt } }
void interrupt ISR(void) { USB_CDC_ISR(); UART_ISR(); I2C_ISR(); if (INTCONbits.T0IF && INTCONbits.T0IE) { INTCONbits.T0IF = 0; } if (PIR1bits.TMR1IF && PIE1bits.TMR1IE) { PIR1bits.TMR1IF = 0; TMR1H = 0xC0; } if (PIR2bits.TMR3IF && PIE2bits.TMR3IE) { PIR2bits.TMR3IF = 0; } }
//ISR void interrupt ISR(void)// interrupt 0 // ISR (Interrupt Service Routines) { IOC_ISR(); TMR0_ISR(); TMR1_ISR(); // TMR2_ISR(); INT_ISR(); UART_ISR(); I2C_ISR(); }
void interrupt INTERRUPT_InterruptManager (void) { // interrupt handler if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1) { TMR0_ISR(); } else if(PIE1bits.SSPIE == 1 && PIR1bits.SSPIF == 1) { I2C_ISR(); } else if(PIE1bits.RCIE == 1 && PIR1bits.RCIF == 1) { EUSART_Receive_ISR(); } else if(PIE1bits.TXIE == 1 && PIR1bits.TXIF == 1) { EUSART_Transmit_ISR(); } else { //Unhandled Interrupt } }