void UserI2c_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( I2C_SCL_CLK, ENABLE ); RCC_APB2PeriphClockCmd( I2C_SDA_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_SCL_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = I2C_SDA_PIN; GPIO_Init(I2C_SDA_PORT, &GPIO_InitStructure); GPIO_SetBits(I2C_SCL_PORT, I2C_SCL_PIN); //SCL 输出高 GPIO_SetBits(I2C_SDA_PORT, I2C_SDA_PIN); //SDA 输出高 /************************/ /**配置TOF内部寄存器*****/ /**代码改于2022/6/1_dpt**/ /************************/ devid=I2C_DEVID; //设置I2C从机地址 默认164 0xA4 dirt_send_flag=1; //=0串口主动发送 =1串口或者I2C被动读取 SensorWritenByte(devid,(unsigned char *)&dirt_send_flag, 0x09, 1); //0x09设置距离发送方式 1 主机去读取 0 模块发送 delay_ms(100); dirt_detection_flag=0; //=0滤波值 =1实时值 SensorWritenByte(devid,(unsigned char *)&dirt_detection_flag, 0x08, 1); //0x08设置 距离数据模式 1 实时值 0滤波值 delay_ms(100); }
时间: 2023-08-26 15:06:22 浏览: 90
这段代码是用于初始化I2C通信的函数,函数名为UserI2c_Init。该函数主要完成以下几个任务:
1. 配置SCL和SDA引脚的GPIO模式和速度,使其成为推挽输出模式,并打开SCL和SDA引脚所在的GPIO时钟。
2. 将SCL和SDA引脚输出高电平,作为初始状态。
3. 设置I2C从机地址为0xA4(164),并将dirt_send_flag设置为1,表示串口或者I2C被动读取距离数据。然后调用SensorWritenByte函数向从机发送设置距离发送方式的命令,并等待100ms。
4. 将dirt_detection_flag设置为0,表示读取距离时使用滤波值。然后调用SensorWritenByte函数向从机发送设置距离数据模式的命令,并等待100ms。
最后,函数执行完毕,I2C通信就可以正常使用了。
相关问题
void UserI2c_Send_Byte(unsigned char txd) { unsigned char t; USERI2C_SCL_0;//拉低时钟开始数据传输 delay_us(5); for(t = 0; t < 8; t++) { if((txd & 0x80) >> 0) USERI2C_SDA_1; else USERI2C_SDA_0; txd <<= 1; delay_us(5); USERI2C_SCL_1; delay_us(5); USERI2C_SCL_0; } }
这是一段代码,看起来像是用于向I2C设备发送一个字节的函数。其中,USERI2C_SCL_0和USERI2C_SCL_1分别是I2C时钟线的拉低和拉高操作,USERI2C_SDA_0和USERI2C_SDA_1分别是I2C数据线的拉低和拉高操作。这个函数会先拉低时钟线,然后根据数据的每一位,分别拉高或拉低数据线,并在每次拉高时钟线后延迟一定时间。最终,通过8次循环,将一个字节的数据传输完毕。
unsigned char SensorReadnByte(unsigned char Devid, unsigned char *RXBuff, unsigned char SubAdd, unsigned char Size) { unsigned char i = 0; UserI2c_Start(); // UserI2c_Send_Byte( Devid | 0x00 ); //实时距离地址 UserI2c_Send_Byte( Devid | 0x04 ); //滤波距离地址 if( 0 == UserI2c_Wait_Ack() ) { UserI2c_Stop(); return 0; } UserI2c_Send_Byte( SubAdd & 0xff ); if( 0 == UserI2c_Wait_Ack() ) { UserI2c_Stop(); return 0; } UserI2c_Stop(); UserI2c_Start(); //UserI2c_Send_Byte( Devid | 0x01 ); //实时距离地址 UserI2c_Send_Byte( Devid | 0x05 ); //滤波距离地址 if( 0 == UserI2c_Wait_Ack() ) { // UserI2c_Stop(); // return 0; } for ( i = 0; i < Size; i++) { RXBuff[Size - i - 1] = UserI2c_Read_Byte(); if((i + 1) == Size) useri2c_nack(); else useri2c_ack(); } UserI2c_Stop(); return 1; }
这段代码是用于读取传感器数据的函数,函数名为SensorReadnByte。该函数接收四个参数,Devid表示设备ID,RXBuff表示接收数据的缓冲区,SubAdd表示要读取的子地址,Size表示要读取的字节数量。
函数内部使用了I2C协议进行通信,首先通过UserI2c_Start()函数向总线发送起始信号,然后发送设备ID和要读取的子地址,如果在发送每个字节后没有收到从设备的应答信号,则函数返回0表示读取失败。如果发送成功,则通过UserI2c_Stop()函数发送停止信号,然后再次启动总线,并发送设备ID和要读取的子地址,成功后就可以开始读取数据了。
接着使用一个循环,将读取到的字节逆序存储到RXBuff缓冲区中,最后通过UserI2c_Stop()函数发送停止信号。如果读取成功,则返回1表示读取成功。
阅读全文