【先楫HPM6750测评】+硬件IIC读取温湿度传感器数值
[复制链接]
在我们昨天尝试了下软件IIC读取之后,我稍微看了下先辑给的库,在硬件IIC上面也是非常简单的,基本就一个读取一个发送,这样我们可以尝试下硬件IIC读取我们的温湿度传感器,主要后面我们需要通过硬件IIC来进行触摸屏的移植工作。
- #include <stdio.h>
-
- #include "board.h"
-
- #include "hpm_debug_console.h"
-
-
-
- #define LED_FLASH_PERIOD_IN_MS 300
-
-
-
- #include "sht20.h"
-
- #include "i2c.h"
-
-
-
-
-
- #include "hpm_i2c_drv.h"
-
-
-
-
-
- float t = 12.67;
-
-
-
- #define SHT20_WriteAddr 0x40
-
- #define SHT20_ReadAddr 0x40
-
-
-
- #define SHT20_I2C BOARD_APP_I2C_BASE
-
- #define SHT20_I2C_CLOCK_NAME BOARD_APP_I2C_CLK_NAME
-
-
-
- float TemValue,RhValue;
-
-
-
- void SHT20_ReadValues(void)
-
- {
-
- uint8_t tem[3],rh[3];
-
- uint16_t Tdata=0,RHdata=0;
-
-
-
-
-
-
-
- uint8_t cmd=SHT20_Measurement_T_HM;
-
-
-
- if (status_success != i2c_master_write(SHT20_I2C, SHT20_WriteAddr, &cmd, sizeof(cmd))) {
-
- printf("Master write failed");
-
- while (1) {
-
- }
-
- }
-
-
-
- if (status_success != i2c_master_read(SHT20_I2C, SHT20_ReadAddr,tem,sizeof(tem))) {
-
- printf("Master read failed\n");
-
- while (1) {
-
- }
-
- }
-
- delay_ms(100);
-
- cmd=SHT20_Measurement_RH_HM;
-
-
-
- if (status_success != i2c_master_write(SHT20_I2C, SHT20_WriteAddr, &cmd, sizeof(cmd))) {
-
- printf("Master write failed");
-
- while (1) {
-
- }
-
- }
-
-
-
- if (status_success != i2c_master_read(SHT20_I2C, SHT20_ReadAddr,rh,sizeof(rh))) {
-
- printf("Master read failed\n");
-
- while (1) {
-
- }
-
- }
-
-
-
- delay_ms(100);
-
- Tdata = tem[0];
-
- Tdata <<= 8;
-
- Tdata += tem[1] & 0xfe;
-
-
-
- RHdata = rh[0];
-
- RHdata <<= 8;
-
- RHdata += rh[1] & 0xfe;
-
-
-
- TemValue = Tdata * 175.72f / 65536 - 46.85f;
-
- RhValue = RHdata * 125.0f / 65536 - 6.0f;
-
- }
-
-
-
- void SHT20_SoftReset(void)
-
- {
-
- uint8_t cmd=0xfe;
-
-
-
- if (status_success != i2c_master_write(SHT20_I2C, SHT20_WriteAddr, &cmd, sizeof(cmd))) {
-
- printf("Master write failed");
-
- while (1) {
-
- }
-
- }
-
- delay_ms(100);
-
- }
-
-
-
- int main(void)
-
- {
-
-
-
- int u;
-
- hpm_stat_t stat;
-
- uint32_t freq;
-
- i2c_config_t config;
-
-
-
- board_init();
-
- board_init_led_pins();
-
-
-
- init_i2c_pins(SHT20_I2C);
-
-
-
- config.i2c_mode = i2c_mode_normal;
-
- config.is_10bit_addressing = false;
-
- freq = clock_get_frequency(SHT20_I2C_CLOCK_NAME);
-
- stat = i2c_init_master(SHT20_I2C, freq, &config);
-
- if (stat != status_success) {
-
- return stat;
-
- }
-
-
-
- board_timer_create(LED_FLASH_PERIOD_IN_MS, board_led_toggle);
-
-
-
- IIC_Init();
-
-
-
- printf("hello world\n");
-
-
-
-
-
-
-
- while(1)
-
- {
-
-
-
-
-
- SHT20_SoftReset();
-
- SHT20_ReadValues();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- printf("TEMP:%f\r\n",TemValue);
-
- printf("HUMI:%f\r\n",RhValue);
-
-
-
- printf("ceshi:%f\r\n",t);
-
-
-
- delay_ms(1000);
-
-
-
- }
-
- return 0;
-
- }
看下上面的代码,我们对IIC的读取和写入就只需要一个函数就能搞定了。
需要注意下我们的地址,读写其实都是一个,看下里面读取是自己会加1,还有我们的地址其实是7位的。他会自己进行移位操作。
之后我们的确定下我们使用的端口,看代码是我们的I2C0,所以在P1上找到端口接上即可。
然后我们看下我们的SHT20的一个读写时序,可以看到其在发送完读取寄存器后,会有个转换时间的等待,所以这里我们需要修改下先辑提供的库了,不然永远返回的都是读取错误。
我们看下里面的源码,其是有一个判断超时的,是一个宏定义,所以我们需要修改下这个宏定义。
我在最开头的地方给其增大了很多,因为其CPU主频太高,速度快,所以增大了很多,这个值可以自己尝试修改,大概到不报读取错误即可。
之后打印,基本上和之前都是一样的操作,不同的是这次使用了硬件IIC。
|