c语言iic通讯编程,STM32用GPIO模拟IIC(I2C)通讯c语言源码-实测可用.docx

#include "myiic.h"

#include "delay.h"

u8 isBMI160=0, isPMU6050 =0;

void I2C_delay(void)

{

__NOP();

}

//初始化IIC

void IIC_Init(void)

{

RCC->APB2ENR|=1<<3;//先使能外设IO PORTB时钟

GPIOB->CRH&=0XFFFF00FF;//PB1/11 推挽输出

GPIOB->CRH|=0

GPIOB->ODR|=3<<10; //PB10,11 输出高

}

//**************************************

//IIC起始信号

//**************************************

u8 IIC_Start(void)

{

#ifdef BMI160

SDA_H;

SCL_H;

I2C_delay();

if(!SDA_read)return FALSE;//SDA线为低电平则总线忙,退出

SDA_L;

I2C_delay();

if(SDA_read) return FALSE;//SDA线为高电平则总线出错,退出

SDA_L;

I2C_delay();

#else

SDA_OUT(); //sda线输出

IIC_SDA=1;

IIC_SCL=1;

Delay_us(I2C_Delayus);

IIC_SDA=0;//START:when CLK is high,DATA change form high to low

Delay_us(I2C_Delayus);

IIC_SCL=0;//钳住IIC总线,准备发送或接收数据

#endif

}

//**************************************

//IIC停止信号

//**************************************

void IIC_Stop(void)

{

#ifdef BMI160

SCL_L;

I2C_delay();

SDA_L;

I2C_delay();

SCL_H;

I2C_delay();

SDA_H;

I2C_delay();

#else

SDA_OUT();//sda线输出

IIC_SCL=0;

IIC_SDA=0;//STOP:when CLK is high DATA change form low to high

Delay_us(I2C_Delayus);

IIC_SCL=1;

IIC_SDA=1;//发送IIC总线结束信号

Delay_us(I2C_Delayus);

#endif

}

/*******************************************************************************

* Function Name : I2C_NoAck

* Description : Master Send No Acknowledge Single

* Input : None

* Output : None

* Return : None

****************************************************************************** */

void I2C_NoAck(void)

{

#ifdef BMI160

SCL_L;

I2C_delay();

SDA_H;

I2C_delay();

SCL_H;

I2C_delay();

SCL_L;

I2C_delay();

#else

IIC_SCL = 0;

I2C_delay();

IIC_SDA = 1;

I2C_delay();

IIC_SCL = 1;

I2C_delay();

IIC_SCL = 0;

I2C_delay();

#endif

}

//**************************************

//IIC发送应答信号

//入口参数:ack (0:ACK 1:NAK)

//**************************************

void IIC_SendACK(void)

{

#ifdef BMI160

SCL_L;

I2C_delay();

SDA_L;

I2C_delay();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值