一、前言

初学linux,从hellow word开始,但是我这现在连初学都算不上,还没到学习hellow word驱动那一步,目前就是利用文件io驱动最最最最简单基础的led或者最最最简单的不要求时序和速度的ic

注:本文未使用到驱动,只用到文件io输入输出,和交叉编译

二、环境

Ubuntu16

vaware 12

全志a40i(linux3.10)

window10

a40i交叉编译器

三、正文

1.输出

方式一:指定引脚PG8或其他输出

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>int main(int argc, char *argv[])
{while(1){system("echo 1 > /sys/class/gpio_sw/PG8/data");usleep(10000);system("echo 0 > /sys/class/gpio_sw/PG8/data");usleep(10000);}return 0;
}

优点:无需初始化io输入输出状态,直接可以使用

方式二:将引脚转换为对应端口号驱动GPIO的计算公式为(32 * (bank) + (gpio))

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
char *GPIO_PATH = "/sys/class/gpio/gpio271/value";
int main(int argc, char *argv[])
{int fd;char *path;path = GPIO_PATH;system("echo 271 > /sys/class/gpio/export");//led6system("echo out > /sys/class/gpio/gpio271/direction");fd = open(path, O_WRONLY);if(fd<0){printf("Failed to Open gpio %s\n", path);exit(1);}while(1){write(fd, "1", 1);usleep(200000);write(fd, "0", 1);usleep(200000);}close(fd);return 0;
}

2.输入

