嵌入式单片机应用开发--I2C开发实践

IIC驱动的实现简介

 IIC驱动可以有两种方法实现

  • 阻塞式(等待型)
  • 非阻塞式(中断型)

阻塞型驱动

 需要打开:

  • I2C外设中断开关

 一般包含以下函数接口:

  • 初始I2C外设:void i2c_init(void);
  • 去初始I2C外设:void i2c_uninit(void);
  • I2C开始信号:void i2c_start(void);
  • I2C停止信号:void i2c_stop(void);
  • I2C等待:bool i2c_wait(void);
  • I2C判忙:bool i2c_busy(void);
  • I2C读:void i2c_read(uint8_t addr, uint8_t* data);
  • I2C写:void i2c_write(uint8_t addr, uint8_t* data, uint8_t size);

 在该.c文件下,由于I2C是由中断事件触发的,通过轮询I2C的寄存器标志位并加上超时机制来达到目的(函数:i2c_wait()),每进行一个操作都需要I2C外设做出回应并使用i2c_wait()函数进行等待(阻塞),并应用到读写的各个逻辑条件中。

非阻塞型驱动

 需要打开:

  • I2C外设中断开关
  • 中断向量表上对应的I2C中断开关

 一般包含以下函数接口:

  • 初始I2C外设:void i2c_init(void);
  • 去初始I2C外设:void i2c_uninit(void);
  • I2C中断处理函数:void i2c_interrupt_isr_handler(void)…;
  • I2C中断读:void i2c_inter_read(uint8_t addr, uint8_t* data);
  • I2C中断写:void i2c_inter_write(uint8_t addr, uint8_t* data, uint8_t size);

 在该.c文件下,使用全局变量来标记各个状态,由于I2C是由中断事件触发的,所以这些全局变量的状态是在中断里面改变的,中断中改变的标志可以应用于I2C读写的逻辑条件。

应用

寄存器

 I2C中有三个常用的寄存器(几乎所有的单片机(引脚模拟的不算)中都有,只是名字不一样):

  • 用于读写的数据寄存器:I2CDR
  • 用于控制的寄存器:I2CCR
  • 用于查询状态的寄存器:I2CSTR

写流程:开始信号+地址(7位)+模式(1位)+回应(1位)

读流程:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章