I2C demo
#include "amaziot.h"
#define write_sht20_addr 0x80
#define read_sht20_addr 0x81
#define read_temp_cmd 0xE3
#define read_hum_cmd 0xE5
/****************************************************************************
* Function Name : GSensor_I2C_WriteReg
* Description : 设置sht20寄存器
* Input : addr:寄存器地址
* : dat:写入入数据
* Output : None
* Return : None
****************************************************************************/
```static void GSensor_I2C_WriteReg(unsigned char addr,unsigned char dat)
{
iicstart();
delay_iic_150us();
iicsendbyte(write_sht20_addr);
delay_iic_150us();
waitack();
delay_iic_150us();
iicsendbyte(addr);
delay_iic_150us();
waitack();
iicsendbyte(dat);
delay_iic_150us();
waitack();
iicstop();
delay_iic_150us();
}
```
/****************************************************************************
* Function Name : GSensor_I2C_ReadReg
* Description : 读取sht20寄存器
* Input : addr:读取地址
* Output : None
* Return : 读取到的16位数据
****************************************************************************/
```
static uint16_t GSensor_I2C_ReadReg(unsigned char addr)
{
uint16_t data = 0;
uint8_t checksum = 0;
iicstart();
delay_iic_150us();
iicsendbyte(write_sht20_addr);
delay_iic_150us();
waitack();
delay_iic_150us();
iicsendbyte(addr);
delay_iic_150us();
waitack();
delay_iic_150us();
iicstart();
delay_iic_150us();
iicsendbyte(read_sht20_addr);
delay_iic_150us();
waitack();
delay_iic_150us();
//等待传感器内部处理完成
delay_iic_ms(100);
//开始读温度数据的高八位
data = ((uint16_t)iicreceivebyte()) << 8;
sendack();
//读温度数据的低八位
data |= (uint16_t)iicreceivebyte();
sendack();
//读校验和
checksum = iicreceivebyte();
delay_iic_150us();
sendnotack();
delay_iic_150us();
iicstop();
delay_iic_150us();
return data;
}
#define USER_TASK_STACK_SIZE (4096)
#define USER_TASK_PRIORITY (COS_USER_TASKS_PRIORITY_BASE)
void UserTask(void *p_arg);
/*
add user task here
*/
VOID UserCreateTask(void)
{
gpio_I2CSDA.type=HAL_GPIO_TYPE_IO;
gpio_I2CSDA.id=39;
gpio_I2CSCL.type=HAL_GPIO_TYPE_IO;
gpio_I2CSCL.id=40;
sxr_StartFunctionTimer(1000 MILLI_SECONDS,UserTask,(VOID*)NULL,0x03);
}
void UserTask(void *p_arg)
{
AT_TC(10,"IIC Runing\r\n");
AT_WriteUart("IIC Runing\r\n", strlen("IIC Runing\r\n"));
uint16_t temp,hum;
temp = GSensor_I2C_ReadReg(read_temp_cmd);
AT_TC(10,"dmhtest:temp is %d!\n",temp);
hum = GSensor_I2C_ReadReg(read_hum_cmd);
AT_TC(10,"dmhtest:hum is %d!\n",hum);
sxr_StartFunctionTimer(5000 MILLI_SECONDS,UserTask,(VOID*)NULL,0x03);
}
```