执行演示代码
执行以下操作,以运行演示代码:
-
将以下源代码保存为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; }
-
(可选)安装编译工具。以下是安装示例:
sudo apt-get install gcc-riscv64-linux-gnu
注:- 如已安装该工具,则可跳过此步。
-
安装完成后,运行以下命令检查版本是否已更新:
linus@star-five$ riscv64-linux-gnu-gcc -v
。以下是示例输出:
-
执行以下命令进行编译:
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
- 系统将在同一目录生成名为
-
在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
-
执行以下命令,以在昉·星光单板计算机上运行代码:
./test-shtc3
Copy现在,我们已经成功读取了温度和湿度数据。
结果:
如输出以下结果,则表示执行成功:
[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%