IIC通用模板

20 篇文章 24 订阅

目录

stm32f030c8t6

IIC.c

IIC.h

stm32f103c8t6

-----------------------------------------------------------------------------------------------------------------------------

stm32f030c8t6

IIC.c

#include "IIC.h"

/*******************************************************************************
* 函 数 名         : IIC_Init
* 函数功能		   : IIC初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void IIC_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE);	/* 打开GPIO时钟 */
	
  GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉
	GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStructure);
	
	I2C_SDA_H          ;//一开始先释放总线
	I2C_SCL_H;
	
	SDA_Out_Mode();
}



void SDA_Out_Mode(void)//设置SDA引脚的输出模式
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE);	/* 打开GPIO时钟 */
	
	GPIO_InitStructure.GPIO_Pin = I2C_SDA_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉
	GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStructure);
}

void SDA_In_Mode(void)//设置SDA引脚的输入模式
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE);	/* 打开GPIO时钟 */
	
	GPIO_InitStructure.GPIO_Pin = I2C_SDA_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉
	GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStructure);
	
}


void I2C_Start(void)//起始信号
{
	/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */

	I2C_SDA_H;
	Delay_us(Delay_I2C);
	I2C_SCL_H;
	Delay_us(Delay_I2C);
	I2C_SDA_L;
	Delay_us(Delay_I2C);
	I2C_SCL_L;
}


void I2C_Stop(void)//停止信号
{
	/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */

	I2C_SDA_L;
	Delay_us(Delay_I2C);
	I2C_SCL_H;
	Delay_us(Delay_I2C);
	I2C_SDA_H;
	Delay_us(Delay_I2C);
	
}

void I2C_SendByte(u8 Byte)//发送一个字节
{
	u8 i;

	for (i = 0; i < 8; i++)
	{		
		I2C_SCL_L;
		Delay_us(Delay_I2C);
		if (Byte & 0x80)//0xA0   1010 0000
		{
			I2C_SDA_H;
		}
		else
		{
			I2C_SDA_L;		
		}	
		Delay_us(Delay_I2C);
		I2C_SCL_H;
				
		Byte <<= 1;	// 左移一个bit
		Delay_us(Delay_I2C);
	}

	//这里会产生错误  SCL 高电平  SDA 产生上升沿 导致产生START信号	
//	I2C_SDA_H;//释放总线,结束传送数据
	
	//释放总线
	I2C_SCL_L;
}

u8 I2C_ReceiveByte(void)//接收一个字节
{
	u8 i,byte=0x00;
	I2C_SDA_H;
	
	SDA_In_Mode();
	for(i=0;i<8;i++)
	{
		I2C_SCL_L;		
		Delay_us(Delay_I2C);
		I2C_SCL_H;
		
		if(I2C_SDA_Read)
		{
			byte|=(0x80>>i);		
		}

	}
	
	SDA_Out_Mode();
	
	return byte;
}


u8 I2C_ReceiveAck(void)//接收/等待应答
{
	u8 Ask=0,ucErrTime=0;
	I2C_SCL_L;
	Delay_us(Delay_I2C);
	I2C_SDA_H;
	Delay_us(Delay_I2C);
	I2C_SCL_H;
		
	while(I2C_SDA_Read)//如果成立,说明返回1,从机接收失败
	{
		ucErrTime++;
		if(ucErrTime>10)
		{
			I2C_Stop();
			SDA_Out_Mode();//输出模式
			return 1;
		}
		
	}
	I2C_SCL_L;
	Delay_us(Delay_I2C);
	return Ask;
	
}


void I2C_ACK(void)//发送应答0
{
	I2C_SCL_L;
	Delay_us(Delay_I2C);
	
	I2C_SDA_L;//0
	Delay_us(Delay_I2C);
	
	I2C_SCL_H;
	Delay_us(Delay_I2C);
	
	I2C_SCL_L;
	Delay_us(Delay_I2C);
}


void I2C_NACK(void)//发送应答1
{
	I2C_SCL_L;
	Delay_us(Delay_I2C);
	
	I2C_SDA_H;//1
	Delay_us(Delay_I2C);
	
	I2C_SCL_H;
	Delay_us(Delay_I2C);
	
	I2C_SCL_L;
	Delay_us(Delay_I2C);
	
}

IIC.h

#ifndef __IIC_H
#define __IIC_H

#include "main.h"

typedef enum 
{
	FAILED = 0, 
	PASSED = !FAILED
} TestStatus;


#define Delay_I2C   1

#define I2C_GPIO_PORT	GPIOB			/* GPIO端口 */
#define RCC_I2C_PORT 	RCC_AHBPeriph_GPIOB		/* GPIO端口时钟 */

#define I2C_SCL_PIN		GPIO_Pin_8			/* 连接到SCL时钟线的GPIO */
#define I2C_SDA_PIN		GPIO_Pin_9			/* 连接到SDA数据线的GPIO */



#define I2C_SCL_H   GPIO_SetBits(I2C_GPIO_PORT,I2C_SCL_PIN)
#define I2C_SCL_L   GPIO_ResetBits(I2C_GPIO_PORT,I2C_SCL_PIN)

#define I2C_SDA_H   GPIO_SetBits(I2C_GPIO_PORT,I2C_SDA_PIN)
#define I2C_SDA_L   GPIO_ResetBits(I2C_GPIO_PORT,I2C_SDA_PIN)

#define I2C_SDA_Read    GPIO_ReadInputDataBit(I2C_GPIO_PORT,I2C_SDA_PIN)

void IIC_Init(void);
void SDA_Out_Mode(void);
void SDA_In_Mode(void);

void I2C_Start(void);
void I2C_Stop(void);

void I2C_SendByte(u8 Byte);
u8 I2C_ReceiveByte(void);
u8 I2C_ReceiveAck(void);//接收(等待)从机的应答

void I2C_NACK(void);//发送应答
void I2C_ACK(void);

#endif  


-------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------

stm32f103c8t6

 

代码是没问题的

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盒马玩家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值