基于GD32F305的模拟IIC调试

一、  iic.h

 二、iIC.C

void	Periph_i2c_int(void)
{
	rcu_periph_clock_enable(RCU_GPIOD);
	gpio_init(GPIOD, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, 0xffff);
	
	GPIO_BOP(GPIOD) = I2C_SCL_PIN;
	delay_us(10);
	GPIO_BOP(GPIOD)= I2C_SDA_PIN;
	delay_us(10);
}

/***************************************************/
//	iic λ¶Áº¯Êý
/***************************************************/
uint8_t SDA_READ_ALL(void)
{
	uint8 	con=0;
	uint16	con_pin=0;
	
	con_pin = GPIO_ISTAT(GPIOD);		//¶ÁÈ¡GPIOD¸÷Òý½Å״ֵ̬
	con	= (uint8)(con_pin>>8);			//¶ÁÈ¡SDA¸÷Òý½Å״ֵ̬		ͨµÀ˳ÐòÓë¸Ã×ֽڸߵÍλÏà·´	
	x=con;
	return	con;
}

/**************************************************************
*ËùÓÐIIC¿ªÊ¼ÐźÅ
***************************************************************/	
void IIC_Start_ALL()//START:when CLK is high,DATA change form high to low 
{
	GPIO_BOP(GPIOD)= I2C_ALL_PIN;
	delay_us(10);
	GPIO_BC(GPIOD) = I2C_SDA_PIN;
	delay_us(10);
	GPIO_BC(GPIOD) = I2C_SCL_PIN; 
}

/**************************************************************
*ËùÓÐIICÍ£Ö¹ÐźÅ
***************************************************************/	
void IIC_Stop_ALL()
{
	GPIO_BOP(GPIOD)= I2C_ALL_PIN;
	delay_us(10);
	GPIO_BC(GPIOD)= I2C_SCL_PIN;
	delay_us(10);
	GPIO_BC(GPIOD)= I2C_SDA_PIN;
	delay_us(10);
}

/**************************************************************
*ËùÓÐIIC·¢ËÍÒ»¸ö×Ö½Ú
***************************************************************/	
uint8_t IIC_Send_Byte_ALL( uint8_t txd )
{                        
	uint8_t t,bAck=0;	
	for(t=0;t<8;t++)
	{  
		GPIO_BC(GPIOD)= I2C_SCL_PIN;
		if(txd&0x80)
			GPIO_BOP(GPIOD)= I2C_SDA_PIN;	//SDA_H
		else
			GPIO_BC(GPIOD)= I2C_SDA_PIN;	//SDA_L
		delay_us(nop_iic);
		GPIO_BOP(GPIOD)= I2C_SCL_PIN;
		delay_us(nop_iic);
		txd<<=1;
	}
	GPIO_BC(GPIOD)= I2C_SCL_PIN;	//SCL_L
	delay_us(nop_iic);
	GPIO_BOP(GPIOD)= I2C_SCL_PIN;	//SCL_H
	delay_us(nop_iic);
//	bAck=SDA_READ_ALL();
	GPIO_BC(GPIOD)= I2C_SCL_PIN;	//SCL_L
	GPIO_BOP(GPIOD)= I2C_SDA_PIN;	//SDA_H
	delay_us(nop_iic);
	return ((uint8_t)bAck);
} 	 

/**************************************************************
*ËùÓÐIIC¶ÁÈ¡Ò»¸ö×Ö½Ú
***************************************************************/	
void IIC_Read_Byte_ALL(uint8_t bLSByte)
{
		uint8 i,j,a,b;
		uint8 READ_AD[8]={0,0,0,0,0,0,0,0},Con[8]={0,0,0,0,0,0,0,0};
		a=0x01;
		b=0x80;
    for(i=0;i<8;i++)
    {
    	GPIO_BC(GPIOD)= I2C_SCL_PIN;	//SCL_L
			delay_us(nop_iic);
			GPIO_BOP(GPIOD)= I2C_SCL_PIN;	//SCL_H
			delay_us(nop_iic);
			Con[i]=SDA_READ_ALL();
    }
		GPIO_BC(GPIOD)= I2C_SCL_PIN;	//SCL_L
		delay_us(nop_iic);
		if(!bLSByte)         
		{
			for(i=8;i>0;i--)			// ͨµÀÂÖѯ
			{
				a=0x80;
				a>>=i-1;
				for(j=8;j>0;j--)		// ×Ö½Ú Î» µÄ ÕûºÏ
				{
					b=0x80;
					b>>=j-1;
					if(Con[j-1]&a)
						READ_AD[i-1]|=b;
					else
						READ_AD[i-1]&=~b;
				}
				ResultL[i-1] = READ_AD[i-1];
			}
			GPIO_BOP(GPIOD)= I2C_SDA_PIN;	//SDA_H
		}
		else
		{
			for(i=8;i>0;i--)			// ͨµÀÂÖѯ
			{
				a=0x80;
				a>>=i-1;
				for(j=8;j>0;j--)		// ×Ö½Ú Î» µÄ ÕûºÏ
				{
					b=0x80;
					b>>=j-1;
					if(Con[j-1]&a)
						READ_AD[i-1]|=b;
					else
						READ_AD[i-1]&=~b;
				}
				ResultH[i-1] = READ_AD[i-1];
			}
			GPIO_BC(GPIOD)= I2C_SDA_PIN;	//SDA_L
		}
		delay_us(nop_iic);
    GPIO_BOP(GPIOD)= I2C_SCL_PIN;	//SCL_H
		delay_us(nop_iic);
    GPIO_BC(GPIOD) = I2C_SCL_PIN;	//SCL_L
		delay_us(nop_iic);
		GPIO_BOP(GPIOD)= I2C_SDA_PIN;	//SDA_H		ÊÍ·ÅSDA×ÜÏß  ¸¡¿ÕģʽʱÐèÒªÔö¼Ó¸Ã¾ä
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值