I2C 总线
I2C 总线是由 Philips 在 1982 年提出的通用串行传输协议。常用来连接一些低速外设, 比如 E2PROM、传感器等。传输时钟频率速度一般在 100K ~ 400KHz。I2C 总线支持多 slave 连接,每个设备都要有唯一的地址。
I2C 总线工作模式是半双工,主机每发送一个 byte,从机在第 9 个 cycle 要拉低一下 SDA 线,回应一个 ACK。如果没有回应主机就认为从机通信有问题。只有主机发送的 最后一个 byte,丛机可以不回应 ACK。
I2C 控制器
ATB110X 带有两路独立的 I2C 总线控制器:
- 支持 master 和 slave 两种模式
- 支持 100KHz 和 400KHz 两种时钟速率。
- 只支持 7bit 设备地址
- 内建 15K 上拉电阻
- 8 层 RX FIFO 和 8 层 TXFIFO
驱动接口说明
下面介绍一下 I2C 的具体接口和参数说明 Public APIs for the I2C drivers
Defines
I2C_SPEED_STANDARD
I2C Standard Speed
I2C_SPEED_FAST
I2C Fast Speed
I2C_SPEED_FAST_PLUS
I2C Fast Plus Speed
I2C_SPEED_HIGH
I2C High Speed
I2C_SPEED_ULTRA
I2C Ultra Fast Speed
I2C_ADDR_10_BITS
Use 10-bit addressing.
I2C_MODE_MASTER
Controller to act as Master.
I2C_MSG_WRITE
Write message to I2C bus.
I2C_MSG_READ
Read message from I2C bus.
I2C_MSG_STOP
Send STOP after this message.
I2C_MSG_RESTART
RESTART I2C transaction for this message.
I2C_DECLARE_CLIENT_CONFIG
I2C_CLIENT(_master, _addr)
I2C_GET_MASTER(_conf)
I2C_GET_ADDR(_conf)
......
驱动使用示例
下面以一个通过 I2C 接口读写 E2PROM 示例来介绍 I2C 接口的具体使用。
#include
#define E2PROM_I2C_MASTER_NAME CONFIG_I2C_0_NAME
#define E2PROM_I2C_ADDRESS 0x50
static const union dev_config i2c_cfg = {
.raw = 0,
.bits = {
.use_10_bit_addr = 0,
.is_master_device = 1,
.speed = I2C_SPEED_STANDARD,
},
};
int i2c_e2prom_test(void)
{
struct device *dev;
int err;
u16_t offset;
u8_t wdata,rdata;
dev = device_get_binding(E2PROM_I2C_MASTER_NAME);
if (!dev) {
printk("Cannot get I2C device");
return -ENODEV;
}
err = i2c_configure(dev, i2c_cfg.raw);
if (err) {
printk("I2C config failed"); return -EIO;
}
offset = 0; wdata = 0x55; rdata = 0x0; /* write a byte to E2PROM */
err = i2c_burst_write16(dev, E2PROM_I2C_ADDRESS, offset, ,→&wdata, 1);
if (err) {
return -EIO;
} /* waiting for writing to complete */
k_sleep(10); /* read a byte from E2PROM */
err = i2c_burst_read16(dev, E2PROM_I2C_ADDRESS, offset, & ,→rdata, 1);
if (err)
{
return -EIO;
}
if (rdata != rdata)
{
printk("E2PROM Data compare error\n");
return -EIO;
}
printk("E2PROM test pass!"); return 0;
}
评论