Beispiel #1
0
char MOD_IO2::ReadSingle( char ack )
{
	char data = 0, i;

	SDA_IN();		
	for(i = 0; i < 8; i++)
	{
		WaitMicrosecond(1000);
		SCL_IN();
		while(digitalRead(pinSCL)==0);
		WaitMicrosecond(1000);
		data |= digitalRead(pinSDA);
		if( i!=7 )
			data<<=1;
		WaitMicrosecond(1000);
		SCL_OUT();
		WaitMicrosecond(1000);
	}

	// send the ACK/NACK
	WaitMicrosecond(1000);
	if(ack)
		SDA_IN();
	else
		SDA_OUT();
	WaitMicrosecond(1000);
	SCL_IN();
	WaitMicrosecond(1000);
	SCL_OUT();
	WaitMicrosecond(1000);

	return data;		
}
Beispiel #2
0
u8 IIC_Wait_Ack1(void)
{
	u8 i;
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA = 1;
	delay_us(2);
	IIC_SDA = 0;
	delay_us(1);
	IIC_SCL = 1;
	IIC_SDA = 1;
	delay_us(10);
//	for (i=0; i<100; i++)
//	{
//		SDA_IN();
//		if (READ_SDA == 1){
//	// if data line is low, pulse the clock.
//			delay_us(10);
//		return 0;
//		}		
//	}
//	IIC_SCL=1;
	
	return 1;
}
Beispiel #3
0
void MOD_IO2::Start()
{
	SDA_OUT();
	WaitMicrosecond(1000);
	SCL_OUT();
	WaitMicrosecond(1000);		
}
Beispiel #4
0
/*---------------------------------------------------------------------------*/
static unsigned
sread(int send_ack)
{
  int i;
  unsigned char c = 0x00;

  SDA_1();
  SDA_IN();
  for(i = 0; i < 8; i++) {
    c <<= 1;
    SCL_1();
    delay_400ns();
    if(SDA_IS_1) {
      c |= 0x1;
    }
    SCL_0();
  }

  SDA_OUT();
  if(send_ack) {
    SDA_0();
  }
  SCL_1();
  delay_400ns();
  SCL_0();

  SDA_1();			/* Release SDA */
  SDA_IN();

  return c;
}
Beispiel #5
0
void i2c_pic_start(void)
{
   // PIC chip requires a special double start condition in order
   // to initiate communication.  This is to insure the PIC does not 
   // read any false starts.
   // MDF 12/01/04
   
   // 1st start condition
//	 SDA_OFF;
//	_delay_loop_2(250);
//	 SCL_OFF;
//	_delay_loop_2(200);
	delay_us(100);
	SDA_OUT();		//sda线输出
	IIC_SDA = 0;
	delay_us(100);
	IIC_SCL = 0;
	delay_us(100);
   
	// reset bus
//	SDA_ON;
//	SCL_ON;
//	_delay_loop_2(200);
	IIC_SDA = 1;
	delay_us(100);
	IIC_SCL = 1;
	delay_us(100);
	// 2nd start condition
//	SDA_OFF;
//	_delay_loop_2(200);
//	SCL_OFF;
	IIC_SDA = 0;
	delay_us(100);
	IIC_SCL = 0;
}
Beispiel #6
0
/*******************************************************************************
**函    数: IIC_InitPort
**功    能: IIC接口初始化
**参    数: void
**返    回: void
*******************************************************************************/
void IIC_InitPort(void)
{                        

    
    printf("\n BL5372 IIC Port Init");
    // Init IIC_1_SCL_PIN
      gpio_init(&gpio_iic_1_scl, IIC_1_SCL_PIN);
      gpio_dir(&gpio_iic_1_scl, PIN_OUTPUT);    // Direction: Output
      gpio_mode(&gpio_iic_1_scl, PullNone);     // No pull
      
      gpio_write(&gpio_iic_1_scl, 1);


      // Init IIC_1_SDA_PIN
      gpio_init(&gpio_iic_1_sda, IIC_1_SDA_PIN);
      gpio_dir(&gpio_iic_1_sda, PIN_OUTPUT);    // Direction: Output
      gpio_mode(&gpio_iic_1_sda, PullNone);     // No pull
    
      gpio_write(&gpio_iic_1_sda, 1);
      
      SDA_OUT();
      SCL_OUT();
      SCL1;
      SDA1;
}
Beispiel #7
0
char MOD_IO2::WriteSingle( char data )
{
	char i;

	// Send the 8 bits
	for(i = 0; i<8; i++)
	{
		WaitMicrosecond(1000);
		if(data&RW_MASK)
			SDA_IN();
		else
			SDA_OUT();
		data <<= 1;
		WaitMicrosecond(1000);
		SCL_IN();
		WaitMicrosecond(1000);
		SCL_OUT();
	}

	// Read the ACK
	WaitMicrosecond(1000);
	SDA_IN();
	WaitMicrosecond(1000);
	SCL_IN();
	WaitMicrosecond(1000);
	i = digitalRead(pinSDA);
	SCL_OUT();
	WaitMicrosecond(1000);

	return i;		
}
Beispiel #8
0
void MOD_IO2::Stop()
{
	SDA_OUT();
	WaitMicrosecond(1000);
	SCL_IN();
	WaitMicrosecond(1000);
	SDA_IN();
	WaitMicrosecond(1000);
}
Beispiel #9
0
MOD_IO2::MOD_IO2 (unsigned char Address, unsigned char nSDA, unsigned char nSCL)
{
	SL_READ  = (Address<<1) | 1;
	SL_WRITE = (Address<<1) | 0;
	pinSDA = nSDA;
	pinSCL = nSCL;
	SCL_OUT();
	SDA_OUT();
}
Beispiel #10
0
static void IIC_Stop(void)
{
  SDA_OUT();
  IIC_SDA(0);
  IIC_SCL(1);  
  delay_us(4);
  IIC_SDA(1);
  delay_us(4);							   	
}
Beispiel #11
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();
}
Beispiel #12
0
//不产生ACK应答		    
static void IIC_NAck(void)
{
	SDA_OUT();
	IIC_SDA(1);
	IIC_SCL(1);
    I2C_delay();
	IIC_SCL(0);
	I2C_delay();
}					 	
//不产生ACK应答		    
void I2C_NAck(void)
{
	I2C_SCL=0;
	SDA_OUT();
	I2C_SDA=1;
	Delay_NOP_us(2);
	I2C_SCL=1;
	Delay_NOP_us(2);
	I2C_SCL=0;
}					 				     
Beispiel #14
0
/**************************实现函数********************************************
*函数原型:void iic_stop(void)
*功  能:产生IIC停止信号
*******************************************************************************/	  
void iic_stop(void)
{
	SDA_OUT();	//sda线输出
	IIC_SCL_L();
	IIC_SDA_L();	//STOP:when CLK is high DATA change form low to high
 	delay_us(1);
	IIC_SCL_H(); 
	IIC_SDA_H();	//发送I2C总线结束信号
	delay_us(1);
}
Beispiel #15
0
/**************************实现函数********************************************
*函数原型:void iic_nack(void)
*功  能:产生NACK应答
*******************************************************************************/	    
void iic_nack(void)
{
	IIC_SCL_L();
	SDA_OUT();
	IIC_SDA_H();
	delay_us(1);
	IIC_SCL_H();
	delay_us(1);
	IIC_SCL_L();
}					 				     
Beispiel #16
0
//不产生ACK应答		    
void IIC_NAck(void)
{
	SDA_OUT();
	IIC_SCL=0;
	IIC_SDA=1;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}					 				     
