炬芯(Actions)BLE ATB110X I2C驱动程序

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;
}



 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论