I2C client 挂到 adapter之后,就可以通过I2C 读写命令开始 读写设备寄存器了。
读写的时候,都可以用示波器量出来I2C CLK 和I2C data信号的,甚至可以读出 data信号上的,传输的设备地址和数据。
有趣的是,开始的时候,把示波器信号周期调的比较大,比如500ms,这时候,测量音频Codec I2C总线上信号,居然量不到信号,而点触摸屏的时候就可以测到I2C 总线上有数据波动。(好多设备都是连载同一条I2C总线上的)。 后来才发现原来的把示波器周期调小到us级,改用触发方式,就可以捕捉到I2C设备上的信号了。
具体做法,可以添加以下代码,生成sys/class/i2c-adapter/* 下面的节点reg和val 。
reg --- 要读写的 I2C 设备寄存器地址
val --- reg里面的值
复制代码
下面这些在初始化中添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43static unsigned long sys_reg; static ssize_t sys_reg_show(struct device *dev, struct device_attribute * attr,char * buf) { printk(" reg show : sys_reg = %dn", sys_reg); return snprintf(buf,PAGE_SIZE, "%x", (u32)sys_reg); } static ssize_t sys_reg_store(struct device *dev, struct device_attribute *attr, const char * buf,size_t size) { strict_strtoul(buf, 16, &sys_reg); printk(" reg store : sys_reg = %dn", sys_reg); return size; } static ssize_t sys_val_show(struct device *dev, struct device_attribute *attr, char *buf) { unsigned char val; // struct i2c_client *client; val = 0; // client = container_of(dev, struct i2c_client, dev); val = lc1120_i2c_read(sys_reg); printk(" sys_val_show : val = %dn", val); return snprintf(buf, PAGE_SIZE, "%x", val); } static ssize_t sys_val_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { unsigned long val = 0; printk(" sys_val_store : before : buf = %sn", buf); if (strict_strtoul(buf, 16, &val) == 0) { // struct i2c_client *client; // client = container_of(dev, struct i2c_client, dev); printk(" sys_val_store : sys_reg = %dn", sys_reg); printk(" sys_val_store : before :val = %dn", val); lc1120_i2c_write(val, sys_reg); } printk(" sys_val_store : after :val = %dn", val); return size; } static DEVICE_ATTR(reg, S_IRUGO | S_IWUGO, sys_reg_show, sys_reg_store); static DEVICE_ATTR(val, S_IRUGO | S_IWUGO, sys_val_show, sys_val_store);
- 复制代码这样,读写reg 就是选定设备寄存器地址,1
2
3
4if (device_create_file(&client->dev, &dev_attr_reg)) printk(KERN_ERR "%s create sysfs reg failedn", __func__); if (device_create_file(&client->dev, &dev_attr_val)) printk(KERN_ERR "%s create sysfs val failedn", __func__);
读写val,就是进行I2C读写操作,可以产生波形了。
最后
以上就是勤劳天空最近收集整理的关于用示波器量I2C 信号的全部内容,更多相关用示波器量I2C内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复