当前位置: 首页 > news >正文

做垃圾网站百度云服务器官网

做垃圾网站,百度云服务器官网,杭州建站程序,王也头像图片收藏作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,BSP开发
作者主页:一个平凡而乐于分享的小比特的个人主页
文章收录专栏:IMX8MP,本专栏记录imx8mp开发板,学习开发过程中的问题及解决方法记录
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

MS1112驱动开发

ms1112驱动代码及测试程序在ms1112驱动,如有需要自行下载

1.不带sysfs

1.1 时序图

根据MS1112数据芯片手册的写时序和读时序,编写MS1112驱动

在这里插入图片描述

在这里插入图片描述

1.2 驱动函数

写函数:


/** @description	: 向ms1112多个寄存器写入数据* @param - dev:  ms1112设备* @param - reg:  要写入的寄存器首地址* @param - buf:  要写入的数据缓冲区* @param - len:  要写入的数据长度* @return 	  :   操作结果*/
static s32 ms1112_write_regs(struct ms1112_dev *dev, u8 reg, u8 *buf, u8 len)
{u8 b[256];int ret;struct i2c_msg msg;struct i2c_client *client = (struct i2c_client *)dev->private_data;printk("write I2C device address: 0x%x\n", client->addr);memcpy(&b[0],buf,len);		/* 将要写入的数据拷贝到数组b里面 */msg.addr = client->addr;	/* ms1112地址 */msg.flags = 0;				/* 标记为写数据 */msg.buf = b;				/* 要写入的数据缓冲区 */msg.len = len;			/* 要写入的数据长度 */ret = i2c_transfer(client->adapter, &msg, 1);printk("write:%d\n",ret);if(ret == 1) {ret = 0;} else {ret = -EREMOTEIO;}return ret;
}

读函数:

/** @description	: 从ms1112读取多个寄存器数据* @param - dev:  ms1112设备* @param - reg:  要读取的寄存器首地址* @param - val:  读取到的数据* @param - len:  要读取的数据长度* @return 		: 操作结果*/
static int ms1112_read_regs(struct ms1112_dev *dev, u8 reg, void *val, u8 len)
{int ret;struct i2c_msg msg[1];struct i2c_client *client = (struct i2c_client *)dev->private_data;/* msg[1]读取数据 */msg[0].addr = client->addr;			/* ms1112地址 */msg[0].flags = I2C_M_RD;			/* 标记为读取数据*/msg[0].buf = val;					/* 读取数据缓冲区 */msg[0].len = len;					/* 要读取的数据长度*/ret = i2c_transfer(client->adapter, msg, 1);printk("read:%d\n",ret);if(ret == 1) {ret = 0;} else {ret = -EREMOTEIO;}return ret;
}

1.3 运行测试

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

会看到加载ms1112.ko驱动后,会在/dev/目录下生成ms1112设备,我们用应用程序对/dev/ms1112设备进行操作,读取电压值与测得的电压值相差不大

2.不带sysfs

不带sysfs和带sysfs的ms1112驱动大体相似,只需稍作修改

2.1 修改部分

主要修改如下:

static int ms1112_probe(struct i2c_client *client, const struct i2c_device_id *id)
{int rv=0;...../* 5、创建sysfs文件初始化*/if(device_create_file(ms1112dev.device,&dev_attr_ms1112)){rv=-ENOMEM;goto undo_device;}printk("%s deiver init sysfs successfully!\n",MS1112_NAME);/* 6、保存私有数据*/ms1112dev.private_data = client;dev_set_drvdata(ms1112dev.device,&ms1112dev);
.....
}static ssize_t ms1112_show(struct device *dev, struct device_attribute *attr, char *buf)
{struct ms1112_dev *ms_dev = (struct ms1112_dev *)dev_get_drvdata(dev);ms1112_write_reg(&ms1112dev, MS1112_CFG_REG, MS1112_DEFAULT_CONFIG);ms1112_readdata(ms_dev);printk("dev->value: %d\n", ms_dev->value);return sprintf(buf, "adc=%d\n", ms_dev->value);
}static ssize_t ms1112_store(struct device *dev,struct device_attribute *attr,const char *buf,size_t count)
{return count;
}DEVICE_ATTR(ms1112,0644,ms1112_show,ms1112_store);

2.2 运行测试

在这里插入图片描述
在这里插入图片描述

测得电压与通过adc采样值算出的电压相近

3.遇到问题及解决方法

3.1驱动程序读出的adc值与测试程序不符

驱动读adc值函数:
在这里插入图片描述

测试程序:
在这里插入图片描述

运行结果:
在这里插入图片描述

然后我用逻辑分析仪抓波形,发现驱动程序没问题,是测试程序的问题
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

int16_t类型的数据不应该超过32767啊

问题解决

是我驱动程序写的不规范,导致的,具体原因:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

驱动程序的读adc函数,返回的是0,并没有对错误做处理,导致测试程序read()函数返回0,直接执行,这是不符合系统调用read函数规范的

我做了如下修改:
在这里插入图片描述
在这里插入图片描述

最终,测试程序的adc值与驱动相符。

http://www.dt0577.cn/news/49922.html

相关文章:

  • 网站代码免费复制国内最近发生的重大新闻
  • 网站制作宜昌怎么做?苏州百度快照优化排名
  • 营销网站找什么公司做semen
  • c#做网站谷歌推广哪家好
  • php企业网站 源码成都计算机培训机构排名前十
  • 做一个网站前端页面多少钱下载百度app最新版并安装
  • 聊城 网站制作免费推广的网站
  • 宜昌市住房和城乡建设委员会网站浏览器下载大全
  • 医疗网站建设资讯推特最新消息今天
  • 有没有做相册的网站今日头条新闻最新
  • 建筑设计参考网站怎样免费给自己的公司做网站
  • 帝国做的网站怎么上传图片教你免费申请个人网站
  • 企业网站不被百度收录网络事件营销
  • 简单的网站设计图自助建站系统哪个好用
  • 手机网站端域名怎样做解析最新国际要闻
  • 做家常菜的网站哪个好加快百度收录的方法
  • 软件下载网站源码搜索引擎谷歌
  • 长泰建设局网站学校招生网络营销方案
  • 西安做网站收费价格好看的seo网站
  • 网站建设的合同书免费python在线网站
  • 怎么做时光网站查询网官网
  • 绵阳哪个网站做外卖做的好热门关键词
  • 谷歌sem服务商汕头seo网站推广
  • dw做的网站链接不会跳转网店推广方案策划书
  • 建设网站源码精准推广引流5000客源
  • wordpress页面加载慢seo和网络推广有什么区别
  • 沈阳做网站百度图片识别在线使用
  • 泰安最新通知今天百家号seo
  • 检查网站的跳转路径是否清晰 哪里要优化最好用的搜索神器
  • 织梦网站地图怎么做网络软文推广案例