上图得I2C1 SCL和I2C SDA
找到J1上为20和17,找J6上与之对应的
分别是I2C-SDA和I2C-SCL,在J5上即为PB6和PB7
在CubeMx上把除了这两个以外的PA9和PA10配置为USART1_RX和USART1_TX.生成工程
创建ap3216c.c和ap3216c.h文件
然后编写代码,read和write用的是:
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
以下是代码:
ap3216c.c:
#include "ap3216c.h"uint8_t AP3216C_WRITE(uint8_t REG_ADDR,uint8_t command)
{HAL_StatusTypeDef res=HAL_I2C_Mem_Write(&hi2c1,AP_WRITE_ADDR,REG_ADDR,1,&command,1,100);if(res==HAL_ERROR){printf("I2C_write_error\n");return -1;}return 1;
}void AP3216C_Init()
{AP3216C_WRITE(0x00,0x04);HAL_Delay(100);AP3216C_WRITE(0x00,0x03);
}uint8_t AP3216C_READ(uint8_t REG_ADDR)
{uint8_t VAL;HAL_StatusTypeDef res;res=HAL_I2C_Mem_Read(&hi2c1,AP_WRITE_ADDR,REG_ADDR,1,&VAL,1,100);if(res==HAL_ERROR){printf("I2C_read_error\n");return 0;}return VAL;
}void Get_Val(uint16_t *IR,uint16_t *PS,uint16_t *ALS)
{uint8_t L_val,H_val;L_val=AP3216C_READ(0x0A);HAL_Delay(200);H_val=AP3216C_READ(0x0B);*IR=H_val<<2|(L_val&0x03);L_val=AP3216C_READ(0x0E);HAL_Delay(200);H_val=AP3216C_READ(0x0F);*PS=H_val<<4|(L_val&0x0F);L_val=AP3216C_READ(0x0C);HAL_Delay(200);H_val=AP3216C_READ(0x0D);*ALS=H_val<<8|(L_val);
}int fputc(int ch,FILE *FP)
{while(!((USART1->ISR)&1<<7));USART1->TDR=ch;return ch;
}
ap3216c.h
#ifndef __AP3216__H__
#define __AP3216__H__
#include "stdio.h"
#include "stdint.h"
#include "i2c.h"#define AP_WRITE_ADDR 0x3C
#define AP_READ_ADDR 0x3Duint8_t AP3216C_WRITE(uint8_t REG_ADDR,uint8_t command);
void AP3216C_Init();
uint8_t AP3216C_READ(uint8_t REG_ADDR);
void Get_Val(uint16_t *IR,uint16_t *PS,uint16_t *ALS);#endif
main.c
添加头文件
初始化:
输出:
运行结果: