123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- #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<len;i++)
- {
- if(i != (len -1))
- {
- data[i]= IIC_Read_Byte();
- IIC_Ack();
- }
- else
- {
- data[i]= IIC_Read_Byte();
- IIC_NAck();
- }
- }
- IIC_Stop();
- return len;
- }
- /**************************实现函数********************************************
- *函数原型: uint8_t IICwriteBytes(uint8_t dev, uint8_t reg, uint8_t length, uint8_t* data)
- *功 能: 将多个字节写入指定设备 指定寄存器
- 输入 dev 目标设备地址
- reg 寄存器地址
- length 要写的字节数
- *data 将要写的数据的首地址
- 返回 返回写入长度
- *******************************************************************************/
- uint8_t IICwriteBytes(uint8_t dev, uint16_t reg, uint16_t length, uint8_t* data)
- {
- uint8_t count = 0;
- IIC_Start();
- IIC_Send_Byte(dev);
- IIC_Wait_Ack();
- IIC_Send_Byte(reg>>8);
- IIC_Wait_Ack();
- IIC_Send_Byte(reg & 0x00ff);
- IIC_Wait_Ack();
- for(count=0;count<length;count++)
- {
- IIC_Send_Byte(data[count]);
- IIC_Wait_Ack();
- }
- IIC_Stop();
- return length; //status == 0;
- }
- /**************************实现函数********************************************
- *函数原型: unsigned char IICwriteByte(unsigned char dev, unsigned char reg, unsigned char data)
- *功 能: 写入指定设备 指定寄存器一个字节
- 输入 dev 目标设备地址
- reg 寄存器地址
- data 将要写入的字节
- 返回 1
- *******************************************************************************/
- uint8_t IICwriteByte(uint8_t dev, uint16_t reg, uint8_t data)
- {
- return 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 IICwriteBit(uint8_t dev, uint16_t reg, uint8_t bitNum, uint8_t data)
- {
- uint8_t b;
- IIC_ReadOneByte(dev, reg, &b);
- b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));
- return IICwriteByte(dev, reg, b);
- }
- //------------------End of File----------------------------
|