用STM32F103C8T6的硬件IIC编写调用opt3001光强传感器模块,要求完整代码
时间: 2024-05-16 18:15:08 浏览: 139
以下是使用STM32F103C8T6的硬件IIC编写调用opt3001光强传感器模块的完整代码:
```c
#include "stm32f10x.h"
#define OPT3001_ADDR 0x88
void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_SendByte(u8 byte);
u8 IIC_ReadByte(void);
void OPT3001_Init(void);
u16 OPT3001_ReadData(void);
void Delay_ms(u16 nms);
int main(void)
{
u16 lux = 0;
IIC_Init();
OPT3001_Init();
while (1)
{
lux = OPT3001_ReadData();
// do something with lux
Delay_ms(1000);
}
}
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
void IIC_Start(void)
{
I2C_GenerateSTART(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
}
void IIC_Stop(void)
{
I2C_GenerateSTOP(I2C1, ENABLE);
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF));
}
void IIC_SendByte(u8 byte)
{
I2C_SendData(I2C1, byte);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}
u8 IIC_ReadByte(void)
{
u8 byte;
I2C_AcknowledgeConfig(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
byte = I2C_ReceiveData(I2C1);
return byte;
}
void OPT3001_Init(void)
{
IIC_Start();
IIC_SendByte(OPT3001_ADDR << 1);
IIC_SendByte(0x01);
IIC_SendByte(0xC4);
IIC_SendByte(0x10);
IIC_Stop();
}
u16 OPT3001_ReadData(void)
{
u16 data;
IIC_Start();
IIC_SendByte(OPT3001_ADDR << 1);
IIC_SendByte(0x00);
IIC_Stop();
IIC_Start();
IIC_SendByte((OPT3001_ADDR << 1) | 0x01);
data = IIC_ReadByte() << 8;
data |= IIC_ReadByte();
IIC_Stop();
return data;
}
void Delay_ms(u16 nms)
{
u32 i, j;
for (i = 0; i < nms; i++)
for (j = 0; j < 2000; j++);
}
```
在主函数中,首先调用了 `IIC_Init()` 函数进行硬件IIC的初始化。然后调用了 `OPT3001_Init()` 函数进行OPT3001传感器的初始化。接着在 `while` 循环中,调用 `OPT3001_ReadData()` 函数读取传感器的数据,并进行一些处理。最后使用 `Delay_ms()` 函数延时1秒。
在硬件IIC初始化函数 `IIC_Init()` 中,首先初始化PB10和PB11引脚为开漏输出,并开启GPIOB时钟。然后初始化I2C1,并开启I2C1时钟。
在硬件IIC发送开始信号的函数 `IIC_Start()` 中,使用 `I2C_GenerateSTART()` 函数发送开始信号,并等待事件 `I2C_EVENT_MASTER_MODE_SELECT` 的发生。
在硬件IIC发送停止信号的函数 `IIC_Stop()` 中,使用 `I2C_GenerateSTOP()` 函数发送停止信号,并等待标志位 `I2C_FLAG_STOPF` 的置位。
在硬件IIC发送字节的函数 `IIC_SendByte()` 中,使用 `I2C_SendData()` 函数发送字节,并等待事件 `I2C_EVENT_MASTER_BYTE_TRANSMITTED` 的发生。
在硬件IIC接收字节的函数 `IIC_ReadByte()` 中,使用 `I2C_AcknowledgeConfig()` 函数使能应答位,并等待事件 `I2C_EVENT_MASTER_BYTE_RECEIVED` 的发生。
在OPT3001传感器初始化函数 `OPT3001_Init()` 中,首先发送开始信号,并发送从机地址和寄存器地址,然后依次发送配置寄存器的三个字节,并发送停止信号。
在OPT3001传感器读取数据函数 `OPT3001_ReadData()` 中,首先发送开始信号,并发送从机地址和寄存器地址。然后再次发送开始信号,并发送从机地址和读命令,并等待两个字节的数据接收完成。最后发送停止信号,并返回读取到的数据。
阅读全文