2021.9.8 STM32 IIC学习记录

STM32 IIC学习记录

请添加图片描述

//产生IIC其实起始信号
void IIC_Start(void)
{
	SDA_OUT();	//SDA线输出
	IIC_SDA=1;
	IIC_SCL=1;
	delay_us(4);
	IIC_SDA=0;
	delay_us(4);
	IIC_SCL=0;	//钳住IIC总线,准备发送和接收数据
	
}

//IIC停止信号
void IIC_Stop(void)
{
	SDA_OUT();
	IIC_SDA=0;
	IIC_SCL=0;
	delay_us(4);	//延时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;
}

//不产生ACK应答
void IIC_NAck(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=1;//拉高数据线电平不进行应答
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}

//IIC发送一个字节
//返回从机有无应答
void IIC_Send_Byte(u8 txd)
{
	u8 t=8;
	SDA_OUT();
	IIC_SCL=0;//拉低时钟开始数据传输
	while(t--)
	{
		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);
	}
}

//读取一个字节,ack=1时,发送ACK,为0时发送NACK
u8 IIC_Read_Byte(unsigned char ack)
{
	unsigned char i, receive=0,j=8;
	//假设receive读取数据,其二进制表示为:
	//1001 0011
	//0010 0110
	//0100 1100
	//1001 1000
	//0011 0001
	//0110 0010
	//1100 0101
	//1000 1011


	while(j--)//8位字节循环8次
	{ 
		IIC_SCL=0;
		delay_us(2);
		IIC_SCL=1;
		
		receive<<1;//左移一位,尾数右边补0
		
		if(READ_SDA)//如果高位为1那么尾数++
			receive++;//1001 0011 左移后判断高位为1就++ 得到0010 0110
		delay_us(1);

		if(!ack)
			IIC_NAck();
		else
			IIC_Ack();
		
		return receive;
	}

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值