#include "IOI2C.h" #define TRUE 1 #define FALSE 0 static uint8_t IIC_Start(void); static void IIC_Stop(void); static void IIC_Send_Byte(uint8_t txd); static uint8_t IIC_Read_Byte(void); static uint8_t IIC_Wait_Ack(void); static void IIC_Ack(void); static void IIC_NAck(void); /**************************实现函数******************************************** *函数原型: void IIC_Start(void) *功  能: 产生IIC起始信号 *******************************************************************************/ static uint8_t IIC_Start(void) { SDA_H; SCL_H; nrf_delay_us(5); SDA_L; nrf_delay_us(5); SCL_L; return TRUE; } /**************************实现函数******************************************** *函数原型: void IIC_Stop(void) *功  能: //产生IIC停止信号 *******************************************************************************/ static void IIC_Stop(void) { SCL_L; SDA_L; nrf_delay_us(5); SCL_H; SDA_H; nrf_delay_us(5); } /**************************实现函数******************************************** *函数原型: uint8_t IIC_Wait_Ack(void) *功  能: 等待应答信号到来 //返回值:1,接收应答失败 // 0,接收应答成功 *******************************************************************************/ static uint8_t IIC_Wait_Ack(void) { uint8_t tim = 0; // SCL_L; SDA_H; nrf_delay_us(1); SCL_H; // nrf_delay_us(1); while(SDA_read){ if(++tim>=50){ IIC_Stop(); return FALSE; } nrf_delay_us(1); } SCL_L; return TRUE; } /**************************实现函数******************************************** *函数原型: void IIC_Ack(void) *功  能: 产生ACK应答 *******************************************************************************/ static void IIC_Ack(void) { SCL_L; nrf_delay_us(1); SDA_L; nrf_delay_us(1); SCL_H; nrf_delay_us(1); SCL_L; } /**************************实现函数******************************************** *函数原型: void IIC_NAck(void) *功  能: 产生NACK应答 *******************************************************************************/ static void IIC_NAck(void) { SCL_L; SDA_H; nrf_delay_us(1); SCL_H; nrf_delay_us(1); SCL_L; } /**************************实现函数******************************************** *函数原型: void IIC_Send_Byte(uint8_t txd) *功  能: IIC发送一个字节 *******************************************************************************/ static void IIC_Send_Byte(uint8_t SendByte) { uint8_t i=8; for (i=0; i<8; i++){ SCL_L; // SCL_L; // SCL_L; // SCL_L; // SCL_L; nrf_delay_us(1); if (SendByte&0x80) SDA_H; else SDA_L; SendByte <<= 1; SCL_H; nrf_delay_us(1); } SCL_L; } /**************************实现函数******************************************** *函数原型: uint8_t IIC_Read_Byte(unsigned char ack) *功  能: //读1串字节,ack=1时,发送ACK,ack=0,发送nACK *******************************************************************************/ static unsigned char IIC_Read_Byte(void) { uint8_t i = 0; uint8_t rec_byte; SDA_H; for (i=0; i<8; i++){ rec_byte <<= 1; SCL_L; // SCL_L; // SCL_L; // SCL_L; // SCL_L; nrf_delay_us(1); SCL_H; nrf_delay_us(1); if (SDA_read) rec_byte |= 0x01; } SCL_L; return rec_byte; } void VL53L1_IIC_Init(void) { nrf_gpio_cfg( PIN_SCL_1, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_DISCONNECT, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_H0D1, NRF_GPIO_PIN_NOSENSE); nrf_gpio_cfg_watcher(PIN_SCL_1); nrf_gpio_pin_set(PIN_SCL_1); nrf_gpio_cfg( PIN_SDA_1, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_DISCONNECT, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_H0D1, NRF_GPIO_PIN_NOSENSE); nrf_gpio_cfg_watcher(PIN_SDA_1); nrf_gpio_pin_set(PIN_SDA_1); } /**************************实现函数******************************************** *函数原型: unsigned char IIC_ReadOneByte(unsigned char I2C_Addr,unsigned char addr) *功  能: 读取指定设备 指定寄存器的一个值 输入 I2C_Addr 目标设备地址 addr 寄存器地址 返回 读出来的值 *******************************************************************************/ uint8_t IIC_ReadOneByte(uint8_t SlaveAddress,uint16_t REG_Address,uint8_t* data) { if(!IIC_Start()) return FALSE; IIC_Send_Byte(SlaveAddress); if(!IIC_Wait_Ack()) { IIC_Stop(); return FALSE; } IIC_Send_Byte((uint8_t) REG_Address>>8); IIC_Wait_Ack(); IIC_Send_Byte((uint8_t) REG_Address & 0x00ff); IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(SlaveAddress+1); IIC_Wait_Ack(); *data= IIC_Read_Byte(); IIC_NAck(); IIC_Stop(); return TRUE; } /**************************实现函数******************************************** *函数原型: uint8_t IICreadBytes(uint8_t dev, uint8_t reg, uint8_t length, uint8_t *data) *功  能: 读取指定设备 指定寄存器的 length个值 输入 dev 目标设备地址 reg 寄存器地址 length 要读的字节数 *data 读出的数据将要存放的指针 返回 读出来的字节数量 *******************************************************************************/ uint8_t IICreadBytes(uint8_t SlaveAddress,uint16_t REG_Address,uint8_t len,uint8_t *data) { uint8_t i = 0; if(!IIC_Start()) return FALSE; IIC_Send_Byte(SlaveAddress); if(!IIC_Wait_Ack()) { IIC_Stop(); return FALSE; } IIC_Send_Byte((uint8_t) REG_Address>>8); IIC_Wait_Ack(); IIC_Send_Byte(REG_Address&0x00ff); IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(SlaveAddress+1); IIC_Wait_Ack(); for(i = 0;i>8); IIC_Wait_Ack(); IIC_Send_Byte(reg & 0x00ff); IIC_Wait_Ack(); for(count=0;count