为了设定或是使用I2C需要使用pid_ioctl函数。 I2C支持的pid_ioctl函数的命令目录如下。
命令 | 下级命令 | 说明 | |
---|---|---|---|
set | mode | sm | set data rate: standard - 100 Kbps |
fm | set data rate: fast - 400 Kbps | ||
daddr | [A] | set address: local device address | |
saddr | [A] | set address: slave device address | |
get | rxlen | get the number of pending bytes in receive buffer | |
txlen | get the number of pending bytes in send buffer | ||
error | nack | get the number of NACK in the last transaction | |
bus | get the number of bus error in the last transaction | ||
state | 0 - idle, etc. - I2C internal operation | ||
req | read | [N] | request to read |
write | - | request to write | |
wait | request to write and wait ("req stop" is required) | ||
stop | request to stop writing data ("req wait" is required) | ||
reset | request to reset bus |
I2C通过利用"set"命令来设定通信模式与slave设备地址。
支持PHPoC的I2C标准模式与高速模式,基本默认值是标准模式。
区分 | 语法 |
---|---|
standard | pid_ioctl($pid, "set mode sm"); |
fast | pid_ioctl($pid, "set mode fm"); |
I2C在选择要传送数据的slave时利用slave设备的地址。slave设备地址可如下进行设定。
类型 | 语法 |
---|---|
slave device address | pid_ioctl($pid, "set saddr [A]"); |
local device address | pid_ioctl($pid, "set daddr [A]"); |
设备地址[A]需要以16进制2位型态输入。PHPoC的I2C使用7字节地址指定方式,LSB一直是0。几个已预定的地址无法使用,请参考。 如果使用此地址将在PHPoC发生错误。
地址 (Binary) | 例(Hexa) | 备注 | |||||||
---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
X | X | X | X | X | X | X | 1 | E1, A3, 1B | LSB is 1 |
0 | 0 | 0 | 0 | X | X | X | X | 00 ~ 0F | All of 4 Upper bits are 0 |
1 | 1 | 1 | 1 | X | X | X | X | F0 ~ FF | All of 4 Upper bits are 1 |
I2C利用"get"命令确认各种状态信息。
在I2C可以如下确认发送或是接收缓冲区字节数。
区分 | 语法 |
---|---|
Send buffer | pid_ioctl($pid, "get txlen"); |
Receive buffer | pid_ioctl($pid, "get rxlen"); |
在I2C可确认最后交易的NACK或是总线错误次数。
区分 | 语法 |
---|---|
NACK | pid_ioctl($pid, "get error nack"); |
bus Error | pid_ioctl($pid, "get error bus"); |
可如下确认I2C的状态。在空闲状态时返还0,不是空闲状态时返还不是0的值。
区分 | 语法 |
---|---|
State | pid_ioctl($pid, "get state"); |
是I2C master命令向slave发送读取数据的邀请。在执行此命令后slave的应答数据正常在缓冲区接收时,通过pid_read函数可读取该内容。
区分 | 语法 |
---|---|
Request to Read Data | pid_ioctl($pid, "req read [N]"); |
在上面语法中[N]指要读取的数据的字节数。
I2C master命令利用slave传送读取数据邀请的命令。读写邀请如下有两种方法。
区分 | 语法 |
---|---|
Request to Write Data | pid_ioctl($pid, "req write"); |
Request to Write Data and Wait | pid_ioctl($pid, "req write wait"); |
Stop Writing Data | pid_ioctl($pid, "req stop"); |
当执行"req write"命令即发送数据。因此执行命令前必须将要发送的数据保存在缓冲区。相反"req write wait"命令将总线状态做为传送开始条件并执行"req stop"命令前不制作终止条件。 因此,在实行"req stop"命令前利用pid_write函数可技术发送数据。
因总线故障等问题通信不顺畅时,可通过此命令将I2C通信初始化。
命令 | 语法 |
---|---|
Request to Request Bus | pid_ioctl($pid, "req reset"); |