方式一:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <poll.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
char *GPIO_PATH = "/sys/class/gpio/gpio41/value";//PB9
long long times=0;
void sysUsecTime();
int main(int argc, char *argv[])
{system("echo 41 > /sys/class/gpio/export");//PB9system("echo in > /sys/class/gpio/gpio41/direction");//PB9//system("echo rising > /sys/class/gpio/gpio41/edge");//PB9//usleep(100000);//延时100msint gpio_value = 1;char value_str[3];int fd;sysUsecTime();while(gpio_value){fd = open(GPIO_PATH, O_RDONLY);if (fd < 0) {perror("Failed to open gpio value for reading!");return -1;}if (read(fd, value_str, 3) < 0) {perror("Failed to read value!");return -1;}gpio_value=atoi(value_str);close(fd);times++;//usleep(1000);if(times>1000000)//超时1秒退出break;}printf("times:%d,value:%d\r\n",times,gpio_value);sysUsecTime();return 0;}

方式二:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <poll.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
char *GPIO_PATH = "/sys/class/gpio/gpio41/value";//PB9
long long times=0;
void sysUsecTime();
int main(int argc, char *argv[])
{system("echo 41 > /sys/class/gpio/export");//PB9system("echo in > /sys/class/gpio/gpio41/direction");//PB9//system("echo rising > /sys/class/gpio/gpio41/edge");//PB9//usleep(100000);//延时100msint gpio_value = 1;FILE *fp;sysUsecTime();while(gpio_value){fp = fopen(GPIO_PATH,"rb+");fscanf(fp, "%d", &gpio_value);fclose(fp);times++;//usleep(1000);if(times>1000000)break;}printf("times:%d,value:%d\r\n",times,gpio_value);sysUsecTime();return 0;}

快捷输入输出设置方式:

例子1:以AD7606驱动代码为例(目前此方式未成功驱动成功,怀疑此方法不适合驱动AD7606,需要使用驱动的方式)(只是IO输入输出做为参考)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <poll.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>#define SUNXI_PA_BASE    0
#define SUNXI_PB_BASE   32
#define SUNXI_PC_BASE   64
#define SUNXI_PD_BASE   96
#define SUNXI_PE_BASE   128
#define SUNXI_PF_BASE   160
#define SUNXI_PG_BASE   192
#define SUNXI_PH_BASE   224
#define SUNXI_PI_BASE   256
#define SUNXI_PJ_BASE   288
#define SUNXI_PK_BASE   320
#define SUNXI_PL_BASE   352
#define SUNXI_PM_BASE   384
#define SUNXI_PN_BASE   416
#define SUNXI_PO_BASE   448
#define AXP_PIN_BASE    1024
/* sunxi gpio name space */
#define GPIOA(n)    (SUNXI_PA_BASE + (n))
#define GPIOB(n)    (SUNXI_PB_BASE + (n))
#define GPIOC(n)    (SUNXI_PC_BASE + (n))
#define GPIOD(n)    (SUNXI_PD_BASE + (n))
#define GPIOE(n)    (SUNXI_PE_BASE + (n))
#define GPIOF(n)    (SUNXI_PF_BASE + (n))
#define GPIOG(n)    (SUNXI_PG_BASE + (n))
#define GPIOH(n)    (SUNXI_PH_BASE + (n))
#define GPIOI(n)    (SUNXI_PI_BASE + (n))
#define GPIOJ(n)    (SUNXI_PJ_BASE + (n))
#define GPIOK(n)    (SUNXI_PK_BASE + (n))
#define GPIOL(n)    (SUNXI_PL_BASE + (n))
#define GPIOM(n)    (SUNXI_PM_BASE + (n))
#define GPION(n)    (SUNXI_PN_BASE + (n))
#define GPIOO(n)    (SUNXI_PO_BASE + (n))
#define GPIO_AXP(n) (AXP_PIN_BASE  + (n))#define data15 get_gpio_value(GPIOB(3))
#define data14 get_gpio_value(GPIOB(5))
#define data13 get_gpio_value(GPIOI(15))
#define data12 get_gpio_value(GPIOG(5))
#define data11 get_gpio_value(GPIOG(4))
#define data10 get_gpio_value(GPIOG(3))
#define data09 get_gpio_value(GPIOG(2))
#define data08 get_gpio_value(GPIOG(0))
#define data07 get_gpio_value(GPIOG(1))
#define data06 get_gpio_value(GPIOI(3))
#define data05 get_gpio_value(GPIOI(2))
#define data04 get_gpio_value(GPIOI(1))
#define data03 get_gpio_value(GPIOI(0))
#define data02 get_gpio_value(GPIOB(12))
#define data01 get_gpio_value(GPIOB(10))
#define data00 get_gpio_value(GPIOB(8))#define AD7606_BUSY get_gpio_value(GPIOI(11))
#define AD7606_FASTDATA get_gpio_value(GPIOH(0))//no used#define AD7606_OS0_H()     set_gpio_value(GPIOF(5),"1")
#define AD7606_OS0_L()     set_gpio_value(GPIOF(5),"0")
#define AD7606_OS1_H()     set_gpio_value(GPIOF(4),"1")
#define AD7606_OS1_L()     set_gpio_value(GPIOF(4),"0")
#define AD7606_OS2_H()     set_gpio_value(GPIOF(3),"1")
#define AD7606_OS2_L()     set_gpio_value(GPIOF(3),"0")#define AD7606_CS_RD_H()   set_gpio_value(GPIOF(0),"1")
#define AD7606_CS_RD_L()   set_gpio_value(GPIOF(0),"0")#define AD7606_Reset_H()   set_gpio_value(GPIOF(1),"1")
#define AD7606_Reset_L()   set_gpio_value(GPIOF(1),"0")#define AD7606_CONVT_H()   set_gpio_value(GPIOF(2),"1")
#define AD7606_CONVT_L()   set_gpio_value(GPIOF(2),"0")#define LED_on()    set_gpio_value(GPIOB(11),"0")
#define LED_off()   set_gpio_value(GPIOB(11),"1")

需要以下代码做为支撑

long long times=0;
void sysUsecTime();
//创建gpio文件
void init_gpio_export(int n)
{FILE * fp =fopen("/sys/class/gpio/export","w");if (fp == NULL)perror("export open filed");elsefprintf(fp,"%d",n);fclose(fp);
}
//设置gpio的模式 输入/输出 in/out
void set_gpio_direction(int n,const char *direction)
{char path[100] = {0};sprintf(path,"/sys/class/gpio/gpio%d/direction",n);FILE * fp =fopen(path,"w");if (fp == NULL)perror("direction open filed");elsefprintf(fp,"%s",direction);fclose(fp);
}
//获取gpio(n)的数值 0/1
int get_gpio_value(int n)
{char path[64];char value_str[3];int fd;snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", n);fd = open(path, O_RDONLY);if (fd < 0) {perror("Failed to open gpio value for reading!");return -1;}if (read(fd, value_str, 3) < 0) {perror("Failed to read value!");return -1;}close(fd);return (atoi(value_str));
}
//输出gpio(n)的数值 0/1  (方式一)
void set_gpio_value(int n,const char *value)
{char path[50];//char value_str[3];int fd;snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", n);fd = open(path, O_WRONLY);//snprintf(value_str, sizeof(value_str), "%d", value);write(fd, value, 1);close(fd);
}
//输出gpio(n)的数值 0/1  (方式二)
int set_gpio_value1(int gpio, int value)
{FILE *p = NULL;char gpio_value_path[50];sprintf(gpio_value_path, "/sys/class/gpio/gpio%d/value", gpio);p = fopen(gpio_value_path, "w");fprintf(p, "%d", value);fclose(p);return 0;
}
//IO初始化函数
void IOinit(void)
{
/* ------------      AD7606_DB[0..15]       ----------- */init_gpio_export(GPIOB(8));//AD7606_DB0set_gpio_direction(GPIOB(8),"in");init_gpio_export(GPIOB(10));//AD7606_DB1set_gpio_direction(GPIOB(10),"in");init_gpio_export(GPIOB(12));//AD7606_DB2set_gpio_direction(GPIOB(12),"in");init_gpio_export(GPIOI(0));//AD7606_DB3set_gpio_direction(GPIOI(0),"in");init_gpio_export(GPIOI(1));//AD7606_DB4set_gpio_direction(GPIOI(1),"in");init_gpio_export(GPIOI(2));//AD7606_DB5set_gpio_direction(GPIOI(2),"in");init_gpio_export(GPIOI(3));//AD7606_DB6set_gpio_direction(GPIOI(3),"in");init_gpio_export(GPIOG(1));//AD7606_DB7set_gpio_direction(GPIOG(1),"in");init_gpio_export(GPIOG(0));//AD7606_DB8set_gpio_direction(GPIOG(0),"in");init_gpio_export(GPIOG(2));//AD7606_DB9set_gpio_direction(GPIOG(2),"in");init_gpio_export(GPIOG(3));//AD7606_DB10set_gpio_direction(GPIOG(3),"in");init_gpio_export(GPIOG(4));//AD7606_DB11set_gpio_direction(GPIOG(4),"in");init_gpio_export(GPIOG(5));//AD7606_DB12set_gpio_direction(GPIOG(5),"in");init_gpio_export(GPIOI(15));//AD7606_DB13set_gpio_direction(GPIOI(15),"in");init_gpio_export(GPIOB(5));//AD7606_DB14set_gpio_direction(GPIOB(5),"in");init_gpio_export(GPIOB(3));//AD7606_DB15set_gpio_direction(GPIOB(3),"in");
/* ------------      AD7606_AD_OS[0..2]       ----------- */init_gpio_export(GPIOF(5));//AD7606_OS0set_gpio_direction(GPIOF(5),"out");init_gpio_export(GPIOF(4));//AD7606_OS1set_gpio_direction(GPIOF(4),"out");init_gpio_export(GPIOF(3));//AD7606_OS2set_gpio_direction(GPIOF(3),"out");
/* ------------        RESET       ----------- */init_gpio_export(GPIOF(1));//AD7606_RESETset_gpio_direction(GPIOF(1),"out");
/* ------------        CONVST       ----------- */init_gpio_export(GPIOF(2));//AD7606_CONVSTset_gpio_direction(GPIOF(2),"out");
/* ------------        BUSY       ----------- */init_gpio_export(GPIOI(11));//AD7606_BUSYset_gpio_direction(GPIOI(11),"in");
/* ------------        FSTDATA      ----------- */init_gpio_export(GPIOH(0));//AD7606_FASTDATAset_gpio_direction(GPIOH(0),"in");
/* ------------        CS/RD      ----------- */init_gpio_export(GPIOF(0));//AD7606_CS/RDset_gpio_direction(GPIOF(0),"out");init_gpio_export(GPIOB(11));set_gpio_direction(GPIOB(11),"out");
}
//IO释放函数
void IOreleaset(void)
{}
void IO_In_test(void)
{
printf("\r\n");
printf("channel0=%d\r\n",data00);
printf("channel1=%d\r\n",data01);
printf("channel2=%d\r\n",data02);
printf("channel3=%d\r\n",data03);
printf("channel4=%d\r\n",data04);
printf("channel5=%d\r\n",data05);
printf("channel6=%d\r\n",data06);
printf("channel7=%d\r\n",data07);
printf("channel8=%d\r\n",data08);
printf("channel9=%d\r\n",data09);
printf("channel10=%d\r\n",data10);
printf("channel11=%d\r\n",data11);
printf("channel12=%d\r\n",data12);
printf("channel13=%d\r\n",data13);
printf("channel14=%d\r\n",data14);
printf("channel15=%d\r\n",data15);
printf("busy=%d\r\n",AD7606_BUSY);
printf("fastdata=%d\r\n",AD7606_FASTDATA);
}
void IO_out_test(void)
{AD7606_OS0_L();AD7606_OS1_L();AD7606_OS2_L();AD7606_CS_RD_L();AD7606_Reset_L();AD7606_CONVT_L();LED_off();
}
//AD7606初始化函数
void AD7606init(void)
{AD7606_OS0_L();AD7606_OS1_L();AD7606_OS2_L();AD7606_CONVT_H();AD7606_CS_RD_H();AD7606_Reset_L();// AD7606_Reset_H();//AD7606_Reset_L();
}
int16_t ADC_buf[8];//读取ad缓存
int16_t ADC_1_2[8];//待存储的采集原始数据
float   ADC_buf_float[8];//调试查看的转换值,0x38为零漂,这里暂时设为这个,上位机在单独配置每个通道的零漂  和  计算实际数值
//读取数值函数
void AD7606_Read(void)
{//AD7606_Reset_H();//AD7606_Reset_L();AD7606_CS_RD_H();AD7606_CONVT_L();AD7606_CONVT_H();while(AD7606_BUSY);AD7606_CS_RD_L();for(int i=0;i<8;i++){ADC_buf[i] = 0;AD7606_CS_RD_L();ADC_buf[i] = data15;ADC_buf[i] = ADC_buf[i]<<1 | data14;ADC_buf[i] = ADC_buf[i]<<1 | data13;ADC_buf[i] = ADC_buf[i]<<1 | data12;ADC_buf[i] = ADC_buf[i]<<1 | data11;ADC_buf[i] = ADC_buf[i]<<1 | data10;ADC_buf[i] = ADC_buf[i]<<1 | data09;ADC_buf[i] = ADC_buf[i]<<1 | data08;ADC_buf[i] = ADC_buf[i]<<1 | data07;ADC_buf[i] = ADC_buf[i]<<1 | data06;ADC_buf[i] = ADC_buf[i]<<1 | data05;ADC_buf[i] = ADC_buf[i]<<1 | data04;ADC_buf[i] = ADC_buf[i]<<1 | data03;ADC_buf[i] = ADC_buf[i]<<1 | data02;ADC_buf[i] = ADC_buf[i]<<1 | data01;ADC_buf[i] = ADC_buf[i]<<1 | data00;AD7606_CS_RD_H();}  AD7606_CS_RD_L();printf("\r\n");for(int i=0;i<8;i++){//ADC_buf_float只是看,没使用到ADC_buf_float[i] = (float)(ADC_buf[i]) * 5 / 32768*4;ADC_1_2[i] = ADC_buf[i];printf("ad7606 get channel-%d value = %f, hex = %d\r\n",i+1,ADC_buf_float[i],ADC_1_2[i]);}}
int main()
{sysUsecTime();IOinit();AD7606init();times=0;while(1){usleep(1000000);//IO_out_test();AD7606_Read();//IO_In_test();//if(data00)LED_H();    //else LED_L();}return 0;}
void sysUsecTime()
{ struct timeval    tv; struct timezone tz; struct tm         *p; gettimeofday(&tv, &tz); //printf("tv_sec:%ld\n",tv.tv_sec); //printf("tv_usec:%ld\n",tv.tv_usec); //printf("tz_minuteswest:%d\n",tz.tz_minuteswest); //printf("tz_dsttime:%d\n",tz.tz_dsttime); p = localtime(&tv.tv_sec); printf("time_now:%d-%d-%d %d:%d:%d.%ld\n", 1900+p->tm_year, 1+p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, tv.tv_usec);
}

例子2:以HX711驱动代码为例(同样未成功,使用逻辑分析仪发现sda输入只有一个脉冲,怀疑是此类文件io方式驱动未设置io为浮空上拉模式,故失败,需要采用驱动的形式在测试)(只是IO输入输出做为参考)


//参考链接:https://blog.csdn.net/u011983700/article/details/106923194/
/GPIO的计算公式为(32 * (bank) + (gpio))/
//direction:设置输出还是输入模式
//设置为输入:echo “in” > direction
//设置为输出:echo “out” > direction//value:输出时,控制高低电平;输入时,获取高低电平
//高电平:echo 1 > value
//低电平:echo 0 > value//edge:控制中断触发模式,引脚被配置为中断后可以使用poll() 函数监听引脚
//非中断引脚: echo “none” > edge
//上升沿触发:echo “rising” > edge
//下降沿触发:echo “falling” > edge
//边沿触发:echo “both” > edge//IO配置
//输入IO
//;IIC_SDA1  PG0
//;IIC_SDA2  PG3
//;IIC_SDA3  PG5
//;IIC_SDA4  PI2
//;IIC_SDA5  PI0//输出IO
//;IIC_SCK1  PG2
//;IIC_SCK2  PG4
//;IIC_SCK3  PI15
//;IIC_SCK4  PI3
//;IIC_SCK5  PI1#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <poll.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>#define SUNXI_PA_BASE    0
#define SUNXI_PB_BASE   32
#define SUNXI_PC_BASE   64
#define SUNXI_PD_BASE   96
#define SUNXI_PE_BASE   128
#define SUNXI_PF_BASE   160
#define SUNXI_PG_BASE   192
#define SUNXI_PH_BASE   224
#define SUNXI_PI_BASE   256
#define SUNXI_PJ_BASE   288
#define SUNXI_PK_BASE   320
#define SUNXI_PL_BASE   352
#define SUNXI_PM_BASE   384
#define SUNXI_PN_BASE   416
#define SUNXI_PO_BASE   448
#define AXP_PIN_BASE    1024
/* sunxi gpio name space */
#define GPIOA(n)    (SUNXI_PA_BASE + (n))
#define GPIOB(n)    (SUNXI_PB_BASE + (n))
#define GPIOC(n)    (SUNXI_PC_BASE + (n))
#define GPIOD(n)    (SUNXI_PD_BASE + (n))
#define GPIOE(n)    (SUNXI_PE_BASE + (n))
#define GPIOF(n)    (SUNXI_PF_BASE + (n))
#define GPIOG(n)    (SUNXI_PG_BASE + (n))
#define GPIOH(n)    (SUNXI_PH_BASE + (n))
#define GPIOI(n)    (SUNXI_PI_BASE + (n))
#define GPIOJ(n)    (SUNXI_PJ_BASE + (n))
#define GPIOK(n)    (SUNXI_PK_BASE + (n))
#define GPIOL(n)    (SUNXI_PL_BASE + (n))
#define GPIOM(n)    (SUNXI_PM_BASE + (n))
#define GPION(n)    (SUNXI_PN_BASE + (n))
#define GPIOO(n)    (SUNXI_PO_BASE + (n))
#define GPIO_AXP(n) (AXP_PIN_BASE  + (n))#define HX711_SDA1_IN() get_gpio_value(GPIOG(0))
#define HX711_SDA2_IN() get_gpio_value(GPIOG(3))
#define HX711_SDA3_IN() get_gpio_value(GPIOG(5))
#define HX711_SDA4_IN() get_gpio_value(GPIOI(2))
#define HX711_SDA5_IN() get_gpio_value(GPIOI(0))#define HX711_SDA1_H()     set_gpio_value(GPIOG(0),"1")
#define HX711_SDA1_L()     set_gpio_value(GPIOG(0),"0")
#define HX711_SCL1_H()     set_gpio_value(GPIOG(2),"1")
#define HX711_SCL1_L()     set_gpio_value(GPIOG(2),"0")#define HX711_SDA2_H()     set_gpio_value(GPIOG(3),"1")
#define HX711_SDA2_L()     set_gpio_value(GPIOG(3),"0")
#define HX711_SCL2_H()     set_gpio_value(GPIOG(4),"1")
#define HX711_SCL2_L()     set_gpio_value(GPIOG(4),"0")#define HX711_SDA3_H()     set_gpio_value(GPIOG(5),"1")
#define HX711_SDA3_L()     set_gpio_value(GPIOG(5),"0")
#define HX711_SCL3_H()     set_gpio_value(GPIOI(15),"1")
#define HX711_SCL3_L()     set_gpio_value(GPIOI(15),"0")#define HX711_SDA4_H()     set_gpio_value(GPIOI(2),"1")
#define HX711_SDA4_L()     set_gpio_value(GPIOI(2),"0")
#define HX711_SCL4_H()     set_gpio_value(GPIOI(3),"1")
#define HX711_SCL4_L()     set_gpio_value(GPIOI(3),"0")#define HX711_SDA5_H()     set_gpio_value(GPIOI(0),"1")
#define HX711_SDA5_L()     set_gpio_value(GPIOI(0),"0")
#define HX711_SCL5_H()     set_gpio_value(GPIOI(1),"1")
#define HX711_SCL5_L()     set_gpio_value(GPIOI(1),"0")long long times=0;
void sysUsecTime();
//创建gpio文件
void init_gpio_export(int n)
{FILE * fp =fopen("/sys/class/gpio/export","w");if (fp == NULL)perror("export open filed");elsefprintf(fp,"%d",n);fclose(fp);
}
//设置gpio的模式 输入/输出 in/out
void set_gpio_direction(int n,const char *direction)
{char path[100] = {0};sprintf(path,"/sys/class/gpio/gpio%d/direction",n);FILE * fp =fopen(path,"w");if (fp == NULL)perror("direction open filed");elsefprintf(fp,"%s",direction);fclose(fp);
}
//获取gpio(n)的数值 0/1
int get_gpio_value(int n)
{char path[64];char value_str[3];int fd;snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", n);fd = open(path, O_RDONLY);if (fd < 0) {perror("Failed to open gpio value for reading!");return -1;}if (read(fd, value_str, 3) < 0) {perror("Failed to read value!");return -1;}close(fd);return (atoi(value_str));
}
//输出gpio(n)的数值 0/1  (方式一)
void set_gpio_value(int n,const char *value)
{char path[50];//char value_str[3];int fd;snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", n);fd = open(path, O_WRONLY);//snprintf(value_str, sizeof(value_str), "%d", value);write(fd, value, 1);close(fd);
}
//输出gpio(n)的数值 0/1  (方式二)
int set_gpio_value1(int gpio, int value)
{FILE *p = NULL;char gpio_value_path[50];sprintf(gpio_value_path, "/sys/class/gpio/gpio%d/value", gpio);p = fopen(gpio_value_path, "w");fprintf(p, "%d", value);fclose(p);return 0;
}
//IO初始化函数
void IOinit(void)
{init_gpio_export(GPIOG(0));//HX711_SDA1set_gpio_direction(GPIOG(0),"in");init_gpio_export(GPIOG(3));//HX711_SDA2set_gpio_direction(GPIOG(3),"in");init_gpio_export(GPIOG(5));//HX711_SDA3set_gpio_direction(GPIOG(5),"in");init_gpio_export(GPIOI(2));//HX711_SDA4set_gpio_direction(GPIOI(2),"in");init_gpio_export(GPIOI(0));//HX711_SDA5set_gpio_direction(GPIOI(0),"in");init_gpio_export(GPIOG(2));//HX711_SCL1set_gpio_direction(GPIOG(2),"out");init_gpio_export(GPIOG(4));//HX711_SCL2set_gpio_direction(GPIOG(4),"out");init_gpio_export(GPIOI(15));//HX711_SCL3set_gpio_direction(GPIOI(15),"out");init_gpio_export(GPIOI(3));//HX711_SCL4set_gpio_direction(GPIOI(3),"out");init_gpio_export(GPIOI(1));//HX711_SCL5set_gpio_direction(GPIOI(1),"out");
}
//IO释放函数
void IOreleaset(void)
{}
void IO_In_test(void)
{printf("\r\n");printf("HX711_SDA1_IN=%d\r\n",HX711_SDA1_IN());printf("HX711_SDA2_IN=%d\r\n",HX711_SDA2_IN());printf("HX711_SDA3_IN=%d\r\n",HX711_SDA3_IN());printf("HX711_SDA4_IN=%d\r\n",HX711_SDA4_IN());printf("HX711_SDA5_IN=%d\r\n",HX711_SDA5_IN());}
void IO_out_test(void)
{HX711_SDA1_H();HX711_SCL1_H();HX711_SDA2_H();HX711_SCL2_H();HX711_SDA3_H();HX711_SCL3_H();HX711_SDA4_H();HX711_SCL4_H();HX711_SDA5_H();HX711_SCL5_H();
}unsigned long HX711_Read(void)  //读取711读到的数据
{ unsigned long val; unsigned char i; HX711_SDA1_H(); usleep(5); HX711_SCL1_L(); val = 0;while(HX711_SDA1_IN()); usleep(1); for(i=0;i<24;i++){ HX711_SCL1_H(); val=val<<1; usleep(1);  HX711_SCL1_L(); if(HX711_SDA1_IN()) val++; usleep(1); } HX711_SCL1_H(); val = val^0x800000; usleep(5); HX711_SCL1_L(); usleep(1); return val;
}
double hx711_buffer=0;//定义hx711_buffer来接受hx711read读取的信息
double weight_maopi=0;//毛皮重量
double weight_shiwu=0;//实物重量
double Get_Maopi(void){hx711_buffer=HX711_Read();weight_maopi=hx711_buffer;return weight_maopi;
}
double Get_Weight(void)
{hx711_buffer=HX711_Read();weight_shiwu=hx711_buffer-weight_maopi;weight_shiwu=weight_shiwu/100;weight_shiwu=(unsigned int)((float)weight_shiwu/4.30+0.05);//每一个传感器需要矫正4.30这个除数。当发现测试出来的重量偏大时,增加该数值。如果测试出来的重量偏小时,减小改数值.该数值一般在4.0-5.0之间。因传感器线性斜率不同而定。
//      if(hx711_buffer>weight_maopi)
//              weight_shiwu=hx711_buffer-weight_maopi;return weight_shiwu;
}
int main()
{double maopi,shiwu;sysUsecTime();IOinit();maopi=Get_Maopi();printf("maopi = %.4fg\r\n",maopi);times=0;while(1){usleep(1000000);shiwu=Get_Weight();printf("shiwu = %.4fg\r\n",shiwu);//输出实物重量并保留两位小数   }return 0;}
void sysUsecTime()
{ struct timeval    tv; struct timezone tz; struct tm         *p; gettimeofday(&tv, &tz); //printf("tv_sec:%ld\n",tv.tv_sec); //printf("tv_usec:%ld\n",tv.tv_usec); //printf("tz_minuteswest:%d\n",tz.tz_minuteswest); //printf("tz_dsttime:%d\n",tz.tz_dsttime); p = localtime(&tv.tv_sec); printf("time_now:%d-%d-%d %d:%d:%d.%ld\n", 1900+p->tm_year, 1+p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, tv.tv_usec);
} 

四、结语

A40i使用笔记:文件IO驱动方式(慢)(无法应用于大部分ic)相关推荐

  1. A40i使用笔记:编译驱动到内核中调用(ubuntu和A40i平台)

    一.前言 最近因个人需求和工作需求,准备入坑linux驱动篇,学习了几节课程,简单了解了linux驱动流程,本章前期现介绍开发linux驱动必备的工具,否则后续学习很困难 二.环境 notepadqq ...

  2. TX2 用文件IO的方式操作GPIO

    概述 通过 sysfs 方式控制 GPIO,先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO 编号,使得该 GPIO 的操作接口从内核空间暴露到用户空间,GPIO 的 ...

  3. Linux学习笔记——文件IO

    文章目录 前言 C语言操作文件的函数 系统接口 文件描述符 文件系统 动态库和静态库 前言   在系统角度理解文件:文件=内容+属性,内容和属性都是数据,对于文件的所有操作无外乎对于文件内容操作和对于 ...

  4. 嵌入式Linux基础学习笔记-文件IO编程-文件锁(1)

    文件锁-文件共享 共享资源竞争问题的解决方法:文件锁. 文件锁包括 建议性锁 要求每个上锁文件的进程都要检查是否有锁存在,并且尊重 已有的锁 强制性锁 由内核执行的锁,当一个文件被上锁进行写入操作的时 ...

  5. 嵌入式Linux基础学习笔记-文件IO编程-I/O多路复用

    实验内容:多路复用-I/O操作及阻塞 编程实现文件描述符集合的监听 multiplex_poll.c文件编写: /* multiplex_poll.c */ #include <fcntl.h& ...

  6. 嵌入式Linux基础学习笔记-文件IO编程-文件锁(2)

    文件操作仿真FIFO,实现生产者-消费者运行模型 编程实现生产者程序producer.c,创建仿真FIFO结构文件(普通文件),按照给定的时间间隔向FIFO文件写入自动生成的字符(自定义),生产周期及 ...

  7. A40i使用笔记:GPIO操作方式(用于测试设备io驱动性能)(传统方式、设备树方式、寄存器方式操作GPIO)

    一.前言 前文介绍了文件io的驱动方式,可以用于led点灯灭灯或者一些简单的不需求时序控制的ic操作,但是用于功能类ic,如AD采集芯片等时序控制需求高的,就不行了,这时候就需求高速io去实现指定的芯 ...

  8. Linux文件IO深入剖析

    文章目录 1 linux文件系统基本概念 1.1 文件系统基本概念 1.2 文件系统缓存 2 文件IO访问方式概述 2.1 标准文件IO 2.2 直接IO 2.3 缓存同步 1 linux文件系统基本 ...

  9. Linux系统笔记:shell命令、文件系统、Vi编辑器、文件IO、mmap()、bmp图片格式、线程

    文章目录 一.shell命令集 二.ubuntu文件系统 三.vi编辑器 四.文件IO 五.Linux中C库mmap()函数详解 六.bmp图片格式详解 七.C语言笔记 (一)标准IO函数 time( ...

最新文章

  1. Google、高通都在研究的芯片架构,是他们对抗ARM的武器
  2. extern quot;Cquot; 的含义:实现C++与C及其他语言的混合编程
  3. python求向量与x轴的夹角_2020届石家庄高考模拟题,参数方程解决向量问题
  4. springSecurity源码分析——DelegatingFilterProxy类的作用
  5. Spring三种对象创建方式
  6. linux内核更新 2.6.38,Linux内核 2.6.38版本预计到四月初完成
  7. 【BZOJ2539】【codevs1221】丘比特的烦恼,trie树+几何判断+费用流
  8. 最硬核交通信号灯上线:专治老司机们的这个“臭毛病”!
  9. javascript中object的运算符操作使用
  10. sql server 2000里ldf损坏,只有mdf的恢复
  11. intel 傲腾内存与SSD HDD的对比
  12. ros系统能用c语言编程,ROS操作系统学习(十一)参数的使用与编程方法
  13. html实现文字在表格上方左侧,html,表格,左对齐.doc
  14. 战略设计部分:业务领域定义
  15. java正则表达式控制半角字符串输入
  16. 微软远程桌面0x104_如何处理WIN10上的远程桌面错误0x104教程
  17. 分别用雅可比(Jacobi)迭代法和高斯—塞德尔(Gauss—Seidel)迭代法求解线性方程组
  18. Java“中文”编程-java为什么可以使用中文标识符
  19. freeswitch1.10.7 安装部署排坑
  20. Java中的对象类型像引用还是指针,谁是谁非?

热门文章

  1. 人的谋算关系他的成功
  2. 路由跟踪命令的用法和技巧
  3. 产品推荐 | 还在自研?快来解锁拍乐云互动白板
  4. 《最简单的图形与最复杂的信息》读书浅悟
  5. 清空VS2008最近项目列表
  6. 华为鸿蒙概念机990,华为屏下摄像头概念新机:麒麟990+双模5G,还有望搭载鸿蒙OS系统...
  7. 跨境电商中选择商品规格的示例
  8. EGE入门小游戏:字母游戏
  9. 2022年全国大学生广告创意大赛
  10. oracle怎么测试包,Oracle内置IO测试包dbms_resource_manager.CALIBRATE_IO