Files
BC3S-firmware/3rd-part/Simple_VL53L0X/ST_I2C.c

321 lines
8.2 KiB
C
Raw Normal View History

2024-05-11 19:51:10 +08:00
#include "ST_I2C.h"
#define TRUE 1
#define FALSE 0
static uint8_t ST_IIC_Start(void);
static void ST_IIC_Stop(void);
static void ST_IIC_Send_Byte(uint8_t txd);
static uint8_t ST_IIC_Read_Byte(void);
static uint8_t ST_IIC_Wait_Ack(void);
static void ST_IIC_Ack(void);
static void ST_IIC_NAck(void);
static void IIC_delay(void)
{
volatile uint8_t i=5;//第一次使用时需要增加到1000
while(i)
{
i--;
}
}
/**************************实现函数********************************************
*: void ST_IIC_Start(void)
*  : IIC起始信号
*******************************************************************************/
static uint8_t ST_IIC_Start(void)
{
SDA_H;
SCL_H;
IIC_delay();
if(!SDA_read)
return FALSE;
SDA_L;
IIC_delay();
if(SDA_read)
return FALSE;
SDA_L;
IIC_delay();
return TRUE;
}
/**************************实现函数********************************************
*: void ST_IIC_Stop(void)
*  : //产生IIC停止信号
*******************************************************************************/
static void ST_IIC_Stop(void)
{
SCL_L;
IIC_delay();
SDA_L;
IIC_delay();
SCL_H;
IIC_delay();
SDA_H;
IIC_delay();
}
/**************************实现函数********************************************
*: uint8_t ST_IIC_Wait_Ack(void)
*  :
//返回值1接收应答失败
// 0接收应答成功
*******************************************************************************/
static uint8_t ST_IIC_Wait_Ack(void)
{
SCL_L;
IIC_delay();
SDA_H;
IIC_delay();
SCL_H;
IIC_delay();
if(SDA_read)
{
SCL_L;
IIC_delay();
return FALSE;
}
SCL_L;
IIC_delay();
return TRUE;
}
/**************************实现函数********************************************
*: void ST_IIC_Ack(void)
*  : ACK应答
*******************************************************************************/
static void ST_IIC_Ack(void)
{
SCL_L;
IIC_delay();
SDA_L;
IIC_delay();
SCL_H;
IIC_delay();
SCL_L;
IIC_delay();
}
/**************************实现函数********************************************
*: void ST_IIC_NAck(void)
*  : NACK应答
*******************************************************************************/
static void ST_IIC_NAck(void)
{
SCL_L;
IIC_delay();
SDA_H;
IIC_delay();
SCL_H;
IIC_delay();
SCL_L;
IIC_delay();
}
/**************************实现函数********************************************
*: void ST_IIC_Send_Byte(uint8_t txd)
*  : IIC发送一个字节
*******************************************************************************/
static void ST_IIC_Send_Byte(uint8_t SendByte)
{
uint8_t i=8;
while(i--)
{
SCL_L;
IIC_delay();
if(SendByte&0x80)
SDA_H;
else
SDA_L;
SendByte<<=1;
IIC_delay();
SCL_H;
IIC_delay();
}
SCL_L;
}
/**************************实现函数********************************************
*: uint8_t ST_IIC_Read_Byte(unsigned char ack)
*  : //读1串字节ack=1时发送ACKack=0发送nACK
*******************************************************************************/
static unsigned char ST_IIC_Read_Byte(void)
{
uint8_t i=8;
uint8_t ReceiveByte=0;
SDA_H;
while(i--)
{
ReceiveByte<<=1;
SCL_L;
IIC_delay();
SCL_H;
IIC_delay();
if(SDA_read)
{
ReceiveByte|=0x01;
}
}
SCL_L;
return ReceiveByte;
}
/**************************实现函数********************************************
*: unsigned char IIC_ReadOneByte(unsigned char I2C_Addr,unsigned char addr)
*  :
I2C_Addr
addr
*******************************************************************************/
uint8_t IIC_ReadOneByte(uint8_t SlaveAddress,uint8_t REG_Address)
{
if(!ST_IIC_Start())
return FALSE;
ST_IIC_Send_Byte(SlaveAddress);
if(!ST_IIC_Wait_Ack())
{
ST_IIC_Stop();
return FALSE;
}
ST_IIC_Send_Byte((uint8_t) REG_Address);
ST_IIC_Wait_Ack();
ST_IIC_Start();
ST_IIC_Send_Byte(SlaveAddress+1);
ST_IIC_Wait_Ack();
ST_IIC_Read_Byte();
ST_IIC_NAck();
ST_IIC_Stop();
//return TRUE;
return 0;
}
/**************************实现函数********************************************
*: uint8_t IICreadBytes(uint8_t dev, uint8_t reg, uint8_t length, uint8_t *data)
*  : length个值
dev
reg
length
*data
*******************************************************************************/
uint8_t ST_IICreadBytes(uint8_t SlaveAddress,uint8_t REG_Address,uint8_t len,uint8_t *data)
{
uint8_t i = 0;
if(!ST_IIC_Start())
return FALSE;
ST_IIC_Send_Byte(SlaveAddress);
if(!ST_IIC_Wait_Ack())
{
ST_IIC_Stop();
return FALSE;
}
ST_IIC_Send_Byte((uint8_t) REG_Address);
ST_IIC_Wait_Ack();
ST_IIC_Start();
ST_IIC_Send_Byte(SlaveAddress+1);
ST_IIC_Wait_Ack();
for(i = 0;i<len;i++)
{
if(i != (len -1))
{
data[i]= ST_IIC_Read_Byte();
ST_IIC_Ack();
}
else
{
data[i]= ST_IIC_Read_Byte();
ST_IIC_NAck();
}
}
ST_IIC_Stop();
//return TRUE;
return 0;
}
/**************************实现函数********************************************
*: uint8_t IICwriteBytes(uint8_t dev, uint8_t reg, uint8_t length, uint8_t* data)
*  :
dev
reg
length
*data
*******************************************************************************/
uint8_t ST_IICwriteBytes(uint8_t dev, uint8_t reg, uint8_t length, uint8_t* data)
{
uint8_t count = 0;
ST_IIC_Start();
ST_IIC_Send_Byte(dev);
ST_IIC_Wait_Ack();
ST_IIC_Send_Byte(reg);
ST_IIC_Wait_Ack();
for(count=0;count<length;count++)
{
ST_IIC_Send_Byte(data[count]);
ST_IIC_Wait_Ack();
}
ST_IIC_Stop();
return 0; //status == 0;
}
/**************************实现函数********************************************
*: uint8_t IICreadByte(uint8_t dev, uint8_t reg, uint8_t *data)
*  :
dev
reg
*data
1
*******************************************************************************/
uint8_t ST_IICreadByte(uint8_t dev, uint8_t reg, uint8_t *data)
{
*data=IIC_ReadOneByte(dev, reg);
return 0;
}
/**************************实现函数********************************************
*: unsigned char IICwriteByte(unsigned char dev, unsigned char reg, unsigned char data)
*  :
dev
reg
data
1
*******************************************************************************/
uint8_t ST_IICwriteByte(uint8_t dev, uint8_t reg, uint8_t data)
{
return ST_IICwriteBytes(dev, reg, 1, &data);
}
/**************************实现函数********************************************
*: uint8_t IICwriteBit(uint8_t dev, uint8_t reg, uint8_t bitNum, uint8_t data)
*  : 1
dev
reg
bitNum bitNum位
data 0 0
1
0
*******************************************************************************/
uint8_t ST_IICwriteBit(uint8_t dev, uint8_t reg, uint8_t bitNum, uint8_t data)
{
uint8_t b;
ST_IICreadByte(dev, reg, &b);
b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));
return ST_IICwriteByte(dev, reg, b);
}
//------------------End of File----------------------------