예제 #1
0
/* I2C Slave with Interrupt Init */
void I2C_SlaveWithInterrupt_Init(I2C_TypeDef* I2Cx, uint32_t freq, int SlaveAddr, pin_t scl, pin_t sda){
	NVIC_InitTypeDef i2c_slave_nvic;
	uint8_t _i2c_er_irq;
	
	I2C_Master_Init(I2Cx, freq, scl, sda);
	I2C_Slave_Mode(I2Cx, 1);
	I2C_Slave_Address(I2Cx, SlaveAddr);
	
	/* Configure the Priority Group to 1 bit */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	if(I2Cx == I2C1){
		_i2c_er_irq = I2C1_ER_IRQn;
		i2c_slave_nvic.NVIC_IRQChannel = I2C1_EV_IRQn;
	}else if(I2Cx == I2C2){
		_i2c_er_irq = I2C2_ER_IRQn;
		i2c_slave_nvic.NVIC_IRQChannel = I2C2_EV_IRQn;
	}
	i2c_slave_nvic.NVIC_IRQChannelPreemptionPriority = 1;
  i2c_slave_nvic.NVIC_IRQChannelSubPriority = 0;
  i2c_slave_nvic.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&i2c_slave_nvic);
	
	i2c_slave_nvic.NVIC_IRQChannel = _i2c_er_irq;
	NVIC_Init(&i2c_slave_nvic);
	
	/* Enable Error Interrupt */
  I2C_ITConfig(I2Cx, (I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE);
}
예제 #2
0
	//*********************************************************
	void I2C_Main()
	{
		char i;
		#if Slave_Mode == 1
			if(I2C->SlaveGO)
			{		
				I2C->SlaveGO=0;
				I2C_Slave_Mode();
				SSPIE=1;
	
				if(I2C->SlaveTxGO)
				{
					I2C->SlaveTxGO=0;
					SS1=0;
					I2C->SS=0;
				}
				if(I2C->SlaveRxGO)
				{
					I2C->SlaveRxGO=0;
					I2C_SetData(0);
				}
				LED2=~LED2;
			}
		#endif

		#if Master_Mode == 1

			if(I2C->MasterRxGO)
			{
				I2C->MasterRxGO=0;
				I2C_Master_Reception();
				TMain->Test=1;
				LED2=~LED2;
				#if UART_use == 1
					for(i=0;i<32;i++)
					{
						UART->TxData[i]=I2C->BufferReader[i];		
					}
					UART->TxGO=1;	
				#endif
			}
			else
			{
				if(SS1)
				{
					if(!I2C->SS)
					{
						I2C->SS=1;
						I2C->MasterRxGO=1;
					}
				}
				else
				{
					if(I2C->SS)
					{
						I2C->SS=0;
					}
					if(I2C->MasterTxGO)
					{
						I2C->MasterTxGO=0;
						I2C_Master_Transmission();
					}	
				}
			}

		#endif
	}
예제 #3
0
/* I2C Slave Init */
void I2C_Slave_Init(I2C_TypeDef* I2Cx, uint32_t freq, int SlaveAddr, pin_t scl, pin_t sda){
	I2C_Master_Init(I2Cx, freq, scl, sda);
	I2C_Slave_Mode(I2Cx, 1);
	I2C_Slave_Address(I2Cx, SlaveAddr);
}