Beispiel #17
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);
}
//产生ACK应答
void IIC_Ack(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=0;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}
Beispiel #19
0
/**************************实现函数********************************************
*函数原型:void iic_start(void)
*功  能:产生IIC起始信号
*******************************************************************************/
void iic_start(void)
{
	SDA_OUT();	//sda线输出
	IIC_SDA_H();
	IIC_SCL_H();
	delay_us(1);
 	IIC_SDA_L();	//START:when CLK is high,DATA change form high to low 
	delay_us(1);
	IIC_SCL_L();	//钳住I2C总线,准备发送或接收数据 
}
//产生IIC起始信号
void IIC_Start(void)
{
	SDA_OUT();     //sda线输出
	IIC_SDA=1;	  	  
	IIC_SCL=1;
	delay_us(4);
 	IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void IIC_Stop(void)
{
	SDA_OUT();//sda线输出
	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;//发送I2C总线结束信号
	delay_us(4);							   	
}
Beispiel #22
0
/**************************实现函数********************************************
*函数原型:		void IIC_NAck(void)
*功  能:	    产生NACK应答
*******************************************************************************/	    
void IIC_NAck(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=1;
	delay_us(1);
	IIC_SCL=1;
	delay_us(1);
	IIC_SCL=0;
}
//不产生ACK应答		    
void myiic_nack(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=1;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}					 				     
Beispiel #24
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);
}	
Beispiel #25
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 ;
}	  
/*
*********************************************************************************************************
*	函 数 名: i2c_Start
*	功能说明: CPU发起I2C总线停止信号
*	形    参:  无
*	返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{
	SDA_OUT();               //sda线输出
	/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
	I2C_SCL_0();
	I2C_SDA_0();
	i2c_Delay();
	I2C_SCL_1();
	I2C_SDA_1();
	i2c_Delay();
}
//----------------------------------------------------------------------------------
char s_read_byte(unsigned char ack)
//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1" 
{ 
  unsigned char i,val=0;
  SDA_OUT(1);                           //release DATA-line
  for (i=0x80;i>0;i=i>>1)             //shift bit for masking
  { 
    SCL_OUT(1);                        //clk for SENSI-BUS
    if (SDA_READ()) val=(val | i);        //read bit  
    SCL_OUT(0);  					 
  }
  SDA_OUT(!ack);                        //in case of "ack==1" pull down DATA-Line
  delay_us(2);                          //observe setup time
  SCL_OUT(1);                            //clk #9 for ack
  delay_us(6);          //pulswith approx. 5 us 
  SCL_OUT(0);
  delay_us(2);                         //observe hold time						    
  SDA_OUT(1);                          //release DATA-line
  return val;
}
/*
*********************************************************************************************************
*	函 数 名: i2c_Start
*	功能说明: CPU发起I2C总线启动信号
*	形    参:  无
*	返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{
	SDA_OUT();               //sda线输出
	/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
	I2C_SDA_1();
	I2C_SCL_1();
	i2c_Delay();
	I2C_SDA_0();
	i2c_Delay();
	I2C_SCL_0();
	i2c_Delay();
}
/*
*********************************************************************************************************
*	函 数 名: i2c_NAck
*	功能说明: CPU产生1个NACK信号
*	形    参:  无
*	返 回 值: 无
*********************************************************************************************************
*/
void i2c_NAck(void)
{
	I2C_SCL_0();
	SDA_OUT();
	
	I2C_SDA_1();	/* CPU驱动SDA = 1 */
	i2c_Delay();
	I2C_SCL_1();	/* CPU产生1个时钟 */
	i2c_Delay();
	I2C_SCL_0();
	i2c_Delay();
}
Beispiel #30
0
/**************************实现函数********************************************
*函数原型:		void IIC_Start(void)
*功  能:		产生IIC起始信号
*******************************************************************************/
int IIC_Start(void)
{
	SDA_OUT();     //sda线输出
	IIC_SDA=1;
	if(!READ_SDA)return 0;	
	IIC_SCL=1;
	delay_us(1);
 	IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
	if(READ_SDA)return 0;
	delay_us(1);
	IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
	return 1;
}