执行演示代码

执行以下操作,以运行演示代码:

  1. 将以下源代码保存为test-shtc3.c ,并复制到Ubuntu下所需的路径:
    
    #include <stdio.h>
    #include <math.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    #include <stdint.h> 
    #include <getopt.h> 
    #include <fcntl.h> 
    #include <sys/ioctl.h> 
    #include <linux/types.h> 
    #include <linux/i2c.h>
    #include <linux/i2c-dev.h> 
    
    //i2c address
    #define SHTC3_I2C_ADDRESS	    0x70
    #define I2C_DEVICE		    "/dev/i2c-1"
    
    //Commands
    #define SHTC3_WakeUp                0x3517
    #define SHTC3_Sleep                 0xB098
    #define SHTC3_NM_CE_ReadTH          0x7CA2
    #define SHTC3_NM_CE_ReadRH          0x5C24
    #define SHTC3_NM_CD_ReadTH          0x7866
    #define SHTC3_NM_CD_ReadRH          0x58E0
    #define SHTC3_LM_CE_ReadTH          0x6458
    #define SHTC3_LM_CE_ReadRH          0x44DE
    #define SHTC3_LM_CD_ReadTH          0x609C
    #define SHTC3_LM_CD_ReadRH          0x401A
    #define SHTC3_Software_RES          0x401A
    #define SHTC3_ID                    0xEFC8
    
    #define CRC_POLYNOMIAL              0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
    
    float TH_Value,RH_Value;
    char checksum;
    int fd;
    char SDA = 8;
    char SCL = 9;
    char SHTC3_CheckCrc(char data[],unsigned char len,unsigned char checksum)
    {
      unsigned char bit;        // bit mask
      unsigned char crc = 0xFF; // calculated checksum
      unsigned char byteCtr;    // byte counter
      // calculates 8-Bit checksum with given polynomial
      for(byteCtr = 0; byteCtr < len; byteCtr++) {
        crc ^= (data[byteCtr]);
        for(bit = 8; bit > 0; --bit) {
          if(crc & 0x80) {
            crc = (crc << 1) ^ CRC_POLYNOMIAL;
          } else {
            crc = (crc << 1);
          }
        }
      }
    
      // verify checksum
      if(crc != checksum) {                 
        return 1;                       //Error
      } else {
        return 0;                       //No error
      }       
    }
    void SHTC3_WriteCommand(unsigned short cmd)
    {   
        char buf[] = { (cmd>>8) ,cmd};
    	write(fd,buf,2); 
    }
    void SHTC3_WAKEUP()
    {     
        SHTC3_WriteCommand(SHTC3_WakeUp);                  // Write wake_up command  
        usleep(300);                          //Delay 300us
          
    }
    void SHTC3_SLEEP()
    {    
     //   bcm2835_i2c_begin();
        SHTC3_WriteCommand(SHTC3_Sleep);                        // Write sleep command
          
    }
    
    void SHTC_SOFT_RESET()
    {   
        SHTC3_WriteCommand(SHTC3_Software_RES);                 // Write reset command
        usleep(300);                                 //Delay 300us
         
    }
    
    void SHTC3_Read_DATA()
    {   
        unsigned short TH_DATA,RH_DATA;
        char buf[3];
       SHTC3_WriteCommand(SHTC3_NM_CD_ReadTH);                 //Read temperature first, clock stretching disabled (polling)
        usleep(20000);
        read(fd, buf, 3);
    
       checksum=buf[2];
       if(!SHTC3_CheckCrc(buf,2,checksum))
            TH_DATA=(buf[0]<<8|buf[1]);
        
        SHTC3_WriteCommand(SHTC3_NM_CD_ReadRH);                 //Read temperature first, clock stretching disabled (polling)
        usleep(20000);
        read(fd, buf, 3);
    
        checksum=buf[2];
        if(!SHTC3_CheckCrc(buf,2,checksum))
            RH_DATA=(buf[0]<<8|buf[1]);
        
        TH_Value=175 * (float)TH_DATA / 65536.0f - 45.0f;       //Calculate temperature value
        RH_Value=100 * (float)RH_DATA / 65536.0f;              //Calculate humidity value  
        
    }
    
    int main()
    {   
        printf("\n SHTC3 Sensor Test Program ...\n");
    	fd = open(I2C_DEVICE, O_RDWR);
    	if(fd < 0)
    	{
    		printf("Fail to open i2c device\r\n");
    		return -1;
    	}
    	else
    	{
    		printf("Fopen : %s\r\n", I2C_DEVICE);
    	}
    
    	if(ioctl(fd, I2C_SLAVE, SHTC3_I2C_ADDRESS) < 0)
    	{
    		printf("I2C: Failed to connect to the device\n");
    		return -1;
    	}
    
        SHTC_SOFT_RESET();
        while (1)
        {
            SHTC3_Read_DATA();
            SHTC3_SLEEP();
            SHTC3_WAKEUP();
    
    	    printf("Temperature = %6.2f°C , Humidity = %6.2f%% \r\n", TH_Value, RH_Value);
        }
        return 0;
    }
  2. (可选)安装编译工具。以下是安装示例:
    sudo apt-get install gcc-riscv64-linux-gnu
    注:
    • 如已安装该工具,则可跳过此步。
    • 安装完成后,运行以下命令检查版本是否已更新:linus@star-five$ riscv64-linux-gnu-gcc -v。以下是示例输出:

      1. 示例输出
  3. 执行以下命令进行编译:
    riscv64-linux-gnu-gcc -o test-shtc3 test-shtc3.c
    结果:
    • 系统将在同一目录生成名为test-shtc3的文件。
    • 如在输出中显示UCB RISC-V,则表示在RISC-V平台上运行的可执行代码已成功生成:
      Riscv@starfive:~/work/app/iic$ file test-shtc3
      test-shtc3: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, for GNU/Linux 4.15.0, BuildID[sha1]=560aeb713ece667ab5f3a5f0dcbd75a149216e6f, not strippe
  4. 在Ubuntu环境中执行以下操作,通过以太网,将test-shtc3文件中的可执行代码上传到单板计算机上:
    rsync ./test-shtc3 <User_Name>@<Board_IP_Address>:/home/riscv

    信息:

    • <User_Name>: 开发板的用户名。例如:riscv。
    • <Board_IP_Address>: 开发板的IP地址。例如:192.168.92.133。

    示例:

    rsync ./test-shtc3 riscv@192.168.92.133:/home/riscv
  5. 执行以下命令,以在昉·星光单板计算机上运行代码:
    ./test-shtc3Copy

    现在,我们已经成功读取了温度和湿度数据。

    结果:

    如输出以下结果,则表示执行成功:

    [root@fedora-starfive test]# ./test-shtc3
    
     SHTC3 Sensor Test Program ...
    Fopen : /dev/i2c-1
    Temperature =  -7.30°C , Humidity =  21.28%
    Temperature =  25.74°C , Humidity =  21.26%
    Temperature =  25.72°C , Humidity =  21.24%
    Temperature =  25.74°C , Humidity =  21.24%
    Temperature =  25.75°C , Humidity =  21.21%
    Temperature =  25.75°C , Humidity =  21.21%
    Temperature =  25.77°C , Humidity =  21.19%
    Temperature =  25.76°C , Humidity =  21.18%
    Temperature =  25.76°C , Humidity =  21.15%
    Temperature =  25.77°C , Humidity =  21.15%
    Temperature =  25.74°C , Humidity =  21.12%
    Temperature =  25.76°C , Humidity =  21.12%
    Temperature =  25.75°C , Humidity =  21.09%
    Temperature =  25.78°C , Humidity =  21.09%
    Temperature =  25.75°C , Humidity =  21.08%
    Temperature =  25.81°C , Humidity =  21.09%
    Temperature =  25.76°C , Humidity =  21.05%
    Temperature =  25.77°C , Humidity =  21.03%
    Temperature =  25.76°C , Humidity =  21.03%
    Temperature =  25.78°C , Humidity =  21.02%
    Temperature =  25.77°C , Humidity =  21.01%
    Temperature =  25.75°C , Humidity =  20.98%
    Temperature =  25.78°C , Humidity =  20.99%
    Temperature =  25.75°C , Humidity =  20.96%
    Temperature =  25.78°C , Humidity =  20.95%