#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();