- #define AT32I2C_TIMEOUT 0xFFFF
- void yuyy_hard_iic_reset_ctrl2_register(i2c_type *iicx)
- {
- iicx->ctrl2_bit.saddr = 0;
- iicx->ctrl2_bit.readh10 = 0;
- iicx->ctrl2_bit.cnt = 0;
- iicx->ctrl2_bit.rlden = 0;
- iicx->ctrl2_bit.dir = 0;
- }
- uint8_t yuyy_hard_iic_wait_flag(i2c_type *iicx,uint32_t flag,flag_status status)
- {
- uint16_t timeout = AT32I2C_TIMEOUT;
- while(i2c_flag_get(iicx, flag) != status)
- {
- timeout -= 1;
- if(timeout == 0)
- return 1;
- }
- return 0;
- }
- uint8_t yuyy_hard_iic_master_sendstop(i2c_type *iicx)
- {
- i2c_stop_generate(iicx);
- if(yuyy_hard_iic_wait_flag(iicx,I2C_STOPF_FLAG,SET))
- return 1;
- i2c_flag_clear(iicx, I2C_STOPF_FLAG);
- return 0;
- }
- uint8_t yuyy_hard_iic_master_sendstart(i2c_type *iicx,uint8_t devaddr,i2c_start_mode_type startmode,i2c_reload_stop_mode_type stopmode,uint8_t datalen)
- {
- uint16_t timeout = AT32I2C_TIMEOUT;
- if(yuyy_hard_iic_wait_flag(iicx,I2C_BUSYF_FLAG,RESET))
- return 1;
- i2c_transmit_set(iicx, devaddr<<1, datalen, stopmode, startmode);
- return 0;
- }
- uint8_t yuyy_hard_iic_master_senddatas(i2c_type *iicx,uint8_t *datas,uint8_t datalen)
- {
- uint8_t i=0;
- while(i<datalen)
- {
- if(yuyy_hard_iic_wait_flag(iicx,I2C_TDIS_FLAG,SET))
- {
- if(i2c_flag_get(iicx, I2C_ACKFAIL_FLAG) != RESET)
- {
- i2c_flag_clear(iicx, I2C_ACKFAIL_FLAG);
- return 3;
- }
- yuyy_hard_iic_master_sendstop(iicx);
- return 2;
- }
- if(i2c_flag_get(iicx, I2C_ACKFAIL_FLAG) != RESET)
- {
- i2c_flag_clear(iicx, I2C_ACKFAIL_FLAG);
- return 3;
- }
- i2c_data_send(iicx, datas[i]);
- i += 1;
- }
- return 0;
- }
- uint8_t yuyy_hard_iic_master_readdatas(i2c_type *iicx,uint8_t *datas,uint8_t datalen)
- {
- uint8_t i=0;
-
- while(i<datalen)
- {
- if(yuyy_hard_iic_wait_flag(iicx,I2C_RDBF_FLAG,SET))
- {
- if(i2c_flag_get(iicx, I2C_ACKFAIL_FLAG) != RESET)
- {
- i2c_flag_clear(iicx, I2C_ACKFAIL_FLAG);
- return 3;
- }
- yuyy_hard_iic_master_sendstop(iicx);
- return 2;
- }
- datas[i] = i2c_data_receive(iicx);
- i += 1;
- }
- return 0;
- }
- uint8_t yuyy_hard_iic_master_sendregdatas(i2c_type *iicx,uint8_t devaddr,uint16_t regaddr,uint8_t regaddrlen,uint8_t *datas,uint8_t datalen)
- {
- uint8_t err = 0,regdata[2];
- err = yuyy_hard_iic_master_sendstart(iicx,devaddr,I2C_GEN_START_WRITE,I2C_SOFT_STOP_MODE,regaddrlen+datalen);
- if(err == 0 && regaddrlen > 0)
- {
- regdata[0] = (regaddr >> 8)&0xFF;
- regdata[1] = regaddr&0xFF;
- if(regaddrlen == 1)
- regdata[0] = regaddr&0xFF;
- err = yuyy_hard_iic_master_senddatas(iicx,regdata,regaddrlen);
- }
- if(err == 0)
- err = yuyy_hard_iic_master_senddatas(iicx,datas,datalen);
- if(err == 0 && yuyy_hard_iic_wait_flag(iicx,I2C_TDC_FLAG,SET))
- err = 4;
- if(err == 0)
- err = yuyy_hard_iic_master_sendstop(iicx);
- if(err != 0)
- yuyy_hard_iic_reset_ctrl2_register(iicx);
- return err;
- }
- uint8_t yuyy_hard_iic_master_readregdatas(i2c_type *iicx,uint8_t devaddr,uint16_t regaddr,uint8_t regaddrlen,uint8_t *datas,uint8_t datalen)
- {
- uint8_t err = 0,regdata[2];
- if(regaddrlen > 0)
- {
- regdata[0] = (regaddr >> 8)&0xFF;
- regdata[1] = regaddr&0xFF;
- if(regaddrlen == 1)
- regdata[0] = regaddr&0xFF;
- err = yuyy_hard_iic_master_sendstart(iicx,devaddr,I2C_GEN_START_WRITE,I2C_SOFT_STOP_MODE,regaddrlen);
- if(err == 0)
- err = yuyy_hard_iic_master_senddatas(iicx,regdata,regaddrlen);
- if(err == 0 && yuyy_hard_iic_wait_flag(iicx,I2C_TDC_FLAG,SET))
- err = 4;
- }
- if(err == 0)
- i2c_transmit_set(iicx, devaddr<<1, datalen, I2C_SOFT_STOP_MODE, I2C_GEN_START_READ);
- if(err == 0)
- err = yuyy_hard_iic_master_readdatas(iicx,datas,datalen);
- if(err == 0)
- err = yuyy_hard_iic_master_sendstop(iicx);
- if(err != 0)
- yuyy_hard_iic_reset_ctrl2_register(iicx);
- return err;
- }
DHTC12通讯代码
- #define DHTC12_I2C_ADDR 0x44
- static uint16_t HumA,HumB;
- uint8_t yuyy_dhtc12_writecmd(YUYY_DHTC12_DEV_t *dhtc12_dev,uint16_t cmd)
- {
- return dhtc12_dev->iic_senddatas_func(dhtc12_dev->iicx,DHTC12_I2C_ADDR,cmd,2,NULL,0);
- }
- uint8_t yuyy_dhtc12_readdatas(YUYY_DHTC12_DEV_t *dhtc12_dev,uint8_t *rdatas,uint8_t rlen)
- {
- return dhtc12_dev->iic_readdatas_func(dhtc12_dev->iicx,DHTC12_I2C_ADDR,0,0,rdatas,rlen);
- }
- uint8_t yuyy_dhtc12_readcmd(YUYY_DHTC12_DEV_t *dhtc12_dev,uint16_t cmd,uint8_t *rdatas,uint8_t rlen)
- {
- return dhtc12_dev->iic_readdatas_func(dhtc12_dev->iicx,DHTC12_I2C_ADDR,cmd,2,rdatas,rlen);
- }
- //初始化,获取湿度运算系数
- void yuyy_dhtc12_init(YUYY_DHTC12_DEV_t *dhtc12_dev)
- {
- uint8_t x;
- if(!dhtc12_dev->delayms_func)
- dhtc12_dev->delayms_func = yuyy_delay_ms;
- //复位传感器
- yuyy_dhtc12_writecmd(dhtc12_dev,0x30A2);
- yuyy_dhtc12_readcmd(dhtc12_dev,0xD208,&x,1);
- HumA = (x<<8)&0xFF00;
- yuyy_dhtc12_readcmd(dhtc12_dev,0xD209,&x,1);
- HumA |= x;
-
- yuyy_dhtc12_readcmd(dhtc12_dev,0xD20A,&x,1);
- HumB = (x<<8)&0xFF00;
- yuyy_dhtc12_readcmd(dhtc12_dev,0xD20B,&x,1);
- HumB |= x;
- //HumA=0x7168; HumB=0x2D73;
- //ReadDatSH[6]={0xF3, 0xA9, 0xC0, 0x41, 0xB4, 0x87}
- //27.6 48.4%
- }
- const uint16_t POLYNOMIAL = 0x131; //P(x)=x^8+x^5+x^4+1 = 100110001
- uint8_t yuyy_dhtc12_checkcrc(uint8_t Data[], uint8_t nbrOfBytes)
- {
- uint8_t crc = 0xff; //0
- uint8_t byteCtr,Bit;
- //calculates 8-Bit checksum with given polynomial
- for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
- {
- crc ^= (Data[byteCtr]);
- for (Bit = 8; Bit > 0; --Bit)
- {
- if (crc & 0x80)
- crc = (crc << 1) ^ POLYNOMIAL;
- else
- crc = (crc << 1);
- }
- }
- if (crc != Data[nbrOfBytes])
- {
- Data[nbrOfBytes] = crc;
- return 0x01;
- }
- else
- return 0;
- }
- //单次触发温湿度测量
- uint8_t yuyy_dhtc12_readHT(YUYY_DHTC12_DEV_t *dhtc12_dev,float *tem,float *hum)
- {
- uint8_t i=0,errRe,ReadDatSH[6],CalCRC[3],errorflag=0;
- int16_t TemBuf;
- uint16_t CapBuf;
- errRe = yuyy_dhtc12_writecmd(dhtc12_dev,0x2C10);
- if(errRe)
- errRe = yuyy_dhtc12_writecmd(dhtc12_dev,0x2C10);
- if(errRe)
- {
- return 0x10|errRe; //发送命令失败
- }
-
- dhtc12_dev->delayms_func(100);
- errRe = yuyy_dhtc12_readdatas(dhtc12_dev,ReadDatSH,6);
- if(errRe)
- {
- return 0x20|errRe; //接收数据失败
- }
- CalCRC[0] = ReadDatSH[0];
- CalCRC[1] = ReadDatSH[1];
- CalCRC[2] = ReadDatSH[2];
- errorflag = yuyy_dhtc12_checkcrc(CalCRC,2);
- if(errorflag==0)
- {
- TemBuf = (int16_t)(((ReadDatSH[0]<<8)&0xFF00)|ReadDatSH[1]);
- *tem = 40+(float)TemBuf/256.0;
- }
- CalCRC[0] = ReadDatSH[3];
- CalCRC[1] = ReadDatSH[4];
- CalCRC[2] = ReadDatSH[5];
- errorflag <<= 1;
- errorflag |= yuyy_dhtc12_checkcrc(CalCRC,2);
- if(errorflag==0)
- {
- CapBuf = (uint16_t)(((ReadDatSH[3]<<8)&0xFF00)|ReadDatSH[4]);
- *hum = (float)(CapBuf-HumB)*60.0/(float)(HumA-HumB)+30;
- //20℃为5个湿度点 即1℃为0.25个湿度点 0.1℃为0.025
- *hum = *hum+ 0.25*(*tem-25);
- if(*hum>100)
- *hum = 99.9;
- else if(*hum<0)
- *hum = 0;
- }
- return errorflag;
- }
初始化和读取温湿度并打印出来
- YUYY_DHTC12_DEV_t dhtc12_dev;
- void dhtc12_init()
- {
- dhtc12_dev.iicx = I2C1;
- dhtc12_dev.iic_readdatas_func = (yuyy_iic_master_readdatas_func_t)yuyy_hard_iic_master_readregdatas;
- dhtc12_dev.iic_senddatas_func = (yuyy_iic_master_senddatas_func_t)yuyy_hard_iic_master_sendregdatas;
- yuyy_dhtc12_init(&dhtc12_dev);
- }
- void dhtc12_readTH()
- {
- float humi,temp;
- uint8_t result = yuyy_dhtc12_readHT(&dhtc12_dev,&temp,&humi);
- if(YUYY_DHT11_OK == result)
- {
- printf("DHTC12 读取温度:%.1f℃ 湿度:%.1f%%\r\n",temp,humi);
- }
- else
- {
- printf("DHTC12 读取温度错误:%d\r\n",result);
- }
- }
运行效果