主题:[求助] 阻塞式读取SPI和I2c 共有102075人关注过本帖 |
---|
![]() barrypp |
1楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
[求助] 阻塞式读取SPI和I2c ![]() 请问, 针对ESM3354 Linux环境,有没有阻塞式读取SPI、I2C数据的方法。类似串口上的阻塞式读取。 |
单帖管理 | 引用 | 回复 ![]() |
![]() lgz |
2楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
你好,因为spi和i2c都是主从设备的模式,你在应用程序里面进行读写,3354上的spi和i2c都会马上进行数据读写,读写完设置的数据或者是检测到总线错误后才会返回,这两种总线的阻塞非阻塞读写没有意义,函数返回的时候肯定是完成了读写或者总线出错(i2c有应答信号检测),而且作为主设备会控制时钟信号,不会出现串口那种没有预期的等待数据的状态。你所说的阻塞读取是想实现什么
|
单帖管理 | 引用 | 回复 ![]() |
barrypp |
3楼 |
![]() |
![]()
如果当前从设备没有发送数据,而我在linux里调用读取函数,那这个函数是立即返回还是等待?
|
单帖管理 | 引用 | 回复 ![]() |
![]() lgz |
4楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
这两个总线都是有时钟信号同步的,3354上的作为主设备生成时钟信号并且只在时钟信号上进行采样,这个过程与从设备是否发送数据无关,对于i2c拉低时钟信号的情况,会等到所有数据接收完成后函数才会返回
[此贴子已经被作者于2016-11-28 17:33:24编辑过]
|
单帖管理 | 引用 | 回复 ![]() |
![]() barrypp |
5楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
在多线程中,读写操作可以同时进行么?
另外,如何设置i2c的时钟频率
|
单帖管理 | 引用 | 回复 ![]() |
![]() lgz |
6楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
你好,多线程中请做好线程的同步互斥管理,不要同时读写
i2c驱动没有引出时钟频率设置函数,i2c设备只分标准模式和高速模式,我们现在的配置是高速模式,如果你的设备支持高速模式那就是可以进行通信的,高速模式应该是兼容标准模式的,如果你的设备是标准模式的设备并且没法和我们主板通信,我们可以给你配置成工作于标准模式的
|
单帖管理 | 引用 | 回复 ![]() |
![]() barrypp |
7楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
明天我试试吧,那个设备最高只支持15khz时钟,并且它似乎没有寄存器地址这个概念,不知道能不能通信
另外linux核心板能作为从设备么?
|
单帖管理 | 引用 | 回复 ![]() |
![]() hzc |
8楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
你好,i2c只有两种传输速度,标准的是100Kbps,快速模式为400Kbps。默认使用的是快速模式。
核心板的I2C只能做为主控端。
|
单帖管理 | 引用 | 回复 ![]() |
![]() barrypp |
9楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
试了试,不行。老是返回remote io error
因此,要如何修改i2c时钟速率
[此贴子已经被作者于2016-11-29 12:22:53编辑过]
|
单帖管理 | 引用 | 回复 ![]() |
![]() lgz |
10楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
你好,请先确定你的设备的i2c地址,如果地址不对,i2c设备是不会返回应答信号的,应用程序就会返回remote io error了
|
单帖管理 | 引用 | 回复 ![]() |
![]() barrypp |
11楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
设备说明书里写的是0x80,这个数值可以直接赋值给i2c_msg结构体中的addr吧
|
单帖管理 | 引用 | 回复 ![]() |
![]() lgz |
12楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
是的,应用程序可以参考我们光盘中的I2C扩展模块的应用,另外不要操作I2C复用的GPIO(26、27)
|
单帖管理 | 引用 | 回复 ![]() |
![]() barrypp |
13楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
那个示例程序已经看过了。
关键是如何改时钟频率?是简单的设置个参数就可以了,还是需要重刷固件?
|
单帖管理 | 引用 | 回复 ![]() |
![]() lgz |
14楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
要重新烧写固件,我一会邮件发给你
|
单帖管理 | 引用 | 回复 ![]() |
![]() barrypp |
15楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
如果要重刷固件的话,那我还是先试试spi算了,那个外设倒也支持spi
|
单帖管理 | 引用 | 回复 ![]() |
![]() lgz |
16楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
好的,spi可以设置时钟频率,esm3354最高为48MHz
|
单帖管理 | 引用 | 回复 ![]() |
![]() barrypp |
17楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
esm3354最大支持多少个中断呢?
|
单帖管理 | 引用 | 回复 ![]() |
![]() lgz |
18楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
2个外部中断,可以查看dev文件夹下面的设备节点
|
单帖管理 | 引用 | 回复 ![]() |
![]() barrypp |
19楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
如果要增加外部中断的数量的话,有哪些办法呢?
|
单帖管理 | 引用 | 回复 ![]() |
![]() hzc |
20楼 信息 | 搜索 | 邮箱 |
![]() ![]() ![]() ![]() |
![]()
你好,标准的板卡只支持两路外部中断,请问需要多路中断来实现什么功能呢?
|
单帖管理 | 引用 | 回复 ![]() |