3月17日作业
上图得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 0x3D
uint8_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
添加头文件
初始化:
输出:
运行结果: