예제 #1
0
파일: i2c_slave.c 프로젝트: amstan/guitar
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);
			}
		}
	}

}
예제 #2
0
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
    }
}
예제 #3
0
파일: i2c.c 프로젝트: 0utsider89/libopencm3
uint8_t i2c_received_data(uint32_t i2c)
{
	if ((I2C_ISR(i2c) & I2C_ISR_RXNE) != 0) {
		return 1;
	}

	return 0;
}
예제 #4
0
파일: i2c.c 프로젝트: 0utsider89/libopencm3
uint8_t i2c_transfer_complete(uint32_t i2c)
{
	if ((I2C_ISR(i2c) & I2C_ISR_TC) != 0) {
		return 1;
	}

	return 0;
}
예제 #5
0
파일: i2c.c 프로젝트: 0utsider89/libopencm3
uint8_t i2c_transmit_int_status(uint32_t i2c)
{
	if ((I2C_ISR(i2c) & I2C_ISR_TXIS) != 0) {
		return 1;
	}

	return 0;
}
예제 #6
0
파일: i2c.c 프로젝트: 0utsider89/libopencm3
uint8_t i2c_busy(uint32_t i2c)
{
	if ((I2C_ISR(i2c) & I2C_ISR_BUSY) != 0) {
		return 1;
	}

	return 0;
}
예제 #7
0
파일: i2c.c 프로젝트: 0utsider89/libopencm3
uint8_t i2c_nack(uint32_t i2c)
{
	if ((I2C_ISR(i2c) & I2C_ISR_NACKF) != 0) {
		return 1;
	}

	return 0;
}
예제 #8
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
    }
}
예제 #9
0
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;
    }
}
예제 #10
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();
}
예제 #11
0
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
    }
}