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); } ```