Пример #1
0
 void IIC_Read_Byte(unsigned char ack,unsigned char *data)
 {
	 unsigned char i;
	 unsigned char receive=0;
	 
	 SDA_IN();
	 
	 for(i=0; i<8; i++)
	 {
		 IIC_SCL(0);
		 delay_us(2);
		 IIC_SCL(1);
		 
		 receive <<= 1;
		 
		 if(READ_SDA)receive++;
		 
		 delay_us(1);
	 }
	 
	 *data = receive;
	 
	 if (!ack)
		IIC_NAck();
	 else
		IIC_Ack();
	 
 }
Пример #2
0
uint8_t IIC_Wait_Ack(void)
{
	uint8_t ucErrTime = 0;
	
	SDA_IN();
	IIC_SDA(1);
	delay_us(1);
	IIC_SCL(1);
	delay_us(1);
	
	while(READ_SDA)
	{
		ucErrTime++;
		
		if(ucErrTime>250)
		{
			IIC_Stop();
			return 1;
		}
	}
	
	IIC_SCL(0);
	
	return 0;
}
Пример #3
0
//不产生ACK应答		    
static void IIC_NAck(void)
{
	SDA_OUT();
	IIC_SDA(1);
	IIC_SCL(1);
    I2C_delay();
	IIC_SCL(0);
	I2C_delay();
}					 	
Пример #4
0
static void IIC_NAck(void)
{
  IIC_SCL(0);
  SDA_OUT();
  IIC_SDA(1);
  delay_us(2);
  IIC_SCL(1);
  delay_us(2);
  IIC_SCL(0);
}	
Пример #5
0
static void IIC_Stop(void)
{
	SDA_OUT();
	IIC_SCL(0);
	IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
	delay_us(4);
	IIC_SCL(1);
	IIC_SDA(1);
	delay_us(4);
}
Пример #6
0
static void IIC_Start(void)
{
	SDA_OUT();     
	IIC_SDA(1);
	IIC_SCL(1);
	delay_us(4);
	IIC_SDA(0);	
	delay_us(4);
	IIC_SCL(0);
}
Пример #7
0
//产生IIC起始信号
static bool IIC_Start(void)
{
	SDA_OUT();     //sda线输出
	IIC_SDA(1);	  	  
	IIC_SCL(1);
	I2C_delay();
 	IIC_SDA(0);//START:when CLK is high,DATA change form high to low 
	I2C_delay();
	IIC_SCL(0);//钳住I2C总线,准备发送或接收数据 
	return TRUE ;
}	  
Пример #8
0
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
static void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
   	SDA_OUT(); 	    
    for(t=0;t<8;t++)
    {   
        IIC_SDA((txd&0x80)>>7);
        txd<<=1; 
		IIC_SCL(1);		
		I2C_delay();
		IIC_SCL(0);
		I2C_delay();
	}	 
} 	
Пример #9
0
//等待应答信号到来
//返回值:FALSE,接收应答失败
//        TRUE,接收应答成功
static bool IIC_Wait_Ack(void)
{
	SDA_IN();      //SDA设置为输入  
	IIC_SCL(1);
	I2C_delay();
	if(READ_SDA)
	{
		IIC_SCL(0);
		I2C_delay();
        return FALSE;
	}
	IIC_SCL(0);//时钟输出0 	 
	I2C_delay();	
	return TRUE;  
} 
Пример #10
0
//产生IIC停止信号
static void IIC_Stop(void)
{
	SDA_OUT();//sda线输出
	IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
	IIC_SCL(1); 
	I2C_delay();
	IIC_SDA(1);//发送I2C总线结束信号
	I2C_delay();
}
Пример #11
0
static void IIC_Send_Byte(uint8_t txd)
{
	uint8_t t;
	
	SDA_OUT();
	IIC_SCL(0);
	
	for(t=0; t<8; t++)
	{
		IIC_SDA((txd&0x80)>>7);
		txd<<=1;
		delay_us(2);   
		IIC_SCL(1);
		delay_us(2);
		IIC_SCL(0);
		delay_us(2);
	}
}
Пример #12
0
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
static u8 IIC_Read_Byte(unsigned char ack)
{
	unsigned char i,receive=0;
	IIC_SDA(1);
	SDA_IN();//SDA设置为输入
	for(i=0;i<8;i++ )
	{
        receive<<=1;
        IIC_SCL(1);
		I2C_delay();
		if(READ_SDA)receive |= 0x01;
		IIC_SCL(0);
		I2C_delay();      
	}
    if (ack)
		IIC_Ack(); //发送ACK   
    else
		IIC_NAck();//发送nACK 
    return receive;
}
Пример #13
0
void I2C_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(IIC_GPIO_CLK, ENABLE );	
	GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN | IIC_SDA_PIN;// 配置 CLK 和 SDA
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//GPIO_Mode_Out_PP;//   //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//GPIO_Speed_50MHz;
	GPIO_Init(IIC_GPIO, &GPIO_InitStructure);
	GPIO_SetBits(IIC_GPIO,IIC_SCL_PIN | IIC_SDA_PIN);
 
	IIC_SCL(1);//空闲时总线为高
	IIC_SDA(1);
}
Пример #14
0
static void IIC_Send_Byte(uint8_t txd)
{
  uint8_t t;   
  SDA_OUT();
  IIC_SCL(0);
  for(t=0;t<8;t++)
    {
      //IIC_SDA=(txd&0x80)>>7;
      if((txd&0x80)>>7)
      {
        IIC_SDA(1);
      }
      else
      {
        IIC_SDA(0);
      }
      txd<<=1;
      delay_us(2);
      IIC_SCL(1);
      delay_us(2); 
      IIC_SCL(0);	
      delay_us(2);
    }
Пример #15
0
static void IIC_Init(void)
{
	IIC_SCL(1);
	IIC_SDA(1);
	
	port_get_config_defaults(&pin_clk);
	pin_clk.direction = PORT_PIN_DIR_OUTPUT;	
	port_pin_set_config(PIN_I2C_CLK, &pin_clk);
	port_pin_set_output_level(PIN_I2C_CLK, 1);

	port_get_config_defaults(&pin_data);
	pin_data.direction = PORT_PIN_DIR_OUTPUT;	
	port_pin_set_config(PIN_I2C_DATA, &pin_clk);
	port_pin_set_output_level(PIN_I2C_DATA, 1);
	
}